ラベル Wifi の投稿を表示しています。 すべての投稿を表示
ラベル Wifi の投稿を表示しています。 すべての投稿を表示

前回、iPhoneでWifi情報を取得するという記事を書きましたが、記述内容そのままで動作していたものが、iOS4になって以降確認していなかったので、改めて動作確認したところ、取得出来ていないことが判明したため、追記することにしました。

内容はほぼ前回と同じ内容ですが、apple80211Scan()関数を付け加えWifiカードにネットワークのスキャンをさせなければ情報が取得されないようです。
apple80211Scan(エアポートの場所, 情報保存場所, スキャン設定情報)
な感じのパラメータらしいです。

NSDictionary *nsparam
= [NSDictionary dictionaryWithObjectsAndKeys(id)kCFBooleanFalse,CFSTR("SCAN_MERGE"),nil];
CFDictionaryRef parameters = (CFDictionaryRef)nsparam;
apple80211Scan(airportHandle, &networks, parameters);

上記を追記すればiPhone4での動作も確認しました。
ついでにapple80211Close(airportHandle)で閉じます。

iPhone でWifiの情報を取得するにはプライベートAPIを使う必要があります.2.2.1ver.まではApple80211.framework が利用できましたが、3.0ver.からは「MobileWiFi.framework 」に変わっています.
実際に MobileWiFi.framework を指定して動作させてもエラーが起こるようになっています.動作が確認できたのは「WiFiManager.bundle 」を利用するものです.以下にWiFiManagerを呼び出す方法を記述します.

○(動作確認) libHandle = dlopen("/System/Library/SystemConfiguration/WiFiManager.bundle/WiFiManager", RTLD_LAZY);

×(動作不可) libHandle = dlopen("/System/Library/PrivateFrameworks/MobileWiFi.framework/MobileWiFi", RTLD_LAZY);

他の追加物:
*.h
dlfcn.hをインポート
@interface内
NSMutableDictionary *networks; //Key: MAC Address (BSSID)

void *libHandle;
void *airportHandle;
int (*apple80211Open)(void *);
int (*apple80211Bind)(void *, NSString *);
int (*apple80211Close)(void *);
int (*associate)(void *, NSDictionary*, NSString*);
int (*apple80211Scan)(void *, NSArray **, void *);
*.m
 @implementation内
networks = [[NSMutableDictionary alloc] init];

libHandle = dlopen("/System/Library/SystemConfiguration/WiFiManager.bundle/WiFiManager", RTLD_LAZY);

char *error;
if (libHandle == NULL && (error = dlerror()) != NULL) {
NSLog(@"APSearcher: Error %c",error);
exit(1);
}
apple80211Open = dlsym(libHandle, "Apple80211Open");
apple80211Bind = dlsym(libHandle, "Apple80211BindToInterface");
apple80211Close = dlsym(libHandle, "Apple80211Close");
apple80211Scan = dlsym(libHandle, "Apple80211Scan");

apple80211Open(&airportHandle);
apple80211Bind(airportHandle, @"en0");

これで、プロパティのnetworksにNSMutableDictionary型で入っているハズです.
中身は
"00:00:00:00:00:00" = {
AGE = 0;
"AP_MODE" = 2;
"BEACON_INT" = 10;
BSSID = "00:00:00:00:00:00";
CAPABILITIES = 1041;
CHANNEL = 7;
"CHANNEL_FLAGS" = 8;
NOISE = 0;
RATES = (
1,2,5,11,6,12,24,36,9,18,48,54
);
RSSI = -75;
SSID = <000c000d>;
"SSID_STR" = "NETWORK_NAME";
WEP = 1;
};
みたいな感じで入ってます.

注意:Privateframeworkは公式に利用していいAPIではないので、AppStoreで公開出来るかは不明です.(おそらく出来るでしょうが。)