[RK3288][Android6.0] WiFi之Framework連線過程小結
OS: Android 6.0
Kernel: 3.10.92
onPreferenceTreeClick -> WifiSettings.java
preference.getAccessPoint //獲取當前選擇的ap
showDialog //彈出對話方塊設定密碼
onSubmit -> //點選連線後會呼叫
submit ->
connect -> //引數是WifiConfiguration類, 表示WiFi配置過的資訊
mWifiManager.connect ->
sAsyncChannel.sendMessage -> //cmd: CONNECT_NETWORK
handleMessage -> WifiServiceImpl.java //ClientHandler
mWifiStateMachine.sendMessage ->
processMessage -> WifiStateMachine.java //DisconnectedState
processMessage -> //ConnectModeState
mWifiConfigStore.saveNetwork ->
addOrUpdateNetworkNative -> //完成add_network以及set_network工作,和之前分析的wpa_cli的過程原理是一樣的
mWifiNative.addNetwork
mWifiNative.setNetworkVariable
mWifiNative.enableNetwork
sendConfiguredNetworksChangedBroadcast //廣播:WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION
mWifiConfigStore.selectNetwork -> //根據config選擇對應的network
mWifiNative.selectNetwork
enableNetworkWithoutBroadcast -> //enable選擇的network,disabel其他network
mWifiNative.enableNetwork //這個好像和saveNetwork裡有重複
markAllNetworksDisabledExcept
mWifiNative.reconnect() //之前可能連線到其他AP,重新連線
sendConfiguredNetworksChangedBroadcast -> //WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION
//當WPAS成功加入網路後,會通知WifiMonitor
handleEvent -> //cmd:CONNECTED
handleNetworkStateChange ->
notifyNetworkStateChange ->
mStateMachine.sendMessage -> //NETWORK_CONNECTION_EVENT
processMessage -> //ConnectModeState
mWifiInfo.setBSSID
mWifiInfo.setNetworkId
sendNetworkStateChangeBroadcast //廣播: WifiManager.NETWORK_STATE_CHANGED_ACTION
transitionTo(mObtainingIpState) ->
enter -> //先執行父狀態L2ConnectedState
new WifiNetworkAgent
enter -> //ObtainingIpState
startDhcp -> //用的是動態ip,開啟dhcp服務從ap獲取到一個ip地址,然後dhcp狀態機會發送CMD_POST_DHCP_ACTION
mDhcpStateMachine.sendMessage -> //cmd: DhcpStateMachine.CMD_START_DHCP
processMessage -> //StoppedState
mController.sendMessage //cmd: DhcpStateMachine.CMD_PRE_DHCP_ACTION
transitionTo(mWaitBeforeStartState);
processMessage -> //L2ConnectedState
handlePreDhcpSetup //WifiStateMachine傳送DhcpStateMachine.CMD_PRE_DHCP_ACTION_COMPLETE
processMessage -> //WaitBeforeStartState
runDhcpStart
dhcpSucceeded ->
mController.obtainMessage().sendToTarget() //CMD_POST_DHCP_ACTION
processMessage -> //L2ConnectedState
handlePostDhcpSetup
handleIPv4Success -> //引數:DhcpStateMachine.DHCP_SUCCESS
updateLinkProperties -> //更新網路配置
sendMessage -> //CMD_IP_CONFIGURATION_SUCCESSFUL
processMessage -> //L2ConnectedState
handleSuccessfulIpConfiguration
transitionTo(mConnectedState);
參考:
《深入理解android Wi-Fi、NFC和GPS卷》