1. WIFI JAVA layer:
1.1. 當android系統啟動WIFI 模組時,它將調用 Wifiserver 類的setWifiEnabledBlocking函數。
1.2. 在該函數中,如果是使能WIFI, 它將做四件事:
a. load wifi driver.
b. 啟動wpa_supplicant.
c. 啟動 event loop.
d. 更新wifi的狀態.
2. WIFI Native layer:
2.1. 當java層調用 loadDriver時, 它實際上是通過JNI來調用Native函數, JNI->android_net_wifi_loadDriver ->wifi_load_driver。
在wifi_load_driver函數中,它將首先通過system property -- wlan.driver.status 的狀態來判斷驅動是否已經載入。如果沒有載入,將會載入該驅動。
2.2. 當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.
2.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函數進行阻塞等待接收,從而完成一個迴圈。
2.4. 以上的流程完成以後,WIFI java layer 調用的WIFI native api 就和wpa_supplicant進程就建立了聯繫,WIFI java layer就可以向wpa_supplicant發送命令和接收response, 並且wpa_supplicant也可以主動向WIFI java layer發送事件了。
- Dec 27 Tue 2011 15:36
wifi 流程
close
全站熱搜
留言列表
發表留言