对于Combo设备(同时支持Wi-Fi和BLE),除了可以先配网再绑定设备(即蓝牙辅助配网开发实践),还可以先绑定设备再配网,且该方式配网速度更快。当您的业务场景需要快速配网时,可根据本文档来进行App端的iOS系统开发。

操作步骤

  1. 创建一个自有App,详细操作请参见创建自有App
  2. 获取App端SDK。

    在代码工程中添加以下依赖。

    pod 'IMLDeviceCenter'
    pod 'IMLDeviceKit'
    
    pod 'IMSThingCapability'
  3. 初始化SDK。具体操作,请参见SDK初始化
  4. 开发Combo设备发现。
    1. 调用SDK发现接口startDiscoveryWithFilter,发现周围的Combo设备。

      调用示例代码如下。

      [[IMLLocalDeviceMgr sharedMgr] startDiscoveryWithFilter:nil
                                    discoverBlcok:^(NSArray *devices, NSError *err) {
      }];
      //Combo设备的类型,ble_subtype_3表示未配置Wi-Fi;此时您需要绑定设备和配网设备。
      // ble_subtype_4表示已配置过Wi-Fi,此时您只需绑定设备即可。

      其中,NSArray的示例如下。

      (
          "{\n    bindState = 0;\n    cipherRandomStr = 00000000000000000000000000000000;\n    cipherType = 0;\n    devType = \"ble_subtype_12\";\n    deviceEncrypt = 1;\n    deviceIsReset = 0;\n    enableGlobalCloudToken = 0;\n    ignoreLocationPermisionCheck = 0;\n    inputNetType = 0;\n    isBindSucc = 0;\n    isBinded = 0;\n    isFinishLocalFindCombo = 0;\n    linkType = 0;\n    mac = a4cdxxxx0e9;\n    productId = 59xxx0;\n    productInfoModel = \"<IMSNativeProductInfoModel: 0x2802b7e20>\";\n    productKey = a1GxxxxZK;\n    regionNode = 0;\n    softApNoNeedSwitchBackRouter = 0;\n}"
      )
    2. 调用获取产品productKey获取productKey。
    3. 调用本地发现设备列表信息过滤接口来过滤掉非法设备(如已绑定的设备等)。
      说明 对于Combo设备,该接口的请求参数中deviceName需配置为Combo设备的MAC地址。
  5. 开发Combo设备绑定。
    1. 将App作为网关,Combo设备以子设备方式登录云端,并使用设备MAC地址换取DeviceName。

      示例代码如下。

      [IMSSubDeviceService subDeviceAuthenLogin:@{@"productKey":productKey ?: "",
                         @"deviceName”:mac ?: ""} ///这里请务必填写设备的MAC地址
              resultBlock:^(NSDictionary * _Nullable object, NSError * _Nullable error) {
            // 成功则读取到DeviceName
              NSString *deviceName = object[@"deviceName"];
          }];
    2. 调用基于时间窗口方式的绑定设备接口在云端绑定设备。

      该接口的请求参数中,groupIds默认为@[](表示空)即可,homeId配置为当前家的ID。

    3. 调用notifySubDeviceBinded接口通知设备绑定结果。

      示例代码如下。

      [IMSSubDeviceService notifySubDeviceBinded:YES deviceInfo:deviceInfo completeBlock:^(BOOL succeeded, NSError * _Nullable error) {
           // 此处succeeded == yes为绑定成功,流程完全结束
       }];

      其中,deviceInfo:deviceInfo的示例如下。

      NSDictionary *deviceInfo = @{@"deviceName": mac ?: @"",
                                                           @"productKey": productKey ?: @"",
                                                           @"iotId": iotId ?: @""};
    4. 设置Wi-Fi状态。

      配网前,将wifistate设置为DeviceWifiStatus_NotSet,表示Wi-Fi的状态为未配置。示例代码如下。

      IMSThing *thing = [kIMSThingManager buildThing:iotId];
      [[thing getThingActions] setWifiStatus:DeviceWifiStatus_NotSet responseHandler:^(IMSThingActionsResponse * _Nullable response) {
              
      }];
  6. 开发Combo设备配网。
    说明

    Combo设备的类型为ble_subtype_4时,表示已配网,此时您可忽略该步骤的操作。

    1. 传入设备模型,以及SSID、密码、超时时间等。设置代理发起配网。

      示例代码如下。

      [kLkAddDevBiz setDevice:self.currentModel];    // self.currentModel 为发现逻辑完成之后的model
      [kLkAddDevBiz startAddDevice:self];
      [kLkAddDevBiz toggleProvision:ssid pwd:pwd timeout:60];
    2. 开始配网时,设置wifistateDeviceWifiStatus_Setting,表示Wi-Fi正在配置中。

      示例代码如下。

      IMSThing *thing = [kIMSThingManager buildThing:iotId];
      [[thing getThingActions] setWifiStatus:DeviceWifiStatus_Setting responseHandler:^(IMSThingActionsResponse * _Nullable response) {
              
      }];
    3. 手动继续配网。

      由于设备先绑定再配网,当找到蓝牙设备时,您还需要在配网环节的蓝牙配置中继续手动配网。示例代码如下。

      /**
      蓝牙辅助配网模式相关回调
      通知上层UI:蓝牙辅助配网相关回掉提示
      
      @param status 状态码:
      1表示还未找到蓝牙设备,请检查设备是否初始化,
      2表示已经找到蓝牙设备
      @param dic 状态信息:
      status=2,dic 可能为:{@"devType":@"ble_subtype_3"} 代表支持先绑定控制后配置Wi-Fi信息的蓝牙Combo设备,可先执行绑定控制,之后调用continueProvision接口继续配网流程。
      */
      
      - (void)notifyProvisioningNoticeForBleConfig:(int)status withInfo:(NSDictionary *)dic {
      if (status == 2 && [dic[@"devType"] isEqualToString:@"ble_subtype_3"]) {
      [kLkAddDevBiz continueProvision:nil];
      }
      }
    4. 监听代理回调,处理配网结果。

      示例代码如下。

      - (void)notifyProvisionResult:(IMLCandDeviceModel *)candDeviceModel withProvisionError:(NSError *)provisionError {
          // 处理配网结果,candDeviceModel有数据返回,provisionError中无error则为配网成功
      }
  7. 配网结束后设置配网结果。

    示例代码如下。

    IMSThing *thing = [kIMSThingManager buildThing:iotId];
    [[thing getThingActions] setWifiStatus:state responseHandler:^(IMSThingActionsResponse * _Nullable response) {
      //配网成功state为DeviceWifiStatus_Set;如配网不成功state为DeviceWifiStatus_NotSet
    }];
  8. (可选)当您需要判断设备是否为Combo设备以及wifistate状态时,可调用以下代码查看。
    IMSThing *thing = [kIMSThingManager buildThing:iotId];
    [[thing getThingActions] getDeviceNetTypesSupported:^(IMSThingActionsResponse * _Nullable response) {
            NSInteger netTypes = [(NSNumber *)response.dataObject integerValue];
        DeviceWifiStatusType type = [[thing getThingActions] getWifiStatus];
             // DeviceWifiStatus_Init表示初始化Wi-Fi
             // DeviceWifiStatus_Setting表示初始化设置中
             // DeviceWifiStatus_NotSupport表示不支持设置Wi-Fi
             // DeviceWifiStatus_NotSet表示Wi-Fi设置失败
             // DeviceWifiStatus_Set表示Wi-Fi设置成功
        BOOL isComboDevice = (netTypes & NET_WIFI) && (netTypes & NET_BT) && (type != DeviceWifiStatus_NotSupport);
             // 返回YES表示Combo设备,返回NO表示非Combo的其他设备
    }];