1. 程式人生 > >Android4.4 wpa_supplicant深入分析之初識wpa_supplicant

Android4.4 wpa_supplicant深入分析之初識wpa_supplicant

本文主要分析wpa_supplicant_8,主要有三個子目錄:

hostapd:當手機進入Soft AP模式時,手機將扮演AP的角色,需要hostapd來提供AP的功能。這就是wifi熱點的實現。

wpa_supplicant:Station模式,也叫Managed模式。這是正常使用wifi連線AP的情況。

src:hostapd和wpa_supplicant中都包含一些通用的資料結構和處理方法,這些內容都放在此src目錄中。注意,hostapd/src和wpa_supplicant/src子目錄均連線到此src目錄。

     wpa_supplicant是Android使用者空間中無線網路部分的核心模組,所以framework層中和Wi-Fi相關的操作最終都將藉由wpa_supplicant來完成。

下圖是wpa_supplicant軟體架構,去除加密部分的流程框圖:

如圖的軟甲框架包括如下重要模組:

1、wpa_supplicant所有工作都圍繞時間(event loop模組)展開。它是基於事件驅動的。wpa_supplicant沒有使用多執行緒程式設計,所有時間處理都在主執行緒中完成。

2、位於event loop米快下的driver i/f介面模組用於隔離和底層驅動直接互動的那些driver控制模組。這些driver wrapper和平臺以及晶片所使用的驅動相關。由於driver i/f的隔離作用,wpa_supplicant其他模組將能最大程度保持平臺以及驅動的無關性。

3、driver wrapper經常要返回一些資訊給上層。這些資訊通過driver events的方式反饋給wpa_supplicant其他模組進行處理。

4、wpa_supplicant支援較多的配置引數,這些引數的處理由configuration模組完成。

wpa_supplicant命令和控制API

wpa_supplicant對外通過控制介面模組與客戶端通訊。在Android平臺中,wpa_supplicant的客戶端是位於framework中的WifiService。使用者在Settings介面進行WiFi相關的操作最終都會經由WiFiService通過傳送命令的方式轉交給wpa_supplicant去執行。

5、命令

wpa_supplicant定義了許多命令,常見命令如下:

(1)PING:心跳檢測命令。客戶端(android應該是WifiService)用它判斷wpa_supplicant是否工作正常。wpa_supplicant收到“PING”命令後需要回復“PONG”.

(2)MIB(Management Information Base,管理資訊庫):客戶端用該命令來獲取裝置的MIB資訊。

(3)STATUS:客戶端用該命令來獲取wpa_supplicant的工作狀態。

(4)ADD_NETWORK:為wpa_supplicant新增一個新的無線網路。它將返回此無線網路的ID(從0開始)。注意,此network ID非常重要,客戶端後續將通過它來知名自己想操作的無線網路。

(5)SET_NETWORK<network id><variable><value>:network id是無線網路的ID。此命令用於設定指定無線網路的資訊。其中variable為引數,vablue為引數的值。

(6)ENABLE_NETWORK<network id>:使能某個無線網路。此命令最終將促使wpa_supplicant發起一系列操作以加入該無線網路。

6、控制API

Android平臺WiFiService是wpa_supplicant的客戶端,它和wpa_supplicant互動時必須使用wpa_supplicant提供的API。這些API聲明於wpa_ctrl.h中。

客戶端使用wpa_ctrl時首先要分配控制物件。下面兩個API用於建立和銷燬控制物件wpa_ctrl。

//建立一個wpa控制端物件wpa_ctrl。Android平臺中,引數ctrl_path代表unix域socket的位置

struct wpa_ctrl * wpa_ctrl_open(const char *ctrl_path);
void wpa_ctrl_close(struct wpa_ctrl *ctrl);
下面這個函式用於傳送命令給wpa_supplicant。
int wpa_ctrl_request(struct wpa_ctrl *ctrl, const char *cmd, size_t cmd_len,
		     char *reply, size_t *reply_len,
		     void (<strong>*msg_cb</strong>)(char *msg, size_t len));
msg_cb是一個回撥函式,該引數的設定和wpa_supplicant中C/S通訊機制的設計有關。

wpa_supplicant規定只有開啟通知事件監聽功能的wpa_ctrl物件,才能在wpa_ctrl_request中通過msg_cb獲取通知物件。而開啟通知事件監聽功能相關的API如下:

//開啟通知事件監聽功能

int wpa_ctrl_attach(struct wpa_ctrl *ctrl);
//開啟通知事件監聽功能的wpa_ctrl物件能直接呼叫下面的函式來接收unsolicited event
int wpa_ctrl_recv(struct wpa_ctrl *ctrl, char *reply, size_t *reply_len);

如果客戶端並不傳送命令,而只是想接收unsolicited event,可通過wpa_ctrl_recv函式來達到此目的。

第二篇將正式開始wpa_supplicant的程式碼分析。