第七章 Wi-Fi连接过程

系列文章目录

第一章 国内下载AOSP最新源码的方法
第二章 下载AOSP WiFi相关的代码
第三章 将源码导入Android Studio(无需编译idegen)



前言

Wi-Fi连接分为下面几种过程,每种的流程都有些许差异:

  • 手动连接
  • 自动连接
  • 在BSS之间漫游
  • Passpoint热点连接

一、Wi-Fi连接是什么?

Wi-Fi连接是指STA(手机)连接到AP(无线路由器)的过程,这个过程分为链路关联和接入认证,接人认证就跟AP端设置的加密方式有关,不同的加密方式接人认证的过程不一样,这个接入认证过程都是wpa_supplicant里面通过对应加密方式的状态机跟AP交互。开放热点是指AP没有设置密码,这种又分为Portal认证和非Portal认证的开放热点。

二、Wi-Fi连接的过程

1. 手动连接

ClientModeImpl:
        // CHECKSTYLE:OFF IndentationCheck
        addState(mDefaultState);
            addState(mConnectModeState, mDefaultState);
                addState(mL2ConnectedState, mConnectModeState);
                    addState(mObtainingIpState, mL2ConnectedState);
                    addState(mConnectedState, mL2ConnectedState);
                    addState(mRoamingState, mL2ConnectedState);
                addState(mDisconnectingState, mConnectModeState);
                addState(mDisconnectedState, mConnectModeState);
        // CHECKSTYLE:ON IndentationCheck

        setInitialState(mDefaultState);

message:
ClientModeImpl:
ConnectModeState
 CMD_CONNECT_NETWORK
  CMD_START_CONNECT
 
 
function:
ClientModeImpl:
connectToUserSelectNetwork
 startConnectToNetwork
  connectToNetwork(config)
   mWifiNative.connectToNetwork(mInterfaceName, config)
    mSupplicantStaIfaceHal.connectToNetwork(ifaceName, configuration)
     mSupplicantStaIfaceHal.addNetworkAndSaveConfig(ifaceName, configuration) =>SupplicantStaNetworkHal network = addNetwork(ifaceName)
            network.setVendorStaNetwork(getVendorNetwork(ifaceName, network.getNetworkId()));
             network.saveWifiConfiguration(config)
      SupplicantStaNetworkHal.select()


supplicant-> ClientModeImpl: (WifiMonitor.NETWORK_CONNECTION_EVENT)
ConnectModeState:
 WifiMonitor.NETWORK_CONNECTION_EVENT
  transitionTo(mObtainingIpState)
   mL2ConnectedState.enter()  => mNetworkAgent = new WifiNetworkAgent()
    ObtainingIpState.enter()
     startIpClient()
      getWifiLinkLayerStats


IpClient -> ClientModeImpl:
L2ConnectedState:
 CMD_PRE_DHCP_ACTION_COMPLETE
  mIpClient.completedPreDhcpAction()
   CMD_POST_DHCP_ACTION
    handlePostDhcpSetup()
     CMD_IPV4_PROVISIONING_SUCCESS
      handleIPv4Success(dhcpResults)
       updateCapabilities(config)
        CMD_IP_CONFIGURATION_SUCCESSFUL
         handleSuccessfulIpConfiguration()
           sendConnectedState() => mNetworkAgent.markConnected()
            sendNetworkChangeBroadcast(DetailedState.CONNECTED)
                                     transitionTo(mConnectedState)


NetworkMonitor:
L2ConnectedState.enter() 
 => mNetworkAgent => new WifiNetworkAgent()
   NetworkAgent.register()
    cm.registerNetworkAgent()
     ConnectivityService.registerNetworkAgent()
      mDeps.getNetworkStack().makeNetworkMonitor()


NetworkStack:
NetworkStackClient.makeNetworkMonitor(network, name, cb)
 NetworkStackService.makeNetworkMonitor(network, name, cb)
  final NetworkMonitor nm = mDeps.makeNetworkMonitor(mContext, cb, network, log, this);
   ConnectivityService$NetworkMonitorCallbacks.onNetworkMonitorCreated(nm) => mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_AGENT,new Pair<>(mNai.getAndDestroy(), networkMonitor)));

ConnectivityService:
InternalHandler:
 EVENT_REGISTER_NETWORK_AGENT
  handleRegisterNetworkAgent(nai, networkMonitor)
   nai.onNetworkMonitorCreated(networkMonitor)
    networkMonitor.start()
     updateNetworkInfo(nai, networkInfo)
      networkAgent.networkCapabilities.addCapability(NET_CAPABILITY_FOREGROUND)
           createNativeNetwork(networkAgent) mNetd.networkCreatePhysical(networkAgent.network.netId,getNetworkPermission(networkAgent.networkCapabilities))

       mDnsResolver.createNetworkCache(networkAgent.network.netId)
       mDnsManager.updateTransportsForNetwork(networkAgent.network.netId,networkAgent.networkCapabilities.getTransportTypes())
      networkAgent.created = true
      networkAgent.getAndSetNetworkCapabilities(networkAgent.networkCapabilities)
      handlePerNetworkPrivateDnsConfig(networkAgent, mDnsManager.getPrivateDnsConfig())
      updateLinkProperties(networkAgent, new LinkProperties(networkAgent.linkProperties), null)
      networkAgent.networkMonitor()

.notifyNetworkConnected(lp, nc) <= NetworkMonitor.CMD_NETWORK_CONNECTED
      scheduleUnvalidatedPrompt(networkAgent)
      rematchAllNetworksAndRequests()
       applyNetworkReassignment(changes, now)
        makeDefault(newDefaultNetwork)



NetworkMonitor:
        // CHECKSTYLE:OFF IndentationCheck
        addState(mDefaultState);
        addState(mMaybeNotifyState, mDefaultState);
            addState(mEvaluatingState, mMaybeNotifyState);
                addState(mProbingState, mEvaluatingState);
                addState(mWaitingForNextProbeState, mEvaluatingState);
            addState(mCaptivePortalState, mMaybeNotifyState);
        addState(mEvaluatingPrivateDnsState, mDefaultState);
        addState(mEvaluatingBandwidthState, mDefaultState);
        addState(mValidatedState, mDefaultState);
        setInitialState(mDefaultState);
        // CHECKSTYLE:ON IndentationCheck

notifyNetworkConnected
 DefaultState:CMD_NETWORK_CONNECTED
  updateConnectedNetworkAttributes(message)
                     logNetworkEvent(NetworkEvent.NETWORK_CONNECTED)
                      transitionTo(mEvaluatingState)
   EvaluatingState.enter()
    sendMessage(CMD_REEVALUATE, ++mReevaluateToken, 0)
     EvaluatingState.CMD_REEVALUATE
      transitionTo(mProbingState)
       ProbingState.enter()
        mThread = new Thread(() -> sendMessage(obtainMessage(CMD_PROBE_COMPLETE, token, 0,isCaptivePortal(deps)))) => isCaptivePortal()
        mThread.start()
         ProbingState.CMD_PROBE_COMPLETE
          transitionTo(mEvaluatingPrivateDnsState)
           EvaluatingPrivateDnsState.enter()
            sendMessage(CMD_EVALUATE_PRIVATE_DNS)
             EvaluatingPrivateDnsState.CMD_EVALUATE_PRIVATE_DNS
              transitionTo(mValidatedState)

ValidatedState.enter()
 mEvaluationState.reportEvaluationResult(result, null)
  notifyNetworkTested(p)
   ConnectivityService$NetworkMonitor
Callbacks.notifyNetworkTestedWithExtras(result)
    inal Message msg = mTrackerHandler.obtainMessage( EVENT_NETWORK_TESTED,new NetworkTestedResults(mNetId, p.result, p.timestampMillis, p.redirectUrl));
    mTrackerHandler.sendMessage(msg);
     NetworkStateTrackerHandler.maybeHandleNetworkMonitorMessage()
      EVENT_NETWORK_TESTED
       delayHandleNetworkTested() <= invalid
       handleNetworkTested() <= valid
        nai.asyncChannel.sendMessage(NetworkAgent.CMD_REPORT_NETWORK_STATUS, (valid ? NetworkAgent.VALID_NETWORK :NetworkAgent.INVALID_NETWORK),0, redirectUrlBundle);
         ClientModeImpl$WifiNetworkAgent.onValidationStatus(status, redirectUrl)
          doNetworkStatus(status)

NetworkMonitor:isCaptivePortal
 sendHttpAndHttpsParallelWithFallbackProbes()
 sendNetworkConditionsBroadcast()
  NetworkMonitorUtils.ACTION_NETWORK_CONDITIONS_MEASURED

log:
ClientModeImpl:
connectToUserSelectNetwork
 Connecting with xxxxxxx as the mac address

这里简单记录一下Wi-Fi连接过程中L2/L3层的过程,后面有空再扩展。


总结

以上就是今天要讲的内容,本文仅仅简单介绍了Wi-Fi连接过程。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值