Android 4.0はAdhocモード不可???

最近Androidのすばらしさを実感している、西脇です。

研究でAd-hocモードをとりあげているので、Ad-hocネタが多くなってます^^;

というわけで、本題に

Android 4.0ではAdhoc不可??

今回は二つの端末で検証しました。

Swicth(challenge.device_type){

Case: Galaxy Nexus

そもそも、Galaxy Nexusでは、iwconfigやiwlistなどのwireless toolから ネットワークインターフェースが認識されません。
という訳で、お手上げです。
break;

Case: Nexus7

問題なのは、こいつ。
wireless toolでちゃんとインターフェースが認識されます。

ukinau$ifconfig wlan0 down    
ukinau$iwconfig wlan0 mode Ad-hoc  
SET failed on device wlan0 ; Operation not supported on transport endpoint.     

「Opertation not supported on transport endpoint」かdriverではじかれてるっぽい感じ ってことは、やっぱりdriver入れ替えたりしないといけないってことなんですかね。。。

}

なんでGalaxySとかOptimusChatで、できたの?

Android2.0のWifiの仕組み

もしかしたら、GalaxySとかにwireless-toolを入れてiwconfigとかでAd-hocモードに変更しようとチャレンジした人がいるかもしれない。
でもできなかっただろう。
それはなぜか?
別にDriverにmode変更のoperationが拒否された訳じゃないんです
というのも、Android2.0ではWifiをONにするとdriverが読み込まれて、Wifiのステータスを追っかけるサービスが同時に動いてWifiのステータスをチェックしているのです。
そして、Wifiをオフにするとdriverがunloadされて、Wifiのステータスをチェックするサービスも止まります。
つまり、mode変更の鍵は、Wifiのステータスをチェックするサービスにバレないようにmodeを変更する必要があるのです。

じゃあどうするの?

簡単な話です。

  1. 標準APIからWifiをoffにして、driverをunloadさせる
  2. wifi制御ライブラリを直接呼んでdriverを読み込む
  3. iwconfig mode Ad-hoc こうすると変更できます。 wifi制御ライブラリっていうのは、Android opensourceのlibhardware_legacy/wifi.cとかにあります。

4.0と2.0どこが違うの?

上記の通り、driverでは特にmode変更を阻止するような処理を一切加えてないのが2.0です
mode変更がされてもその度に上書きをしているだけです。
しかし、Android4.0では、driverから直接無理ですと言われていることが分かります。
なので下位レイヤーから変更を加える必要があります。

ただ、少し謎なのがNexus7では、iwconfigからMaster(テザリング)にモード変更しようすると、さっきと同じエラーが出るのに対して、Androidの非公式API(Reflection経由)からテザリングをOnにしてiwconfigでmodeを確認するとMasterに変わってるんですよね・・・・。

なので、wpa_supplicant経由で変更する方法があるのかもしれません。

でもやっぱり、Android4.0でもAdhocやりたい

できません!だけだったらブログは書きません。
ちゃんと、やり方があります。

というのも、完全に拾いもんですが。

Adhocに対応させてるCustom Romを配布しているところを見つけました!! 以下のURLに詳細は書いてあるので、そちらかDLして入れてください。
http://www.thinktube.com/component/content/article/19-technicalinformation/46-android-wifi-ibss

まだ、ちゃんと技術詳細とか読んでないので、今度読もうと思います