ubuntu 在 R40e 上 還有 Debian 在 Sempron 2600 上

2012年9月11日 星期二

wifi hostspot / hostap channel

Android 的 hotspot 沒有可以設 channel 的地方,找一下..

hotspot 的 daemon 是 /external/hostapd

查了一下有設定 channel 的code。
是啟動時,從 argument 給的 (當然也可以吃 config)。

... 先 JUMP OUT 一下...

在 /system 下找一下 hostap ---- /net/SoftapController.cpp
/* * Arguments: * argv[2] - wlan interface * argv[3] - softap interface * argv[4] - SSID * argv[5] - Security * argv[6] - Key * argv[7] - Channel * argv[8] - Preamble * argv[9] - Max SCB */ int SoftapController::setSoftap(int argc, char *argv[]) {

這個 function 依照 argv[] 寫好 /data/wifi/hostapd.conf,然後用 prop start hostapd。

所以包含設定和啟動。

呼叫這個 function 的是..netd/CommandListener.cpp

int CommandListener::SoftapCmd::runCommand(SocketClient *cli, int argc, char **argv) { ,,,, } else if (!strcmp(argv[1], "set")) { rc = sSoftapCtrl->setSoftap(argc, argv);

簡單來說,就是..如果是 set command,就把所有 argument 包好,交給 setSoftap( )

runCommand( ) 是 CommandListener,是 Android 的一種 Service。

是利用 socket 作 IPC 的 server。
這種 server 用的都是 plain text 。所以找一下 SoftapCmd 的 comand string 是...

CommandListener::SoftapCmd::SoftapCmd() : NetdCommand("softap") { }
所以是 "softap"

之後就是 framework 的 client 端 (呼叫端),找一下 framework...

services/java/com/android/server/NetworkManagementService.java

public void startAccessPoint(WifiConfiguration wifiConfig, String wlanIface, String softapIface) throws IllegalStateException { .... .... else { /** * softap set arg1 arg2 arg3 [arg4 arg5 arg6 arg7 arg8] * argv1 - wlan interface * argv2 - softap interface * argv3 - SSID * argv4 - Security * argv5 - Key * argv6 - Channel * argv7 - Preamble * argv8 - Max SCB */ String str = String.format("softap set " + wlanIface + " " + softapIface + " %s %s %s", convertQuotedString(wifiConfig.SSID), wifiConfig.allowedKeyManagement.get(KeyMgmt.WPA_PSK) ? "wpa2-psk" : "open", convertQuotedString(wifiConfig.preSharedKey)); mConnector.doCommand(str); } mConnector.doCommand(String.format("softap startap"));
這段code就是從 WifiConfig 取出 參數值,包裝成 argv[]傳給 softap set

找到!!

code 只有作到參數 arg5,後面 6,7,8 都是用 default。

所以要可以設 hotspot channel,就可以把 argv6 加上去..

所以要作:
  • WifiConfig 新增 softap_channel
  • 設定增加一個 item 設定 softap_channel (1-11)
  • 這段code,增加一個 argument,把 WifiConfig.softap_channel 拿出來

沒有留言:

標籤

網誌存檔