6.4.1 Settings中的WSC处理

本节内容从Settings开始,当选择图6-2左图所示的“WPS PIN条目”后,将弹出图6-2右图所示的WPS设置对话框。该对话框对应的类是WpsDialog中,其代码如下所示。

[—>WpsDialog.java::WpsDialog]

  1. public WpsDialog(Context context, int wpsSetup) {
  2. super(context);
  3. mContext = context;
  4. mWpsSetup = wpsSetup;
  5. // PIN和PBC方法都在这个WpsDialog中实现
  6. class WpsListener implements WifiManager.WpsListener {
  7. public void onStartSuccess(String pin) {
  8. if (pin != null) {
  9. // WSC PIN启动成功,WPAS将动态创建一个PIN码,此处由WpsDialg显示出来
  10. updateDialog(DialogState.WPS_START, String.format(
  11. mContext.getString(R.string.wifi_wps_onstart_pin), pin));
  12. } else {// PBC处理
  13. updateDialog(DialogState.WPS_START, mContext.getString(
  14. R.string.wifi_wps_onstart_pbc));
  15. }
  16. }
  17. public void onCompletion() {
  18. updateDialog(DialogState.WPS_COMPLETE,
  19. mContext.getString(R.string.wifi_wps_complete));
  20. }
  21.  
  22. public void onFailure(int reason) {
  23. ......
  24. }
  25.  
  26. mWpsListener = new WpsListener();// 监听WPS操作的结果
  27.  
  28. mFilter = new IntentFilter();
  29. // 监听NETWORK_STATE_CHANGED_ACTION广播
  30. mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
  31. mReceiver = new BroadcastReceiver() {
  32. public void onReceive(Context context, Intent intent) {
  33. handleEvent(context, intent);// handleEvent的代码比较简单,读者不妨自行阅读。
  34. }
  35. };
  36. }

我们跳过WpsDialog的onCreate函数直接进入其onStart函数,在该函数中,WpsDialog将借助WifiManager和WifiStateMachine交互,相关代码如下所示。

[—>WpsDialog.java::onStart]

  1. protected void onStart() {
  2. mTimer = new Timer(false);
  3. mTimer.schedule(new TimerTask() {
  4. ......// 更新进度条
  5. } , 1000, 1000);
  6.  
  7. mContext.registerReceiver(mReceiver, mFilter);
  8.  
  9. WpsInfo wpsConfig = new WpsInfo();// 构造一个WpsInfo对象
  10. wpsConfig.setup = mWpsSetup;// 对PIN来说,mWpsSetup的值为WpsInfo.DISPLAY
  11. // 调用WifiManager的startWps函数,该函数内部将向WifiStateMachine发送START_WPS消息
  12. mWifiManager.startWps(wpsConfig, mWpsListener);
  13. }

当手机通过WPS成功加入无线网络后,NETWORK_STATE_CHANGED_ACTION广播将在handleEvent中被处理。这部分代码非常简单,请读者自行阅读。

根据代码中的注释可知,startWps将向WifiStateMachine发送START_WPS消息。WifiStateMachine该如何处理它呢?