Android WIFI 詳解
該類成員函數(shù)的也是通過(guò)調(diào)用mWifimanager的接口來(lái)實(shí)現(xiàn)的。
3) WifiManager:
frameworks/base/wifi/java/android/net/wifi/WifiManager.java
兩個(gè)重要的數(shù)據(jù)成員:
//WifiService
IWifiManager mService;
HandlermHandler;
IWifiManager mService和HandlermHandler,這個(gè)類擁有了一個(gè)WifiService實(shí)例,就可以通過(guò)它進(jìn)行一系列的調(diào) 用;WifiManager中定義了的wifi和ap的狀態(tài),這些狀態(tài)會(huì)在其他很多類中有使用;然后定義了大量的函數(shù),這些函數(shù)幾乎都是對(duì) WifiService接口函數(shù)的封裝,直接調(diào)用WifiService的函數(shù)。
該類的構(gòu)造函數(shù)很簡(jiǎn)單:
public WifiManager(IWifiManager service,Handler handler) {
mService = service;
mHandler = handler;
}
該 類中還定義了一個(gè)WifiLock類,這個(gè)類用來(lái)保證在有應(yīng)用程序使用Wifi無(wú)線電傳輸數(shù)據(jù)時(shí),wifiradio可用,即當(dāng)一個(gè)應(yīng)用程序使用wifi 的radio進(jìn)行無(wú)線電數(shù)據(jù)傳輸時(shí),就要先獲得這個(gè)鎖,如果該鎖已被其他程序占有,就要等到該鎖被釋放后才能獲得,只用當(dāng)所有持有該鎖的程序都釋放該鎖 后,才能關(guān)閉radio功能。
4)WifiService:
frameworks/base/services/java/com/android/server/WifiService.java
private final WifiStateTrackermWifiStateTracker;
private Context mContext;
private WifiWatchdogServicemWifiWatchdogService = null;
private final WifiHandler mWifiHandler;
這是WifiService中的幾個(gè)重要的數(shù)據(jù)成員。
在 接下來(lái)的構(gòu)造函數(shù)中初始化了mWifiStateTracker,mContext,然后動(dòng)態(tài)生成mWifiThread子線程并啟動(dòng),在主線程里用 mWifiThread調(diào)用getLooper()函數(shù)獲得線程的looper,來(lái)初始化創(chuàng)建一個(gè)mWifiHandler對(duì)象,這個(gè) WifiHandler在WifiService類的后面有定義,并重載了Handler類的handlermessage()函數(shù),這樣消息就可以在主 線程里被處理了,這是android的handlerthread消息處理機(jī)制,可參考相關(guān)資料,這里不予詳述。在構(gòu)造函數(shù)的最后,注冊(cè)了兩個(gè)廣播接收 器,分別用來(lái)ACTION_AIRPLANE_MODE_CHANGED和ACTION_TETHER_STATE_CHANGED這兩個(gè)動(dòng)作,這里是 android的intent消息通知機(jī)制,請(qǐng)參考相關(guān)資料,代碼如下:
mContext = context;
mWifiStateTracker = tracker;
mWifiStateTracker.enableRssiPolling(true);
……
HandlerThread wifiThread = newHandlerThread(WifiService);
wifiThread.start();
mWifiHandler = newWifiHandler(wifiThread.getLooper());
……
隨 后定義了一系列的函數(shù),其中有服務(wù)器要發(fā)送的命令的系列函數(shù),它通過(guò)mWifiStateTracker成員類調(diào)用自己的的發(fā)送命令的接口(其實(shí)就是對(duì)本 地接口的一個(gè)封裝),最后通過(guò)適配層發(fā)送命令給wpa_supplicant,而事件處理只到WifiStateTracker層被處理。
要 注意的是,在WifiService中,定義了一些函數(shù)來(lái)創(chuàng)建消息,并通過(guò)mWifiHandler將消息發(fā)送到消息隊(duì)列上,然后在 mHandlerThread線程體run()分發(fā)處理消息,在主線程中被mWifiHandler的handlerMessage()函數(shù)處理,最后 調(diào)用mWifiStateTracker的對(duì)應(yīng)函數(shù)來(lái)實(shí)現(xiàn)的。這里我也不明白為什么WifiService不直接調(diào)用mWifiStateTracker 對(duì)應(yīng)的函數(shù),還要通過(guò)消息處理機(jī)制,繞了一圈在調(diào)用,當(dāng)然Google這么做肯定是有它道理的,忘高手指點(diǎn)。
5) WifiStateTracker類:
frameworks/base/wifi/java/android/net/wifi/WifiStateTracker.java
NetworkStateTracker繼承了handler類,而WifiStateTracker繼承了NetworkStateTracker類,就是說(shuō)WifiStateTracker間接繼承了handler類,屬于一個(gè)事件處理類。
WifiStateTracker類首先定義了事件日志和事件碼(這里包含了所有可能的事件類型),還定義了如下的重要成員數(shù)據(jù):
//幾個(gè)重要的數(shù)據(jù)成員
private WifiMonitor mWifiMonitor; //被啟動(dòng)用來(lái)監(jiān)聽(tīng)supplicant傳來(lái)的消息
private WifiInfo mWifiInfo;
private WifiManager mWM; //服務(wù)代理
private DhcpHandler mDhcpTarget; //IP地址獲取線程
private DhcpInfo mDhcpInfo; //Dhcp的相關(guān)信息都在這里
類的構(gòu)造函數(shù)中,初始化了系列成員變量,包括生成了WifiMonitor的實(shí)例,在構(gòu)造函數(shù)中,因?yàn)閃ifiStateTracker是一個(gè)handler間接子類,所以他會(huì)自動(dòng)調(diào)用handler的無(wú)參構(gòu)造函數(shù),獲得looper和Queue消息隊(duì)列。
然后定義了一些設(shè)置supplicant和更新網(wǎng)絡(luò)信息的輔助函數(shù)。
startEventLoop()函數(shù)很重要,用來(lái)啟動(dòng)WifiMonitor線程,進(jìn)入消息循環(huán)檢測(cè)。接著定義了系列通知函數(shù),被 WifiMonitor調(diào)用來(lái)向WifiStateTracker傳遞從wpa_supplicant接收到的消息,他會(huì)調(diào)用消息發(fā)送函數(shù)到消息隊(duì)列,并 被WifiStateTracker的handlermessage()函數(shù)處理。這個(gè)handlermessage()函數(shù)就是在隨后被定義的,它主要 是調(diào)用相應(yīng)的輔助函數(shù)完成動(dòng)作,并可能會(huì)將消息封裝后,通過(guò)intent機(jī)制發(fā)送出去,被上層的UI活動(dòng)接收處理。
這 里也定義了很多的WfiNative接口函數(shù),這是JNI的本地接口;類DhcpHandler extends Handler{}也是在該類中定義的,它也是一個(gè)handler的子類,用來(lái)處理DHCP相關(guān)的消息EVENT_DHCP_START,可以想到它和 WifiStateTracker不是共用一個(gè)looper。
注意:handleMessage是在該文件中定義的,用來(lái)處理經(jīng)WifiMonitor轉(zhuǎn)換過(guò)的消息。
6) WifiMonitor
frameworks/base/wifi/java/android/net/wifi/WifiMonitor.java
聲明了一個(gè)重要的成員變量:mWifiStateTracker,并在構(gòu)造函數(shù)中由參數(shù)提供初始化,還定義了一系列的可能從wpa_supplicant層接收的事件類型及其名字,這些是消息處理機(jī)制的基礎(chǔ)。
startMonitoring()函數(shù),這是一個(gè)線程啟動(dòng)的封裝函數(shù),WifiStateTracker就是通過(guò)這個(gè)函數(shù)啟動(dòng)的WifiThread。
這 個(gè)重要的類classMonitorThreadextends Thread{};它是一個(gè)監(jiān)控進(jìn)程類,里面有一系列的事件處理函數(shù)和一個(gè)重要的Run()函數(shù),run函數(shù)主要流 程:connectToSupplicant()連接精靈進(jìn)程wpa_supplicant,這里有一個(gè) mWifiStateTracker.notifySupplicantXXX()的調(diào)用,通知上層是否連接成功,然后就是一個(gè)輪詢過(guò)程,其中調(diào)用了 WifiNative.waitForEvent()本地輪詢函數(shù)接口,并從返回的事件字符串類型中提取事件的名稱,最后通過(guò)事件的名稱調(diào)用相應(yīng)的事件處 理函數(shù),并將事件轉(zhuǎn)換成mWifiStateTracker能識(shí)別的類型上報(bào)。
評(píng)論