それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

0001docomo に複垢でつながらないのをCoreWLANで解決した話

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 フレームワーク

ある日ふと思い立って、MacObjective-C で CoreWLANのAPIでなんとかなるんじゃないか。 networksetup コマンドでもお手上げだったので、802.1x のEnterprise認証を指定するAPIがあるんじゃないか

一縷の望みを託してAPIを読んでみたら、無事接続できたのでメモを残します。

コマンドを作って実行してみたら、Macからは無事に指定のEnterpriseユーザー情報で接続できた これで、無事にMaciPhoneで別のアカウントを使って同時に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;

}

参考資料

https://developer.apple.com/documentation/corewlan