蓝牙辅助配网可以让手机App将WiFi热点信息通过蓝牙传递给设备,配网错误信息也可以通过蓝牙通道反馈给手机用户来定位问题。若您希望通过Android系统对您的设备使用蓝牙进行配网,并开启设备语音能力,请根据本文档进行功能的开发。

前提条件

已完成控制台上产品开发工作,以及蓝牙辅助配网的设备端开发,请参见设备端开发

  1. 创建一个自有App,详细操作请参见创建自有App
  2. 获取App端SDK。详细操作请参见下载并集成SDK
  3. 初始化SDK。详细操作请参见SDK初始化
  4. 开发Combo设备发现。Combo设备通过调用LocalDeviceMgr中的startDiscovery方法来实现设备发现。如果您已实现过设备发现业务,则在该基础上,在EnumSet<DiscoveryType>入参中新增⼀个DiscoveryType.BLE_ENROLLEE_DEVICE类型即可。
    1. 发起本地发现。
      EnumSet<DiscoveryType> discoveryTypes=EnumSet.of(DiscoveryType.CLOUD_ENROLLEE_DEVICE, DiscoveryType.SOFT_AP_DEVICE, DiscoveryType.LOCAL_
                                                       ONLINE_DEVICE, DiscoveryType.BLE_ENROLLEE_DEVICE);
      LocalDeviceMgr.getInstance().startDiscovery(AApplication.getInstance
                                                  (), discoveryTypes, null, new IDeviceDiscoveryListener() {
          @Override
          public void onDeviceFound(DiscoveryType discoveryType, L
                                    ist<DeviceInfo> list) {
      
          }
      });
    2. 调用接口获取产品productKey,使用ProductId换取设备的ProductKey
    3. 调用接口本地发现设备列表信息过滤,过滤掉非法设备(如已绑定的设备等)。
  5. 开发Combo设备绑定。下面以云智能App为示例介绍Combo快速配网流程,您可以根据自己的业务逻辑来实现。
    1. 调用蓝牙上线接口DevService.breezeSubDevLogin,传入ProductKeyMAC等参数。示例代码如下。
      DevService.breezeSubDevLogin(pk, mac, new DevService.ServiceListener() {
          @Override
          public void onComplete(boolean b, Object o) {
          }
      });
    2. 调用接口后SDK会通过onComplete接口返回蓝牙上线结果。如果蓝牙上线成功则继续绑定操作;蓝牙上线失败,则流程结束。
    3. 调用接口基于时间窗口方式的绑定设备,在云端绑定设备。
    4. 调用DevService.notifySubDeviceBinded接口通知设备绑定结果。示例代码如下。
      private void tmpNotify(String iotId){
              ALog.d(TAG,"tmpNotify->"+iotId);
              SubDevInfo subDevInfo=new SubDevInfo();
              subDevInfo.iotId=iotId;
              if (netType==ILopNetTypeCodes.NET_TYPE_BT){
                  ALog.d(TAG,"mac->"+mac);
                  subDevInfo.deviceName=mac;
              }else {
                  ALog.d(TAG,"dn->"+dn);
                  subDevInfo.deviceName=dn;
              }
              subDevInfo.productKey=pk;
      
      // 调用DevService.notifySubDeviceBinded接口通知设备已绑定成功
              DevService.notifySubDeviceBinded(subDevInfo,new DevService.ServiceListener(){
      
                  @Override
                  public void onComplete(boolean b, @Nullable Object o) {
                      ThreadTools.runOnUiThread(new Runnable() {
                          @Override
                          public void run() {
                              gotoStepFinish();
                          }
                      });
                  }
              });
      
          }
  6. 开发Combo设备配网。
    说明 Combo设备类型为DiscoveryType.COMBO_SUBTYPE_0X04_DEVICE,表示已配网,此时您可忽略该步骤的以下操作。
    1. 开始配网时,设置wifistateDeviceWifiStatus_Setting,表示Wi-Fi正在配置中。示例代码如下。
      DevService.setWifiStatus(iotID, TmpEnum.DeviceWifiStatus.DeviceWifiStatus_Setting, new DevService.ServiceListenerEx() {
         @Override
      public void onComplete(boolean b, @Nullable String s) {
      
      }});
    2. 调用AddDeviceBiz.getInstance().setDevice设置配网信息。示例代码如下。
      DeviceInfo deviceInfo = new DeviceInfo();
      deviceInfo.devType = ILopNetTypeCodes.DEV_TYPYE_BLE_SUBTYPE_3;
      deviceInfo.mac = mac;
      deviceInfo.linkType = LinkType.ALI_BLE.getName();
      RegionInfo regionInfo = new RegionInfo();
      regionInfo.shortRegionId = 0;
      deviceInfo.regionInfo = regionInfo;
      
      // 语音能力激活,标注设备是否支持语音能力
      deviceInfo.isInSide = true;
      
      ProvisionConfigParams params = new ProvisionConfigParams();
      params.ignoreSoftAPRecoverWiFi = true;
      params.enableGlobalCloudToken = true;
      ProvisionConfigCenter.getInstance().setProvisionConfiguration(params);
      AddDeviceBiz.getInstance().setDevice(deviceInfo);
      说明 语音能力激活,标注设备是否支持语音能力。

      deviceInfo.isInSide = true;

    3. 调用AddDeviceBiz.getInstance().startAddDevice方法发起配网。示例代码如下。
      
      
      
      AddDeviceBiz.getInstance().startAddDevice(AApplication.getInstance(), new IAddDeviceListener() {
          @Override
          public void onPreCheck(boolean b, DCErrorCode dcErrorCode) {
      
          }
      
          @Override
          public void onProvisionPrepare(int prepareType) {
              if (prepareType == 1) {
      //传入SSID和Wi-Fi密码开始配网
                 AddDeviceBiz.getInstance().toggleProvision(ssid, password, 60);
              }
          }
      
          @Override
          public void onProvisioning() {
      
          }
      
          @Override
          public void onProvisionStatus(ProvisionStatus provisionStatus) {
              if ((provisionStatus != null) && provisionStatus.code() == ProvisionStatus.BLE_DEVICE_SCAN_SUCCESS.code()) {
                  ALog.d(TAG, "BLE_DEVICE_SCAN_SUCCESS");
                  if (provisionStatus.getExtraParams() != null) {
              //扫描到该设备
                      String devType = (String) provisionStatus.getExtraParams().get(ILopNetTypeCodes.KEY_DEV_TYPE);
                      String bleMac = (String) provisionStatus.getExtraParams().get(ILopNetTypeCodes.KEY_BLE_MAC);
                      String prouctID = (String) provisionStatus.getExtraParams().get(ILopNetTypeCodes.KEY_PRODUCT_ID);
                      ALog.d(TAG, "devType->" + devType + " bleMac->" + bleMac + " prouctID->" + prouctID);
                      if (ILopNetTypeCodes.DEV_TYPYE_BLE_SUBTYPE_3.equals(devType)){
                  //继续配网
                          AddDeviceBiz.getInstance().continueProvision(null);
                      }
                  }
              }
          }
      
          @Override
          public void onProvisionedResult(boolean isSuccess, DeviceInfo deviceInfo, DCErrorCode dcErrorCode) {
              String message = "onProvisionedResult. isSuccess:" + isSuccess + " deviceInfo:" + deviceInfo + " dcErrorCode:" + dcErrorCode;
              ALog.d(TAG, message);
              ThreadTools.runOnUiThread(new Runnable() {
                  @Override
                  public void run() {
                     AddDeviceBiz.getInstance().stopAddDevice();//配网完成,结束当前配网流程
                      if (isSuccess) {
                     //配网成功
      
                      } else {
                        //配网失败
                      }
                  }
              });
      
          }
      });
                                      
  7. 调用DevService#setWifiStatus向TMP通知设备的配网结果。示例代码如下。
    DevService.setWifiStatus(iotID, TmpEnum.DeviceWifiStatus.state, new DevService.ServiceListenerEx() {
       //配网成功state为DeviceWifiStatus_Set;配网不成功state为DeviceWifiStatus_NotSet
    @Override
        public void onComplete(boolean b, @Nullable String s) {
             }
    });