国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
android Wifi模塊分析(一)

Wifi模塊

       最近研究Wifi模塊,查了不少的相關(guān)資料,但發(fā)現(xiàn)基本上是基于android2.0版本的的分析,而現(xiàn)在研發(fā)的android移動(dòng)平臺(tái)基本上都是2.3的版本,跟2.0版本的差別,在Wifi模塊上也是顯而易見的。2.3版本Wifi模塊沒有了WifiLayer,之前的WifiLayer主要負(fù)責(zé)一些復(fù)雜的Wifi功能,如AP選擇等以提供給用戶自定義,而新的版本里面的這塊內(nèi)容基本上被WifiSettings所代替。

       本文就是基于android2.3版本的Wifi分析,主要分為兩部分來分別說明:

(1)    Wifi模塊相關(guān)文件的解析

(2)    Wifi的啟動(dòng)流程(有代碼供參考分析)

一,Wifi模塊相關(guān)文件解析

1)      wifisettings.java

packages/apps/Settings/src/com/android/settings/wifi wifisettings.java

       該類數(shù)據(jù)部分主要定義了下面幾個(gè)類的變量:

{

private final IntentFilter mFilter;

 

//廣播接收器,用來接收消息并做響應(yīng)的處理工作

private final BroadcastReceiver mReceiver;

 

//這是一個(gè)掃描類,會(huì)在用戶手動(dòng)掃描   AP時(shí)被調(diào)用

private final Scanner mScanner;               

private WifiInfo mLastInfo;

 

       //服務(wù)代理端,作為WifiService對(duì)外的接口類呈現(xiàn)

private WifiManager mWifiManager;

 

//這個(gè)類主要實(shí)現(xiàn)Wifi的開閉工作

private WifiEnabler mWifiEnabler;

 

//AP

private AccessPoint mSelected;

private WifiDialog mDialog;

……

}

       wifiSettings類的構(gòu)造函數(shù)的主要工作:定義了一個(gè)IntentFilterIntent過濾器)變量,并添加了六個(gè)動(dòng)作,(了解Androidintent機(jī)制的同學(xué)都知道什么意思,不明白的同學(xué)參考Intent機(jī)制的資料)接著定義一個(gè)廣播接收器,并有相應(yīng)的消息處理函數(shù),下面是該構(gòu)造函數(shù)的定義:

 

public WifiSettings() {

mFilter = new IntentFilter();

//intent機(jī)制中的intent消息過濾器,下面添加可以處理的動(dòng)作

    mFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);

      mFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);

    mFilter.addAction(WifiManager.NETWORK_IDS_CHANGED_ACTION);

   mFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);

        mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);

    mFilter.addAction(WifiManager.RSSI_CHANGED_ACTION);

 

//注冊(cè)了廣播接收器,用來處理接收到的消息事件

        mReceiver = new BroadcastReceiver() {

            @Override

            public void onReceive(Context context, Intent intent) {

                handleEvent(intent); //事件處理函數(shù)

            }

        };

 

        mScanner = new Scanner();     //手動(dòng)掃描類

}

       在廣播接收器中的相應(yīng)函數(shù)onReceive函數(shù)中有個(gè)handleEvent函數(shù),它就是用來處理廣播接收器接受到的intent消息的,它的功能是根據(jù)intent消息中的動(dòng)作類型,來執(zhí)行相應(yīng)的操作,每一種動(dòng)作對(duì)應(yīng)了activity的一項(xiàng)消息處理能力。

       oncreate函數(shù)中實(shí)例化了mWifiManagermWifiEnabler兩個(gè)類,這兩個(gè)類對(duì)wifiSettings來說至關(guān)重要,它后面的定義的一系列函數(shù)都是通過調(diào)用這兩個(gè)類的相應(yīng)接口來實(shí)現(xiàn)的。

……

mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);

mWifiEnabler = new WifiEnabler(this,

                    (CheckBoxPreference) findPreference("enable_wifi"));

……

       WifiSettings中還定義了顯示菜單和響應(yīng)菜單鍵的函數(shù),即onCreateOptionsMenu()和onOptionsItemSelected();還有響應(yīng)配置對(duì)話框中按鍵的onClick()函數(shù);最后定義了Scanner類,它是一個(gè)handler的繼承類,實(shí)現(xiàn)了消息處理函數(shù),用于處理手動(dòng)掃描的動(dòng)作。

 

2)      WifiEnabler.java:

packages/apps/Settings/src/com/android/settings/wifi/WifiEnabler.java

 

private final Context mContext;

private final CheckBoxPreference mCheckBox;

 

//兩個(gè)重要成員

private final WifiManager mWifiManager;

private final IntentFilter mIntentFilter;

 

       wifienabler類中定義了四個(gè)成員變量很重要,mContext,mCheckBox,mWifiManagermReceiver,其中mContext用于獲取mwifiManager實(shí)例,mReceiver用來接收底層發(fā)來的消息,mCheckBox用來改變UI的狀態(tài)。

該類中定義了幾個(gè)重要的函數(shù)onPreferenceChange,handleWifiStateChangedhandleStateChanged,onPreferenceChange用來處理按下的Enbler鍵,它會(huì)調(diào)用mWifiManager.setWifiEnabled(enable),另外兩個(gè)用來處理接受的消息事件。

 

       在類的構(gòu)造函數(shù)中,主要做了一下工作:初始化了mContext,mCheckBox,mWifimanager,并且初始化了一個(gè)mIntentFilter變量,添加了三個(gè)動(dòng)作,在構(gòu)造函數(shù)的上面定義了一個(gè)廣播接收器,用來接收下層傳來的消息,并根據(jù)intent動(dòng)作的類型調(diào)用相應(yīng)的處理函數(shù),這個(gè)廣播接收器在onResum函數(shù)中被注冊(cè)。

public WifiEnabler(Context context, CheckBoxPreference checkBox) {

        mContext = context;

        mCheckBox = checkBox;

        mOriginalSummary = checkBox.getSummary();

        checkBox.setPersistent(false);

 

        mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);

        mIntentFilter = new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION);

        // The order matters! We really should not depend on this. :(

        mIntentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);

        mIntentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);

}

這里可以總結(jié)為:如果上層需要監(jiān)聽或收到下層的消息,那么就要通過定義一個(gè)BroadcastReciever,并將它注冊(cè),當(dāng)然在接受到消息后應(yīng)該有處理消息的函數(shù),然后在onReciever函數(shù)中根據(jù)消息調(diào)用相應(yīng)的處理函數(shù),這里的消息通知機(jī)制是Intent,在BroadcastReciever類的onReciever函數(shù)的參數(shù)中可以看出。

該類成員函數(shù)的也是通過調(diào)用mWifimanager的接口來實(shí)現(xiàn)的。

 

 3) WifiManager:

       frameworks/base/wifi/java/android/net/wifi/WifiManager.java

       兩個(gè)重要的數(shù)據(jù)成員:

//WifiService

IWifiManager mService;

    Handler mHandler;

IWifiManager mServiceHandler mHandler,這個(gè)類擁有了一個(gè)WifiService實(shí)例,就可以通過它進(jìn)行一系列的調(diào)用;WifiManager中定義了的wifiap的狀態(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è)類用來保證在有應(yīng)用程序使用Wifi無線電傳輸數(shù)據(jù)時(shí),wifi radio可用,即當(dāng)一個(gè)應(yīng)用程序使用wifiradio進(jìn)行無線電數(shù)據(jù)傳輸時(shí),就要先獲得這個(gè)鎖,如果該鎖已被其他程序占有,就要等到該鎖被釋放后才能獲得,只用當(dāng)所有持有該鎖的程序都釋放該鎖后,才能關(guān)閉radio功能。

 

 4) WifiService

frameworks/base/services/java/com/android/server/WifiService.java

private final WifiStateTracker mWifiStateTracker;

private Context mContext;

private WifiWatchdogService mWifiWatchdogService = null;

private final  WifiHandler mWifiHandler;

這是WifiService中的幾個(gè)重要的數(shù)據(jù)成員。

在接下來的構(gòu)造函數(shù)中初始化了mWifiStateTrackermContext,然后動(dòng)態(tài)生成mWifiThread子線程并啟動(dòng),在主線程里用mWifiThread調(diào)用getLooper()函數(shù)獲得線程的looper,來初始化創(chuàng)建一個(gè)mWifiHandler對(duì)象,這個(gè)WifiHandlerWifiService類的后面有定義,并重載了Handler類的handlermessage()函數(shù),這樣消息就可以在主線程里被處理了,這是androidhandlerthread消息處理機(jī)制,可參考相關(guān)資料,這里不予詳述。在構(gòu)造函數(shù)的最后,注冊(cè)了兩個(gè)廣播接收器,分別用來ACTION_AIRPLANE_MODE_CHANGEDACTION_TETHER_STATE_CHANGED這兩個(gè)動(dòng)作,這里是androidintent消息通知機(jī)制,請(qǐng)參考相關(guān)資料,代碼如下:

 

mContext = context;

mWifiStateTracker = tracker;

mWifiStateTracker.enableRssiPolling(true);

……

HandlerThread wifiThread = new HandlerThread("WifiService");

wifiThread.start();

mWifiHandler = new WifiHandler(wifiThread.getLooper());

……

隨后定義了一系列的函數(shù),其中有服務(wù)器要發(fā)送的命令的系列函數(shù),它通過mWifiStateTracker成員類調(diào)用自己的的發(fā)送命令的接口(其實(shí)就是對(duì)本地接口的一個(gè)封裝),最后通過適配層發(fā)送命令給wpa_supplicant,而事件處理只到WifiStateTracker層被處理。

要注意的是,在WifiService中,定義了一些函數(shù)來創(chuàng)建消息,并通過mWifiHandler將消息發(fā)送到消息隊(duì)列上,然后在mHandlerThread線程體run()分發(fā)\處理消息,在主線程中被mWifiHandlerhandlerMessage()函數(shù)處理,最后調(diào)用mWifiStateTracker的對(duì)應(yīng)函數(shù)來實(shí)現(xiàn)的。這里我也不明白為什么WifiService不直接調(diào)用mWifiStateTracker對(duì)應(yīng)的函數(shù),還要通過消息處理機(jī)制,繞了一圈在調(diào)用,當(dāng)然Google這么做肯定是有它道理的,忘高手指點(diǎn)。

 

 5) WifiStateTracker

frameworks/base/wifi/java/android/net/wifi/WifiStateTracker.java

NetworkStateTracker繼承了handler類,而WifiStateTracker繼承了NetworkStateTracker類,就是說WifiStateTracker間接繼承了handler類,屬于一個(gè)事件處理類。

WifiStateTracker類首先定義了事件日志和事件碼(這里包含了所有可能的事件類型),還定義了如下的重要成員數(shù)據(jù):

          //幾個(gè)重要的數(shù)據(jù)成員

private WifiMonitor mWifiMonitor;    //被啟動(dòng)用來監(jiān)聽supplicant傳來的消息

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)?/span>WifiStateTracker是一個(gè)handler間接子類,所以他會(huì)自動(dòng)調(diào)用handler的無參構(gòu)造函數(shù),獲得looperQueue消息隊(duì)列。

然后定義了一些設(shè)置supplicant和更新網(wǎng)絡(luò)信息的輔助函數(shù)。

       startEventLoop()函數(shù)很重要,用來啟動(dòng)WifiMonitor線程,進(jìn)入消息循環(huán)檢測(cè)。接著定義了系列通知函數(shù),被WifiMonitor調(diào)用來向WifiStateTracker傳遞從wpa_supplicant接收到的消息,他會(huì)調(diào)用消息發(fā)送函數(shù)到消息隊(duì)列,并被WifiStateTrackerhandlermessage()函數(shù)處理。這個(gè)handlermessage()函數(shù)就是在隨后被定義的,它主要是調(diào)用相應(yīng)的輔助函數(shù)完成動(dòng)作,并可能會(huì)將消息封裝后,通過intent機(jī)制發(fā)送出去,被上層的UI活動(dòng)接收處理。

這里也定義了很多的WfiNative接口函數(shù),這是JNI的本地接口;類DhcpHandler extends Handler{}也是在該類中定義的,它也是一個(gè)handler的子類,用來處理DHCP相關(guān)的消息EVENT_DHCP_START,可以想到它和WifiStateTracker不是共用一個(gè)looper

       注意:handleMessage是在該文件中定義的,用來處理經(jīng)WifiMonitor轉(zhuǎn)換過的消息。

 

 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就是通過這個(gè)函數(shù)啟動(dòng)的WifiThread。

這個(gè)重要的類classMonitorThread extends Thread{};它是一個(gè)監(jiān)控進(jìn)程類,里面有一系列的事件處理函數(shù)和一個(gè)重要的Run()函數(shù),run函數(shù)主要流程:connectToSupplicant()連接精靈進(jìn)程wpa_supplicant,這里有一個(gè)mWifiStateTracker.notifySupplicantXXX()的調(diào)用,通知上層是否連接成功,然后就是一個(gè)輪詢過程,其中調(diào)用了WifiNative.waitForEvent()本地輪詢函數(shù)接口,并從返回的事件字符串類型中提取事件的名稱,最后通過事件的名稱調(diào)用相應(yīng)的事件處理函數(shù),并將事件轉(zhuǎn)換成mWifiStateTracker能識(shí)別的類型上報(bào)。

       注意:這里的每個(gè)事件的捕獲(由wifimonitor完成),最終都會(huì)調(diào)用相應(yīng)的mWifiStateTracker的消息通知函數(shù)上報(bào)消息;輪詢和事件處理都是在Monitor線程類中實(shí)現(xiàn)的。

 

 7) WifiNative

       frameworks/base/wifi/java/android/net/wifi/WifiNative.java

里面定義了一個(gè)類WifiNative:其中聲明了許多本地接口,可由native的標(biāo)志看出,這是Java代碼和本地庫之間的聯(lián)系接口;

 

 8) android_net_wifi_Wifi.cpp

frameworks/base/core/jni/

       里面定義了許多的JNI的本地代碼實(shí)現(xiàn),每個(gè)實(shí)現(xiàn)中都會(huì)調(diào)用wpa_supplicant適配層的接口,通過包含適配層的頭文件wifi.h獲取適配層定義的接口;后面是一個(gè)JNINativeMethod數(shù)組,定義了每個(gè)本地接口和本地實(shí)現(xiàn)的對(duì)應(yīng)關(guān)系;最后有一個(gè)注冊(cè)函數(shù)regester_XXX_XX(),用以把上面的方法類數(shù)組注冊(cè)到系統(tǒng)中。

       該類實(shí)現(xiàn)了本地接口的相關(guān)功能,并通過調(diào)用wpa的適配層的相關(guān)函數(shù)和wpa_supplicant通信,所以JNI是連接Java框架層和wpa適配層的橋梁.

 

 9) wpa_supplicant適配層,wifi.c:目錄libhardware/wifi/

       里面定義很多字符串變量和適配層的接口實(shí)現(xiàn),是對(duì)wpa_supplicant程序通信的接口封裝,用來完成上層和wpa_supplicant的通信,頭文件在libhardware/include/hardware下,這里的函數(shù)用來向JNI的本地實(shí)現(xiàn)提供調(diào)用接口。

       這里的函數(shù),我把它們分為三類函數(shù):

一類是命令相關(guān)的(控制)函數(shù),就是在JNIandroid_XXX_Command()函數(shù)所調(diào)用的::Wifi_Command()函數(shù),調(diào)用流程:android_XXX_command()=>docommand()=>wifi_command()=>wifi_send_command()=>wpa_ctrl_require()。

二類是監(jiān)聽函數(shù),即Wifi_wait_for_event()函數(shù),調(diào)用流程:android_net_wifi_Waitforevent()=>wifi_wait_for_event()=>wpa_ctrl_recv()

三類是剩下的函數(shù)。

 

10wpa_supplicant與上層的接口,wpa_ctrl.cexternal/wpa_supplicant

定義了三類套接字,并分別實(shí)現(xiàn)了和wpa_supplicant的通信,因此wpa_supplicant適配層和wpa_supplicant層是通過socket通訊的。

要是從wifi.c中真的很難看出它和wpa_supplicant有什么關(guān)系,和它聯(lián)系密切的是wpa_ctrl.h文件,這里面定義了一個(gè)類wpa_ctrl,這個(gè)類中聲明了兩個(gè)Socket套接口,一個(gè)是本地一個(gè)是要連接的套接口,wpa_ctrlwpa_supplicant的通信就需要socket來幫忙了,而wpa_supplicant就是通過調(diào)用wpa_ctrl.h中定義的函數(shù)和wpa_supplicant進(jìn)行通訊的,wpa_ctrl類(其實(shí)是其中的兩個(gè)socket)就是他們之間的橋梁。

 

 11)wpa_supplicantdriver_wext驅(qū)動(dòng)接口的聯(lián)系:

       driver.h:該文件定義了系列結(jié)構(gòu),首先是一個(gè)wpa_scan_result結(jié)構(gòu),這是一個(gè)掃描結(jié)果的通用格式,里面包含了掃描的所有信息(如BSSIDSSID,信號(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)接口的名稱和很多的函數(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類型的drvier成員,在wpa_supplicant進(jìn)程中,經(jīng)常通過Wpa_supplicant_XXX函數(shù)傳遞wpa_supplicant實(shí)例指針wpa_s參數(shù)給wpa_drv_XXX函數(shù)來調(diào)用它,在wpa_drv_XX中會(huì)通過wpa_s->driver->XXX()的流程來調(diào)用通用驅(qū)動(dòng)接口,簡(jiǎn)單才是生活的真相,可android始終讓我感到真相還是遙不可及。

 

 12)WifiWatchdogService

首先聲明了兩個(gè)主要變量mWifiStateTracker,mWifiManager,需要這兩個(gè)類對(duì)象來完成具體的控制工作,在WifiWatchdogService的構(gòu)造函數(shù)中,創(chuàng)建了這兩個(gè)類,并通過regesterForWifiBroadcasts()注冊(cè)了BroadcastReceiver,BroadcastReceiver是用來獲取網(wǎng)絡(luò)變化的,然后啟動(dòng)了一個(gè)WatchdogTread線程,用來處理從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 createThread creates

        registerForSettingsChanges();

        if (isWatchdogEnabled()) {

            registerForWifiBroadcasts();

        }

       

        if (V) {

            myLogV("WifiWatchdogService: Created");

        }

    }

       WifiWatchdogHandler繼承了handler類,成為一個(gè)消息處理類,定義handlemessage()函數(shù),處理消息隊(duì)列上的消息。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
wifi使用的相關(guān)流程
android WIFI模塊
android系統(tǒng)啟動(dòng)后的 wifi 加載過程代碼分析
getSystemService原理
wifi詳解(五)
adroid WiFi/LCD/Camera 調(diào)試總結(jié)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服