本文分析的是首次连接AP(没有保存参数的AP)的过程。
一、简易流程图
二、代码执行流程
2.1 Settings应用
2.2 WifiManager.java
通过异步通道AsyncChannel来调用WifiServiceImpl的ClientHandler来处理SAVE_NETWORK消息。
2.3 WifiServiceImpl.java
mWifiStateMachine.sendMessage发送消息直接让WifiStateMachine状态机来处理。
2.4 WifiStateMachine.java
主要看这两个方法
调用saveNetworkConfigAndSendReply来保存连接配置参数并发送广播。
调用了startConnectToNetwork方法去连接AP。先看下saveNetworkConfigAndSendReply方法;
这里主要执行了两个操作,
调用mWifiConfigManager.addOrUpdateNetwork进行配置参数的保存,调用 broadcastWifiCredentialChanged发送广播刷新。再接着看startConnectToNetwork方法。
发送CMD_START_CONNECT消息,ConnectModeState会处理CMD_START_CONNECT 消息。
这里调用了mWifiNative.connectToNetwork()方法。
2.5 WifiNative.java
需要关注下这个方法的注释,注释说明了这个方法做了6件事:
(1)中止任何正在进行的扫描以免阻塞连接请求
(2)移除wpa_supplicant里的所有现有网络(这会隐式触发断开连接)
(3)在wpa_supplicant里添加一个新的网络
(4)在wpa_supplicant中保存提供的configuration
(5)在wpa_supplicant中选择新的网络
(6)触发wpa_supplicant 的重新连接命令
我们再看下mSupplicantStaIfaceHal.connectToNetwork()方法。
2.6 SupplicantStaIfaceHal.java
这里先执行了addNetworkAndSaveConfig()方法添加网络。然后再执行了networkHandle.select()方法。
2.7 SupplicantStaNetworkHal.java
mISupplicantStaNetwork.select()方法就是通过hidl调用底层supplicant。
WIFI连接热点的Java段流程就基本结束了