對于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
                                    discoverBlock:^(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的其他設備
    }];