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_connwpa_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發送事件了。

arrow
arrow
    全站熱搜

    NeilChen0710 發表在 痞客邦 留言(0) 人氣()