1. 程式人生 > >深入理解android Wi-Fi模組學習總結——WifiService

深入理解android Wi-Fi模組學習總結——WifiService

除了看原始碼外,我結合博文和書籍一起理解,這裡推薦幾篇博文和一本書:

http://blog.csdn.net/u013467735/article/details/42487537

http://blog.csdn.net/u013467735/article/details/42493665

書籍是鄧凡平的深入理解Android(Wi-Fi、NFC和GPS卷)

這篇博文也引用了以上資料中的一些表述,引用之處沒有一一指出,請原作者諒解。

一,WiFi狀態機

在總結 WifiService的知識之前,先大概看看WiFi狀態機的狀態和屬性,如下:

                         WifiStateMachine中的狀態及層次關係

(初始狀態是:InitialState)



二,wifi的啟動

Wifi的啟動主要是通過使用者點選wifi開關,呼叫setWifiEnabled後,再經過一系列的向下呼叫,最終載入驅動、連線WPAS,以此作為開啟階段的結束。具體的呼叫流程如下圖:


對以上流程做出以下總結:

(1)使用者開啟wifi開關後,呼叫mWifiManage.setWifiEnabled(true)函式,通過AIDL呼叫WifiService的setWifiEnabled(true),該函式通過mWifiController傳送CMD_WIFI_TOGGLED的訊息,由WifiController的StaEnabledState狀態處理,處理方法是呼叫WifiStateMachine的setSupplicantRunning(true) 方法,該方法將傳送CMD_START_SUPPLICANT

訊息,此時WifiStateMachine是InitialState狀態。

(2)InitialState處理CMD_START_SUPPLICANT訊息,主要做了以下三件事情:

呼叫WifiNative的loadDriver()載入驅動;

呼叫NwService的wifiFirmwareReload(mInterfaceName,"STA")載入韌體;

呼叫WifiNative的startSupplicant(mP2pSupported)啟動wpa_supplicant。

(3)WifiStateMachine進入SupplicantStartingState狀態,若SUP啟動成功,WifiMonitor傳送SUP_CONNECTION_EVENT

給WifiStateMachine

(4)SupplicantStartingState處理SUP_CONNECTION_EVENT訊息,轉到DriverStartedState狀態,其EA進行一些設定後進入DisconnectedState狀態,開啟流程到此結束。

三、Wifi的掃描

當wifi開啟之後,會發送WIFI_STATE_CHANGED_ACTION廣播,WifiTracker註冊監聽該廣播,收到該廣播後,呼叫mScanner.resume()啟動掃描,該方法中呼叫mWifiManage.startScan()發起掃描。再通過WifiService的startScan( )觸發WifiStateMachine的startScan()方法,下面就從WifiStateMachine的startScan()方法開始分析流程,如下圖:

Wifi掃描的流程比較簡單,涉及的狀態也不多,沒發生狀態切換,停留在DisconnectedState狀態,主要在於WifiNative向WPAS傳送SCAN命令,當WPAS找到AP後,通過WifiMonitor向WifiStateMachine傳送SCAN_RESULTS_EVENT訊息,WifiStateMachine再去取掃描的結果進行儲存,併發送SCAN_RESULTS_AVAILABLE_ACTION廣播通知上層。

三、Wifi的連線

從WifiManager的connect函式開始,該函式通過AsyncChannel向WifiService傳送CONNECT_NETWORK訊息,WifiService將其裝法給WifiStateMachine。下面從WifiStateMachine開始分析連線wifi的大致流程。

連線流程比較複雜,做出以下總結:

(1)整個流程起源於WifiManager向WifistateMachine傳送的CONNECT_NETWORK訊息。

(2)當前狀態 仍然是DisconnectedState,其父狀態ConnectModeState處理CONNECT_NETWORK訊息,它將傳送一系列命令給WPAS,WPAS將完成802.11規範中定義的身份認證、關聯、四次握手等工作。

(3)當WPAS連線上AP之後,將通過WifiMonitor傳送NETWORK_CONNECTION_EVENT訊息給WifistateMachine。依然是DisconnectedState的父狀態ConnectModeState處理該訊息。然後跳轉到ObtainingIpState狀態,併發送廣播NETWORK_STATE_CHANGED_ACTION通知上層。

(4)ObtainingIpState狀態主要完成DHCP協議的IP地址申請,主要是CMD_PRE_DHCP_ACTIONCMD_POST_DHCP_ACTION訊息的處理,最後將進入ConnectedState狀態,連線流程結束。

四、申請IP地址

當WPAS連線上AP之後,將進行IP地址的動態申請,使用的協議是DHCP協議,該協議的介紹可以參考文件《計算機網路基礎知識與常用網路協議總結》中的“三、應用層常用協議2.動態主機配置協議(DHCP)”

Android中主要使用到的類是DHCPClient,它是一個StateMachine,共有14個狀態,如下:


對應IP地址申請的流程,從上文提到的WifistateMachine進入ObtainingIpState狀態開始分析,大致有以下幾個過程:

(1)IpManager傳送CMD_START_DHCP訊息給DHCPClient,此時DHCPClient處於初始狀態StoppedState,處理該訊息時轉入WaitBeforeStartState狀態;

(2)並向IpManager傳送CMD_PRE_DHCP_ACTION訊息,IpManager又給DHCPClient回覆CMD_PRE_DHCP_ACTION_COMPLETE訊息。然後DHCPClient轉入DhcpInitState狀態。

(3)DhcpInitState通過sendDiscoverPacket()廣播DHCPDISCOVER報文。ReceiveThread執行緒不斷監聽收到的訊息,收到訊息時傳送CMD_RECEIVED_PACKET訊息,若收到的報文是一個DhcpOfferPacket,則轉入DhcpRequestingState。

(4)進入狀態後,將通過sendRequestPacket傳送DHCPREQUEST報文給伺服器。等待伺服器回覆DHCPACK報文,若收到的報文是DhcpAckPacket型別的,則通過setDhcpLeaseExpiry(packet)設定租期時間,併發送CMD_POST_DHCP_ACTION訊息給IpManager,之後轉入ConfiguringInterfaceState狀態。改狀態將向IpManager傳送CMD_CONFIGURE_LINKADDRESS訊息。

(5)IpManager收到CMD_POST_DHCP_ACTION訊息將通過回撥onPostDhcpAction()和onNewDhcpResults()和onProvisioningSuccess通知WifistateMachine做進一步處理。

(6)IpManager收到CMD_CONFIGURE_LINKADDRESS訊息時,將通過setIPv4Address設定IP地址,並回復訊息EVENT_LINKADDRESS_CONFIGURED 給DHCPClient。

(7)DHCPClient收到EVENT_LINKADDRESS_CONFIGURED訊息後將轉到DhcpBoundState狀態。該狀態的EA將通過scheduleLeaseTimers()進行租用時間的計時器設定。

(8)當計時器設定的時間一到(租期的一半),需要向伺服器續租該IP地址,將傳送CMD_RENEW_DHCP訊息,DhcpBoundState處理該訊息,轉入WaitBeforeRenewalState狀態,又重新開始了(2)的步驟。