適配層是 通用的wpa_supplicant的 封裝,在Android中 做爲 WiFi部分的 硬件抽象層來使用。wpa_supplicant適配層 主要用於 與wpa_supplicant守護進程 的 通訊,以提供給Android框架使用,它實現了 加載、控制 和 消息監控等功能。 java
一、當java層調用 loadDriver時, 它其實是經過JNI來調用Native函數, JNI->android_net_wifi_loadDriver -> wifi_load_driver。
在wifi_load_driver函數中,它將首先經過system property -- wlan.driver.status 的狀態來判斷驅動是否已經加載。如果沒有加載,將會加載該驅動。android
二、當java層調用startSupplicant時,它其實是經過JNI調用到wifi_start_supplicant函數,在wifi_start_supplicant函數裏,首先肯定wpa supplicant的配置文件存在,若是不存在,將默認配置文件拷貝到相應目錄下,下面是配置文件的默認路徑和工做路徑:
static const char SUPP_CONFIG_TEMPLATE[]= "/system/etc/wifi/wpa_supplicant.conf";
static const char SUPP_CONFIG_FILE[] = "/data/misc/wifi/wpa_supplicant.conf";
而後,調用control_supplicant函數, 若是這時wpa_supplicant尚未啓動, 將會啓動wpa_supplicant.api
hardware/libhardware_legacy/wifi/wifi.c------------------------>wpa_supplicant適配器層
int wifi_load_driver(){
//for build in driver, do nothing
//for .ko driver, insmod/load firmware...
}
int wifi_start_supplicant(){
property_set("ctl.start", "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()發送命令給wpa_supplicant進程,並返回結果
//wifi_wait_for_event()接受wpa_supplicant上報的事件
-->
root/init.rc
service wpa_supplicant /system/bin/wpa_supplicant -Dwext -iwlan0 -d -c /data/misc/wifi/wpa_supplicant.conf-------------------->啓動 wpa_supplicant程序
socket wpa_wlan0 dgram 0666 wifi wifi
group system wifi
disabled
oneshot框架
3、 java層經過connectToSupplicant調用wifi_connect_to_supplicant函數,在該函數中,將經過wpa_ctrl_open函數分別建立 兩個AF_UNIX地址族 和 數據報方式的socket,一個是ctrl_conn, 用於向wpa_supplicant發送命令並接收response, 另外一個是monitor_conn, 它一直阻塞等待從wpa_supplicant過來的event。最後,經過monitor_conn向wpa_supplicant發送命令ATTACH,用於將本身的socket信息註冊到wpa_supplicant, 因爲socket是數據報方式的,這一步是必須的,對於存在於wpa_supplicant的服務器端,它是全部客戶端共享的,因爲它須要主動向monitor_conn客戶端發送事件,因此它必須先記錄下該客戶端的詳細信息,wpa_supplicant就能夠將EVENT發向該socket。在完成上面這些操做後,java層會經過jni方式調用函數android_net_wifi_waitForEvent(應該是起一個線程,在線程裏調用),該函數會調用wifi_wait_for_event,在wifi_wait_for_event函數裏,會阻塞接收從wpa_supplicant模塊傳來的事件,一旦wpa_supplicant模塊有事件發,wifi_wait_for_event接收到後,會將包含事件的buf經過函數參數的方式回傳到java層,java收到事件後,再繼續調用wifi_wait_for_event函數進行阻塞等待接收,從而完成一個循環。
socket
4. 以上的流程完成之後,WIFI java layer 調用的WIFI native api 就和wpa_supplicant進程就創建了聯繫,WIFI java layer就能夠向wpa_supplicant發送命令和接收response, 而且wpa_supplicant也能夠主動向WIFI java layer發送事件了。
函數