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