1. 程式人生 > >Android 7.0 WifiMonitor工作流程分析

Android 7.0 WifiMonitor工作流程分析

在wifi啟動掃描的分析過程中,出現了多次WifiMonitor的操作,在此分析一下這個函式是如何工作的。 在Android的Wifi體系中,WifiMonitor承擔著分發來自wpa_supplicant底層事件的任務。當上層下達Wifi的掃描、連線等指令後, 底層驅動以及wpa_s進行實際的掃描、連線操作,操作完成後會向上層反饋一個event,通知framework掃描是否結束、連線是否成功。
1.WifiMonitor的初始化

在WifiStateMachine的建構函式中獲取WifiMonitor的例項,並且在WifiStateMachine的建構函式中註冊了一系列的handler。






 從啟動掃描流程中可知,在啟動過程中會呼叫startMonitoring(),開始監聽從底層上報的訊息。

2.startMonitoring()


為了監聽wpa_supplicant的事件,需要先建立與wpa_s的訊息通道,這一步呼叫WifiNative.connectToSupplicant()實現。 如果是第一次進行監聽mConnected為false,進入else分支。先建立與wpa_s的訊息通道,建立成功後會向WifiStateMachine傳送SUP_CONNECTION_EVENT訊息,通知Wifi狀態機。隨後,開啟事件監聽執行緒:new MonitorThread(mWifiNative, this).start():








這裡我們假設事先下發的是一個wifi掃描的指令,wpa_s反饋event通知wifi掃描的結果,根據實現的一些匹配規則,最後進入handleEvent()函式,此處event是SCAN_RESULTS,向WifiStateMachine傳送SCAN_RESULTS_EVENT訊息,告知它掃描已經結束,可以去讀取掃描結果了。這樣,處理流程就用返回到Wifi狀態機中。WifiStateMachine收到此訊息後,呼叫WifiStateMachine::setScanResults()方法從wpa_s讀取掃描結果,並向外界傳送WifiManager.SCAN_RESULTS_AVAILABLE_ACTION廣播通知應用。此時一些註冊過該廣播的應用,例如手機中的Setting app,就能通過呼叫WifiManager::getScanResults()讀取掃描結果了。至此,一個簡單的WifiMonitor分發事件的流程結束,其他型別事件的分發跟此過程相似。



 至此,一個簡單的上層流程分析結束了。