1. 程式人生 > >[RK3288][Android6.0] WiFi之Framework連線過程小結

[RK3288][Android6.0] WiFi之Framework連線過程小結

Platform: Rockchip
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卷》