色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          Android WIFI 詳解

          作者: 時(shí)間:2016-10-08 來源:網(wǎng)絡(luò) 收藏

          注意:這里的每個(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.java

          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ù),就是在JNI層android_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ù)。

          10)wpa_supplicant與上層的接口,wpa_ctrl.c:external/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_ctrl與wpa_supplicant的通信就需 要socket來幫忙了,而wpa_supplicant就是通過調(diào)用wpa_ctrl.h中定義的函數(shù)和wpa_supplicant進(jìn)行通訊 的,wpa_ctrl類(其實(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)接口的名稱和很多的函數(shù)指針。

          drviers.c:該文件很簡單,首先是一些外部變量的引用聲明,都是不同驅(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)接口,簡單才是生活的真相,可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 createThreadcreates

          registerForSettingsChanges();

          if (isWatchdogEnabled()) {

          registerForWifiBroadcasts();

          }

          if (V) {

          myLogV(WifiWatchdogService: Created);

          }

          }

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

          二,wpa_supplicant再解析

          1)wpa_ctrl.h:

          該文件中并沒有定義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ù)。



          關(guān)鍵詞:

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉