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。到此网络自动切换完成。    
    
    
    

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