Android的WiFi子系統架構

來源:互聯網
上載者:User

原文地址::http://hi.baidu.com/wuguohu/blog/item/6b518726d6ffda018b82a176.html

 

 

一、WiFi基本架構

Android的WiFi系統自上而下包括如下一些內容:

            

 

WiFi部分在Android系統中作為網路部分使用的方法和通常的網路相同。唯一特殊的部分是在Settings程式中的WiFi相關設定內容,它們調用了WiFi提供了WiFi架構提供的Java層介面。

 

二、WiFi本地實現

Android的WiFi本地部分實現主要包括wpa_spplicant以及wpa_supplicant適配層。

 

WPA是WiFi Protected Access的縮寫,中文含義為“WiFi網路安全存取”。WPA是一種基於標準的可互操作的WLAN安全性增強解決方案,可大大增強現有以及未來無線區域網路絡的資料保護和存取控制水平。

 

1、  wpa_supplicant

wpa_supplicant是一個開源項目,已經被移植到Linux,Windows以及很多嵌入式系統上。它是WPA的應用程式層認證用戶端,負責完成認證相關的登入、加密等工作。wpa_supplicant的原始碼目錄為:

.\external\wpa_supplicant\

.\external\wpa_supplicant_6\

 

這個工程中的內容編譯後主要結果是產生動態庫libwpa_client.so和可執行程式wpa_supplicant。

wpa_supplicant是一個獨立啟動並執行守護進程,其核心是一個訊息迴圈,在訊息迴圈中處理WPA狀態機器、控制命令、驅動事件、配置資訊等。wpa_supplicant有很多控制介面,也提供命令列和通行介面的控制模式:而Android與wpa_supplicant的通訊通過Socket完成。

關於wpa_supplicant更多的資訊,請參考: http://w1.fi/wpa_supplicant/

libwpa_client.so是一個給客戶單連結和調用的庫,用於和wpa_supplicant守護進程進行通訊。

 

2、  wpa_supplicant適配層

wpa_supplicant適配層是通用的wpa_supplicant的封裝,在Android中作為WiFi部分的硬體抽象層來使用。wpa_supplicant適配層主要用於與wpa_supplicant守護進程的通訊,以提供給Android架構使用,它實現了載入、控制和訊息監控等功能。

wpa_supplicant適配層的原始碼路徑是:

.\hardware\libhardware_legacy\include\hardware_legacy\wifi.h

.\hardware\libhardware_legacy\wifi\

 

wpa_supplicant適配層是libhardware_legacy.so的一部分,它需要包含wpa_supplicant的標頭檔wpa_ctrl.h,動態連結程式庫libwpa_client.so。通過wifi.h檔案為上一層提供者調用介面(實際上就是WiFi的JNI部分)。

wpa_supplicant適配層的構成非常的簡單,除了一些載入和串連的介面,它最重要的部分是以下兩個介面:

int wifi_command(const char *command, char *reply, size_t *reply_len);

int wifi_wait_for_event(char *buf, size_t len);

wifi_command()提供講明亮發送到WiFi系統下層的功能,wifi_wait_for_event()負責事件進入的通道,這個函數將被阻塞,直到收到一個WiFi事件,並以字串的形式返回。

 

在wifi.c的實現中:

1)、wifi_command()是wifi_send_command()的封裝, wifi_send_command()通過wpa_ctrl_request()直接命令轉寄給wpa_supplicant進程,並返回結果。

2)、wifi_wait_for_event()僅僅調用wpa_ctrl_recv()來接受上一次wpa_supplicant上報的事件,如果沒有事件則阻塞於此,上層會通過迴圈由此來讀取每一個上報的事件。

 

本層還提供一些一些與DHCP(動態主機分配協議)相關的操作。

 

三、WiFi的JNI層

Android中的WiFi系統的JNI部分實現的源碼檔案為:

.\frameworks\base\core\jni\android_net_wifi_Wifi.cpp

這裡實現的本地函數,都是通過調用wpa_supplicant適配層的介面來實現的(包含適配層的標頭檔wifi.h)。

 

JNI層的介面註冊到Java層的原始碼檔案為:

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

WifiNative將為WifiService、WifiStateTracker、WifiMonitor等幾個WiFi架構內部組件提供底層操作支援。

 

四、WiFi的Java FrameWork層

WiFi系統的Java部分代碼實現的目錄為:

.\frameworks\base\wifi\java\android\net\wifi\          // WiFi服務層的內容

.\ frameworks\base\services\java\com\android\server\   // WiFi部分的介面

 

WiFi系統Java層的核心是根據IWifiManger介面所建立的Binder伺服器端和用戶端,伺服器端是WifiService,用戶端是WifiManger。

IWifiManger.aidl編譯後產生了IWifiManger.java,並產生IWifiManger.Stub(伺服器端抽象類別)和IWifiManger.Stub.Proxy(用戶端代理實作類別)。WifiService通過繼承IWifiManger.Stub實現,而用戶端通過getService()函數擷取IWifiManger.Stub.Proxy(即Service的代理類),將其作為參數傳遞給WifiManger,供其與WifiService通訊時使用。

         

 

1.    WiFiManger是WiFi部分與外界的介面,使用者通過它來訪問WiFi的核心功能。WifiWatchdogService這一系統組件也是用WifiManger來執行一些具體操作。

2.    WifiService是伺服器端的實現,作為WiFi部分的核心,處理實際的驅動載入、掃描、連結、斷開等命令,已經底層上報的事件。對於主動的命令控制,WiFi是一個簡單的封裝,針對來自用戶端的控制命令,調用相應的WifiNative底層實現。

一般接收到用戶端的命令後,將其轉換成對應的自身訊息塞入訊息佇列中,以便用戶端的調用可以及時返回,然後在WifiHandler的handleMessage()中處理對應的訊息。而底層上報的事件,WifiService則通過啟動WifiStateTracker來負責處理。

1)  WifiStateTracker除了負責WiFi的電源管理模式等功能外,其核心是WifiMonitor所實現的事件輪詢機制,以及訊息處理函數handleMessage()。

2)  WifiMonitor通過開啟一個MonitorThread來實現事件的輪詢,輪詢的關鍵函數是前面提到的 阻塞式函數WifiNative.waitForEvent()。擷取事件後,WifiMonitor通過一系列的Handler通知給WifiStateTracker。這裡WifiMonitor的通知機制是將底層事件轉換成WifiStateTracker所能識別的訊息,塞入WifiStateTracker的訊息迴圈中,最終在handleMessage()中由WifiStateTracker完成對應的處理。

註:WifiStateTracker同樣是WiFi部分與外界的介面,它不像WifiManger那樣直接被執行個體化來操作,而是通過Intent機制來發訊息通知給用戶端註冊的BroadcastReceiver,以完成和用戶端的介面。

3.    WifiWatchdogService是ConnectivityService所啟動的服務,但它並不是通過Binder來實現的服務。它的作用是監控同一個網路內的存取點(Access Point),如果當前存取點的DNS無法ping通,就自動切換到下一個存取點。WifiWatchdogService通過WifiManger和WifiStateTracker輔助完成具體的控制動作。WifiWatchdogService初始化時,通過registerForWifiBroadcasts註冊擷取網路變化的BroadcastReceiver,也就是捕獲WifiStateTracker所發出的通知訊息,並開啟一個WifiWatchdogThread線程來處理擷取的訊息。通過更改Setting.Secure.WIFI_WARCHDOG_ON的配置,可以開啟和關閉WifiWatchdogService。

 

五、Setting中的WiFi設定

Android的Settings應用程式對WIFI的使用,是典型的WiFi應用方式,也是使用者可見的Android WiFi管理程式。這部分原始碼的目錄為:

. \packages\apps\Settings\src\com\android\settings\wifi\

 

Setting裡的WiFi部分是使用者可見的設定介面,提供WiFi開關、掃描AP、連結/斷開的準系統。另外i,通過實現WifiLayer.Callback介面提供了一組回呼函數,用以相應使用者關心的WiFi狀態的變化。

WifiEnabler和WifiLayer都是WifiSettings的組成部分,同樣通過WifiManger來完成實際的功能,也同樣註冊一個BroadcastReceiver來響應WifiStateTracker所發出的通知訊息。WifiEnabler其實是一個比較簡單的類,提供開啟和關閉WiFi的功能,設定裡面的外層WiFi開關菜單,就是直接通過它來做到的;而WifiLayer則提供更複雜的一些WiFi功能,如AP選擇等以供使用者自訂。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.