ThinkSSL🔒 一键申购 5分钟快速签发 30天无理由退款 购买更放心 广告
结合第5章对WifiService相关内容的介绍,假设当前STA没有连接上目标AP,则WifiStateMachine处于DisconnectedState。不过,DisconnectedState并不处理START_WPS消息,但其父状态ConnectedModeState会处理该消息,故直接来看ConnectedModeState的处理流程。 **1、START_WPS处理流程分析** 代码如下。 **WifiStateMachine.java::ConnectedModeState:processMessage** ~~~ public boolean processMessage(Message message) { StateChangeResult stateChangeResult; switch(message.what) { ...... case WifiManager.START_WPS: WpsInfo wpsInfo = (WpsInfo) message.obj; WpsResult result; switch (wpsInfo.setup) { case WpsInfo.PBC: result = mWifiConfigStore.startWpsPbc(wpsInfo); break; ......// WpsInfo.Keypad的处理 case WpsInfo.DISPLAY:// 对PIN来说,setup的值为DISPLAY // 调用WifiConfigStore的startWpsWithPinFromDevice函数 result = mWifiConfigStore.startWpsWithPinFromDevice(wpsInfo); break; default: result = new WpsResult(Status.FAILURE); break; } if (result.status == Status.SUCCESS) { // 回复WifiManager,界面框中将显示动态PIN码 replyToMessage(message, WifiManager.START_WPS_SUCCEEDED, result); transitionTo(mWpsRunningState);// 转入WpsRunningState } ......// 错误处理 break; ...... } return HANDLED; } ~~~ 来看startWpsWithPinFromDevice函数,代码如下所示。 **WifiConfigStore.java::startWpsWithPinFromDevice** ~~~ WpsResult startWpsWithPinFromDevice(WpsInfo config) { WpsResult result = new WpsResult(); /* config.BSSID代表目标AP的MAC地址,此处为空。下面的startWpsPinDisplay函数将发送 “WPS_PIN any”命令给WPAS。WPAS将计算一个动态PIN码返回给用户。这个PIN码也就是 图6-2右图所示的PIN码。 */ result.pin = mWifiNative.startWpsPinDisplay(config.BSSID); if (!TextUtils.isEmpty(result.pin)) { // WPAS必须返回一个PIN码 markAllNetworksDisabled(); // 停止使用其他网络 result.status = WpsResult.Status.SUCCESS; } else{ result.status = WpsResult.Status.FAILURE; return result; } } ~~~ 当WPAS成功返回PIN码后,WifiStateMachine将从DisconnectedState状态进入WpsRunningState。该状态的enter函数没有做什么有意义的工作。 **2、WPS_SUCCESS_EVENT处理流程分析** 当WPAS完成WSC流程后,它将发送WPS-SUCCESS给WifiMonitor,而WifiMonitor将发送WPS_SUCCESS_EVENT给WifiStateMachine。该消息将由WpsRunningState状态处理,相关代码如下所示。 **WifiStateMachine.java::WpsRunningState:processMessage** ~~~ public boolean processMessage(Message message) { switch (message.what) { case WifiMonitor.WPS_SUCCESS_EVENT: // 收到来自WPAS的WPS成功消息 // 回复WifiManager。如此,WpsDialog中WpsListener对象的onCompleted函数将被调用 replyToMessage(mSourceMessage, WifiManager.WPS_COMPLETED); mSourceMessage.recycle(); mSourceMessage = null; transitionTo(mDisconnectedState);// 转入DisconnectedState break; ...... } } ~~~ 如果WSC流程一切顺利,WifiStateMachine将从WpsRunningState重新进入DisconnectedState。WifiStateMachine以后 的流程就和5.3.2节所述的流程完全一样了。 >[info] 提示 WifiStateMachine内部也会发起扫描请求,这和第5章分析的流程略有不同。第5章中,扫描请求由WifiSettings发起。 由上文介绍可知,Android App层以及Framework WifiService相关模块对WSC的处理非常简单。它们将通过发送"WPS_PIN any"命令以触发WPAS开始WSC的处理流程。下面分析WPAS中WSC的处理。