wifi 框架和操作


通過ctl.start啓動 服務
# service for common wifi
service loadwifi /system/bin/wifi_load_driver.sh                                                                                                                                                                                                                          
    class main
    disabled
    oneshot
    seclabel u:r:loadwifi:s0
service unloadwifi /system/bin/wifi_unload_driver.sh
    class main
    disabled
    oneshot
    seclabel u:r:unloadwifi:s0

    
wifi上層框架:
wifi服務,提供接口:
frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiServiceImpl.java
    setWifiEnabled
        mWifiController.sendMessage(CMD_WIFI_TOGGLED);

wifi狀態控制,提供接口:    
frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiController.java    
    CMD_WIFI_TOGGLED
        mWifiStateMachine.setSupplicantRunning(true);


wifi狀態機,主要對接底層通信:    
frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiStateMachine.java    
    CMD_START_SUPPLICANT
        mWifiNative.loadDriver()
        mWifiNative.startSupplicant(mP2pSupported)
        
wifi jni層,加載驅動
frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiNative.java
frameworks/opt/net/wifi/service/jni/com_android_server_wifi_WifiNative.cpp

    
loadDriver    
wifi_load_driver    
wifi_common_load_driver
    ctl.start loadwifi:RTL8821CU
    is_wifi_driver_scripts_running
        init.svc.loadwifi    
        
wifi_load_driver.sh
    RTL8821CU)
    insmod /system/lib/modules/cfg80211.ko
    insmod /system/lib/modules/8821cu.ko ifname=wlan0 if2name=p2p0
    sleep 1
            
startSupplicant        
    wifi_start_supplicant    

HAL層,啓動wpa_supplicant:
hardware/libhardware_legacy/wifi/wifi.c    
    /data/misc/wifi/wpa_supplicant.conf
    /data/misc/wifi/p2p_supplicant.conf


    init.svc.startSuppl

    ctl.start startSuppl:RTL8821CU
    
service startSuppl /system/bin/startSupplicant.sh
    class main
    disabled
    oneshot
    seclabel u:r:startSuppl:s0

startSupplicant.sh
wpa_supplicant -ip2p0 -Dnl80211 -c/data/misc/wifi/p2p_supplicant.conf -e /data/misc/wifi/entropy.bin -puse_p2p_group_interface=0 -N \
    -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \
    -g/data/system/wpa_supplicant/wlan0 -G1010 -O/data/misc/wifi/sockets

wpa_supplicant層:    
external/wpa_supplicant_8/wpa_supplicant/main.c
    
通過socket(不管是wpa_supplicant與上層還是wpa_supplicant與驅動都採用socket通訊)與驅動交互上報數據給用戶,
而用戶可以通過socket發送命令給wpa_supplicant調動驅動來對WiFi芯片操作。

wpa_supplicant和wpa_cli。
wpa_supplicant是核心程序,它和wpa_cli的關係就是服務和客戶端的關係:
後臺運行wpa_supplicant,使用wpa_cli來搜索、設置、和連接網絡。
    
   wpa_cli 操作指令使用指南 


自動連接    
frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiAutoJoinController.java
    attemptAutoJoin
        int networkDelta = compareNetwork(candidate, lastSelectedConfiguration);
        mWifiStateMachine.shouldSwitchNetwork(networkDelta)
            CMD_AUTO_CONNECT
    
    
經過上面的篩選,系統會將候選者(candidate)和用戶最後選擇的AP(lastSelectedConfiguration)進行對比。
int networkDelta = compareNetwork(candidate, lastSelectedConfiguration);
對比的結果分networkDelta 將會作爲參數傳給WifiStateMachine 的shouldSwitchNetwork;
經過shouldSwitchNetwork 對分數networkDelta 增加或者刪除之後,
如果shouldSwitchNetwork 的返回值爲ture(爲true 的意思將網絡切換到候選者candidate);
之後就會向WifiStateMachine 發送CMD_AUTO_CONNECT 命令;
mWifiStateMachine.sendMessage(WifiStateMachine.CMD_AUTO_CONNECT,candidate.networkId, networkSwitchType, candidate);
這條命令首先會斷開當前(currentConfiguration)的AP,而後連接候選者(candidate)AP。到此網絡自動切換完成。    
    
    
    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章