1. 程式人生 > >和菜鳥一起學android4.0.3原始碼之wifi的簡單分析

和菜鳥一起學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的移植開發不再那麼神祕而不可見了。