0001docomo につながらない詰み状況を回避する
0001docomo は1アカウント(契約)につき、コネクションを1接続に限定される。
そこで、複数台を接続するには、家族や友人の使ってないWiFiアカウントを強奪したり、もう1つ契約すれば良いのですが。
複垢使い分けできないことがある。
iOS / Mac だと複垢を使い分けできない。
iPhone / iPad / Mac / iPad Pro と複数台でkeychains を共有していると 1台だけが0001docomoのWiFiに接続が可能になる。
もし複数契約を持っていた場合に、iPhone / iPad / Mac / iPad Proで利用するdocomoアカウントを切り分けようとしても、keychainsで共有されているために、使い分けができない。
キーチェーン同期・・・
どれか1台で接続設定をしてしまうと、残りの機器にKeychainsで同期されてしまう。 そして複数アカウントを設定してもすべてが同じKeychainsになってしまう。 結果として、複数アカウントを契約したとしてもキーチェーン共有の問題でアカウントの使い分けが出来なかった。この問題にもう3年以上苦しんでいた。
networksetup コマンドでも無理
networksetup コマンドには、802.1 の Enterprisze がない. 0001docomoは 802.1Xなのでこのコマンドではお手上げだった。
takuya@Desktop$ networksetup -a | grep 8021 103:networksetup -import8021xProfiles <service name> <file path> 104:networksetup -export8021xProfiles <service name> <file path> <yes no> 105:networksetup -export8021xUserProfiles <file path> <yes no> 106:networksetup -export8021xLoginProfiles <service name> <file path> <yes no> 107:networksetup -export8021xSystemProfile <service name> <file path> <yes no> takuya@Desktop$ networksetup -a | grep Enter takuya@Desktop$ networksetup -a | grep airport 53:networksetup -getairportnetwork <device name> 54:networksetup -setairportnetwork <device name> <network> [password] 55:networksetup -getairportpower <device name> 56:networksetup -setairportpower <device name> <on off> takuya@Desktop$
CoreWLAN フレームワーク
ある日ふと思い立って、Mac の Objective-C で CoreWLANのAPIでなんとかなるんじゃないか。 networksetup コマンドでもお手上げだったので、802.1x のEnterprise認証を指定するAPIがあるんじゃないか
一縷の望みを託してAPIを読んでみたら、無事接続できたのでメモを残します。
コマンドを作って実行してみたら、Macからは無事に指定のEnterpriseユーザー情報で接続できた これで、無事にMacとiPhoneで別のアカウントを使って同時に0001docomoを使えるようになった。
しんどい接続についても結構かんたんに解決したし、WiFiがナゼかつながらないっていう問題もなかった。
このコマンドにEnterpriseのパスワードを直書きしているが、まぁそこま置いていて。
サンプルコード
// // main.m // WiFi-testing // // Created by takuya on 20171130. // Copyright © 2017年 takuya. All rights reserved. // #import <Foundation/Foundation.h> #import <CoreWLAN/CoreWLAN.h> int main(int argc, const char * argv[]) { @autoreleasepool { CWWiFiClient *cw = [CWWiFiClient sharedWiFiClient]; CWInterface *ci = cw.interface; [ci setPower:YES error:NULL]; [ci disassociate]; NSSet *set = [ci scanForNetworksWithName:@"0001docomo" error:NULL]; CWNetwork *target; for (CWNetwork *i in set) { long l = i.rssiValue; NSLog(@"rssi=%ld", l); if ( i.rssiValue < target.rssiValue ){ target = i; } } NSLog(@"%@", target); if ( target == NULL ){ NSLog(@"SSID not found."); return 1 ; } NSError *err; BOOL ret = [ci associateToEnterpriseNetwork:target identity:NULL username:@"xxxxx-spmode@docomo" password:@"xxxx" error: &err]; NSLog(@"%s", (ret? "YES":"NO")); if ( ! ret ){ NSLog(@"%@", err); return 1 ; } return 0; }