通過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。到此網絡自動切換完成。