Android的WiFi子系統架構

 

本文部分內容修正自《Androd系統原理及開發要點詳解》,部分內容爲原創!

 

前言:

最近項目中要實現幾個與WiFi相關的機能:WPS,WiFI proxy,Airplane Mode相關的小機能等。我藉着這次機會,對Android的WiFi框架進行了一下學習,對其有一個初步的瞭解。所以特地整理了出來,以備與各位探討,並歡迎指教。

 

一、WiFi基本框架

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

             wifi1.png

 

WiFi部分在Android系統中作爲網絡部分使用的方法和通常的網絡相同。唯一特殊的部分是在Settings程序中的WiFi相關設置內容,它們調用了WiFi提供了WiFi架構提供的Java層接口。

 

add tip:

JAVA應用層 Setting、WifiSwitcher等應用
上下的通訊爲Binder機制

JAVA框架層
Wifi manager
Wifi service

上下通訊爲JNI

C/C++ 框架層
Wifi的JNI
WPA適配層
Wpa_supplicant程序

內核空間 Wifi的內核驅動程序

 

 

二、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通信時使用。

          wifi2.png

 

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選擇等以供用戶自定義。

 

發佈了70 篇原創文章 · 獲贊 6 · 訪問量 33萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章