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;
}