26
2017
09

android中WiFi wps连接方式

Android 个人热点 wps方式连接流程

android手机开启个人热点时,可以选择WPS连接方式

个人热点端

连接端

当个人热点端选择按钮时,连接端只需要点击WPS按钮即可连接;当个人热点端选择从对等设备获取pin码时,点击连接机的WPS PIN输入,会弹出一个PIN码,这个时候在个人热点端输入相应数字即可连接

public void onClick(DialogInterface dialogInterface, int button) {
    if (button == DialogInterface.BUTTON_POSITIVE) {
        WpsInfo config = new WpsInfo();
        if (mWpsMode == PUSH_BUTTON) {
            //按钮参数
            config.setup = WpsInfo.PBC;
            config.BSSID = "any";
        } else if (mWpsMode == PIN_FROM_CLIENT) {
            //PIN码参数
            config.setup = WpsInfo.DISPLAY;
            config.pin = ((EditText) mView.findViewById(R.id.pin_edit)).getText().toString();
        }
        mWifiManager.startApWps(config);
    }
}

在wifimanager里面,则直接调用了IWifiService的startApWps方法

 public boolean startApWps(WpsInfo config) {
     try {
         mService.startApWps(config);
         return true;
     } catch (RemoteException e) {
         return false;
     }
 }

IWifiService接口的实现类是WiFiServiceImpl

  public void startApWps(WpsInfo config) {
    enforceChangePermission();
    mWifiStateMachine.startApWpsCommand(config);
  }

在WifiStateMachine,会发一个消息,根据不同的选项调用相应的native方法去建立连接

public void startApWpsCommand(WpsInfo config) {
    sendMessage(obtainMessage(M_CMD_START_AP_WPS, config));
}


case M_CMD_START_AP_WPS:
   WpsInfo wpsConfig = (WpsInfo) message.obj;
   switch (wpsConfig.setup) {
       case WpsInfo.PBC:
           mStartApWps = true;
           mHotspotNative.startApWpsPbcCommand();
           break;
       case WpsInfo.DISPLAY:
           String pin = mHotspotNative.startApWpsCheckPinCommand(wpsConfig.pin);
           Log.d(TAG, "Check pin result:" + pin);
           if (pin != null) {
               mHotspotNative.startApWpsWithPinFromDeviceCommand(pin);
           } else {
               Intent intent = new Intent(WifiManager.WIFI_WPS_CHECK_PIN_FAIL_ACTION);
               intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
               mContext.sendBroadcastAsUser(intent, UserHandle.ALL);
           }
           break;
       default:
           Log.e(TAG, "Invalid setup for WPS!");
           break;
   }
上一篇:多线程使用信号量sem_init,sem_wait,sem_post 下一篇:[RK3288][Android6.0] 调试笔记 --- Camera动态热插拔支持