6.4.2 WifiStateMachine的处理
结合第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节所述的流程完全一样了。
提示 WifiStateMachine内部也会发起扫描请求,这和第5章分析的流程略有不同。第5章中,扫描请求由WifiSettings发起。
由上文介绍可知,Android App层以及Framework WifiService相关模块对WSC的处理非常简单。它们将通过发送"WPS_PIN any"命令以触发WPAS开始WSC的处理流程。下面分析WPAS中WSC的处理。