6.4.2 WifiStateMachine的处理
最后更新于:2022-04-02 06:04:31
结合第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的处理。
';