和菜鳥一起學android4.0.3原始碼之wifi的簡單分析
關於wlan的組成
關於wifi應用層的介面的呼叫
首先從上層android wifi的應用開始,首先會根據android的wifimanager的類,例項化一個mwifimanager的物件,這個物件處理了所有wifi需要處理的任務,接著比如說開啟wifi,那麼就會呼叫 mWifiManager.isWifiEnabled();判斷wifi是否已經開啟,如果沒有開啟,那麼就會呼叫mWifiManager.setWifiEnabled(true);來開啟wifi了。這裡會呼叫到wifiservice的方法,就是設定wifi使能,mService.setWifiEnabled。然後該函式會繼續呼叫wifi的狀態機中的設定使能的方法mWifiStateMachine.setWifiEnabled,而在wifi狀態機中,這個方法主要是往這個狀態機中發了兩條訊息,CMD_LOAD_DRIVER,和CMD_START_SUPPLICANT。看其意思就可以知道是載入驅動和啟動wpa_supplicant了。剩下就是wifi狀態機裡做的事情了,這個下面分析。還有其他的比如關閉wifi啊,掃描啊,連線網路啊,斷開網路啊等等可以看下面的簡單的流程圖。具體的實現可以跟蹤程式碼,就不一一介紹了。
關於wifi的framework層狀態機
Wifi framework層的主要的狀態機可以參見下面的圖了。
這裡主要還是介紹下wifistatemachine的一些主要狀態機的實現吧。
初始狀態是initial,所以一開始執行initial的enter(),由於我們平臺中,我移植的時候是wifi的驅動編譯進核心的,所以WifiNative.isDriverLoaded()函式必須是true的。接著狀態就轉換為transitionTo(mDriverLoadedState)。
驅動載入的狀態了。在這裡的processMessage就會處理訊息了。結合上面APP在開啟wifi的時候傳送的訊息,CMD_START_SUPPLICANT,所以這裡會處理開啟wpa_supplicant。接著會下載firmware
mNwService.wifiFirmwareReload(mInterfaceName,"STA");因為我們wifi驅動的firmware是驅動內部實現的,所以這裡就不管他了。然後在WifiNative.startSupplicant();這裡呼叫了hal層的,開啟wpa_supplicant,具體下面分析。然後是mWifiMonitor.startMonitoring();開啟一個monitor,主要還是處理wpa_supplicant往上報的事件的。接著,狀態又轉換了,就是
transitionTo(mSupplicantStartingState);
SupplicantStartingState狀態了,這裡如果wpa_supplicant啟動成功的話,monitor那裡上報一個WifiMonitor.SUP_CONNECTION_EVENT,接著就轉換狀態了,也就是transitionTo(mDriverStartedState);具體如下:
case WifiMonitor.SUP_CONNECTION_EVENT:
if (DBG)log("Supplicant connection established");
setWifiState(WIFI_STATE_ENABLED);
mSupplicantRestartCount =0;
/* Reset the supplicantstate to indicate the supplicant
* state is not known atthis time */
mSupplicantStateTracker.sendMessage(CMD_RESET_SUPPLICANT_STATE);
mWpsStateMachine.sendMessage(CMD_RESET_WPS_STATE);
/* Initialize datastructures */
mLastBssid = null;
mLastNetworkId =WifiConfiguration.INVALID_NETWORK_ID;
mLastSignalLevel = -1;
mWifiInfo.setMacAddress(WifiNative.getMacAddressCommand());
WifiConfigStore.initialize(mContext);
sendSupplicantConnectionChangedBroadcast(true);
transitionTo(mDriverStartedState);
這裡在DriverStartedState狀態下了。這裡又做了很多處理:其中有一個CMD_START_SCAN,就是開始掃描。
對於狀態機,下面畫了大部分的狀態圖。
關於wifi的jni層
Jni層主要是封裝了很多的介面,可以讓上層的JAVA程式碼來呼叫hal層的c或者c++程式碼。這裡他把命令和一些控制都封裝好了。其主要介面可以看下圖。
關於wifi的hal層
Wifi的hal層主要就是上層jni會呼叫到wpa_supplicant的,具體如下圖所示。
關於wpa_supplicant的總工作流程
以上主要是以流程結合圖形文字的方式簡單的介紹了android的整個wifi的機制。具體可以結合程式碼分析。因為網上已經有很多的說明了,這裡也不會太過分析。
關於wifi的linux驅動流程
可以參見《和菜鳥一起學linux之wifi學習記錄》。這裡已經對sdio wifi資料流程等做了簡單的分析了。。
至此,對於android的整個wifi的機制,從巨集觀到微觀做了簡單的分析,相信基於這些,androidwifi的移植開發不再那麼神祕而不可見了。