Android WIFI 詳解
注意:這里的每個(gè)事件的捕獲(由wifimonitor完成),最終都會(huì)調(diào)用相應(yīng)的mWifiStateTracker的消息通知函數(shù)上報(bào)消息;輪詢(xún)和事件處理都是在Monitor線(xiàn)程類(lèi)中實(shí)現(xiàn)的。
7)WifiNative
frameworks/base/wifi/java/android/net/wifi/WifiNative.java
里面定義了一個(gè)類(lèi)WifiNative:其中聲明了許多本地接口,可由native的標(biāo)志看出,這是Java代碼和本地庫(kù)之間的聯(lián)系接口;
8) android_net_wifi_Wifi.java
frameworks/base/core/jni/
里面定義了許多的JNI的本地代碼實(shí)現(xiàn),每個(gè)實(shí)現(xiàn)中都會(huì)調(diào)用wpa_supplicant適配層的接口,通過(guò)包含適配層的頭文件wifi.h獲取適配層定 義的接口;后面是一個(gè)JNINativeMethod數(shù)組,定義了每個(gè)本地接口和本地實(shí)現(xiàn)的對(duì)應(yīng)關(guān)系;最后有一個(gè)注冊(cè)函數(shù) regester_XXX_XX(),用以把上面的方法類(lèi)數(shù)組注冊(cè)到系統(tǒng)中。
該類(lèi)實(shí)現(xiàn)了本地接口的相關(guān)功能,并通過(guò)調(diào)用wpa的適配層的相關(guān)函數(shù)和wpa_supplicant通信,所以JNI是連接Java框架層和wpa適配層的橋梁.
9)wpa_supplicant適配層,wifi.c:目錄libhardware/wifi/
里面定義很多字符串變量和適配層的接口實(shí)現(xiàn),是對(duì)wpa_supplicant程序通信的接口封裝,用來(lái)完成上層和wpa_supplicant的通信, 頭文件在libhardware/include/hardware下,這里的函數(shù)用來(lái)向JNI的本地實(shí)現(xiàn)提供調(diào)用接口。
這里的函數(shù),我把它們分為三類(lèi)函數(shù):
一 類(lèi)是命令相關(guān)的(控制)函數(shù),就是在JNI層android_XXX_Command()函數(shù)所調(diào)用的::Wifi_Command()函數(shù),調(diào)用流 程:android_XXX_command()=>docommand()=>wifi_command()=> wifi_send_command()=>wpa_ctrl_require()。
二類(lèi)是監(jiān)聽(tīng)函數(shù),即Wifi_wait_for_event()函數(shù),調(diào)用流程:android_net_wifi_Waitforevent()=>wifi_wait_for_event()=>wpa_ctrl_recv()。
三類(lèi)是剩下的函數(shù)。
10)wpa_supplicant與上層的接口,wpa_ctrl.c:external/wpa_supplicant
定義了三類(lèi)套接字,并分別實(shí)現(xiàn)了和wpa_supplicant的通信,因此wpa_supplicant適配層和wpa_supplicant層是通過(guò)socket通訊的。
要 是從wifi.c中真的很難看出它和wpa_supplicant有什么關(guān)系,和它聯(lián)系密切的是wpa_ctrl.h文件,這里面定義了一個(gè)類(lèi) wpa_ctrl,這個(gè)類(lèi)中聲明了兩個(gè)Socket套接口,一個(gè)是本地一個(gè)是要連接的套接口,wpa_ctrl與wpa_supplicant的通信就需 要socket來(lái)幫忙了,而wpa_supplicant就是通過(guò)調(diào)用wpa_ctrl.h中定義的函數(shù)和wpa_supplicant進(jìn)行通訊 的,wpa_ctrl類(lèi)(其實(shí)是其中的兩個(gè)socket)就是他們之間的橋梁。
11)wpa_supplicant和driver_wext驅(qū)動(dòng)接口的聯(lián)系:
driver.h:該文件定義了系列結(jié)構(gòu),首先是一個(gè)wpa_scan_result結(jié)構(gòu),這是一個(gè)掃描結(jié)果的通用格式,里面包含了掃描的所有信息(如 BSSID,SSID,信號(hào)質(zhì)量,噪音水平,支持的最大波特率等等信息),每個(gè)驅(qū)動(dòng)接口實(shí)現(xiàn)負(fù)責(zé)將從驅(qū)動(dòng)中上傳的掃描信息的格式轉(zhuǎn)換到該通用的掃描信息格 式;然后是一些宏定義和枚舉定義,最后也是最重要的是wpa_driver_ops結(jié)構(gòu),該結(jié)構(gòu)是wpa driver的操作函數(shù)集合,里面有驅(qū)動(dòng)接口的名稱(chēng)和很多的函數(shù)指針。
drviers.c:該文件很簡(jiǎn)單,首先是一些外部變量的引用聲明,都是不同驅(qū)動(dòng)操作接口的集合wpa_driver_XXX_ops變量;然后就是定義一個(gè)驅(qū)動(dòng)操作接口集合的數(shù)組,根據(jù)宏定義添加對(duì)應(yīng)的驅(qū)動(dòng)操作接口集合的變量。
drvier_XXX.h:這是不同驅(qū)動(dòng)接口頭文件,主要聲明了操作接口
drvier_XXX.c:實(shí)現(xiàn)操作接口,定義一個(gè)操作集合變量,并用上面定義的函數(shù)初始化其中的函數(shù)指針
注意:下面要搞清楚wpa_supplicant守護(hù)進(jìn)程是如何操作,最后調(diào)用驅(qū)動(dòng)接口集合中的函數(shù)的;要知道wpa_supplicant是為不同驅(qū)動(dòng) 和操作系統(tǒng)具有更好移植性而被設(shè)計(jì)的,以便在wpa_supplicant層不用實(shí)現(xiàn)驅(qū)動(dòng)的具體接口就可以添加新的驅(qū)動(dòng)程序;在 wpa_supplicant結(jié)構(gòu)中有一個(gè)wpa_drv_ops類(lèi)型的drvier成員,在wpa_supplicant進(jìn)程中,經(jīng)常通過(guò) Wpa_supplicant_XXX函數(shù)傳遞wpa_supplicant實(shí)例指針wpa_s參數(shù)給wpa_drv_XXX函數(shù)來(lái)調(diào)用它,在 wpa_drv_XX中會(huì)通過(guò)wpa_s->driver->XXX()的流程來(lái)調(diào)用通用驅(qū)動(dòng)接口,簡(jiǎn)單才是生活的真相,可android始 終讓我感到真相還是遙不可及。
12)WifiWatchdogService:
首 先聲明了兩個(gè)主要變量mWifiStateTracker,mWifiManager,需要這兩個(gè)類(lèi)對(duì)象來(lái)完成具體的控制工作,在 WifiWatchdogService的構(gòu)造函數(shù)中,創(chuàng)建了這兩個(gè)類(lèi),并通過(guò)regesterForWifiBroadcasts()注冊(cè)了 BroadcastReceiver,BroadcastReceiver是用來(lái)獲取網(wǎng)絡(luò)變化的,然后啟動(dòng)了一個(gè)WatchdogTread線(xiàn)程,用來(lái)處 理從WifiStateTracker接收到的消息。
frameworks/base/services/java/com/android/server/WifiWatchdogService.java
WifiWatchdogService(Context context,WifiStateTracker wifiStateTracker) {
mContext = context;
mContentResolver = context.getContentResolver();
mWifiStateTracker =wifiStateTracker;
mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
createThread();
// The content observer to listen needs a handler, which createThreadcreates
registerForSettingsChanges();
if (isWatchdogEnabled()) {
registerForWifiBroadcasts();
}
if (V) {
myLogV(WifiWatchdogService: Created);
}
}
WifiWatchdogHandler繼承了handler類(lèi),成為一個(gè)消息處理類(lèi),定義handlemessage()函數(shù),處理消息隊(duì)列上的消息。
二,wpa_supplicant再解析
1)wpa_ctrl.h:
該文件中并沒(méi)有定義structwpa_ctrl結(jié)構(gòu),因?yàn)樵谄渌撐募?c文件中不能直接使用該結(jié)構(gòu)的成員,這里主要聲明了幾個(gè)用于使用 socket通信的函數(shù)接口,包 括:wpa_ctrl_open,wpa_ctrl_close,wpa_ctrl_attach,wpa_ctrl_detach,wpa_ctrl_cleanup,wpa_ctrl_recv,wpa_ctrl_request, wpa_ctrl_pending, wpa_ctrl_get_fd 等函數(shù)。
評(píng)論