對于Combo設備(同時支持Wi-Fi和BLE),除了可以先配網再綁定設備(即藍牙輔助配網開發實踐),還可以先綁定設備再配網,且該方式配網速度更快。當您的業務場景需要快速配網時,可根據本文檔來進行App端的iOS系統開發。
操作步驟
- 創建一個自有App,詳細操作請參見創建自有App。
- 獲取App端SDK。
在代碼工程中添加以下依賴。
pod 'IMLDeviceCenter'
pod 'IMLDeviceKit'
pod 'IMSThingCapability'
- 初始化SDK。具體操作,請參見SDK初始化。
- 開發Combo設備發現。
- 調用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}"
)
- 調用獲取產品productKey獲取productKey。
- 調用本地發現設備列表信息過濾接口來過濾掉非法設備(如已綁定的設備等)。
說明 對于Combo設備,該接口的請求參數中deviceName需配置為Combo設備的MAC地址。
- 開發Combo設備綁定。
- 將App作為網關,Combo設備以子設備方式登錄云端,并使用設備MAC地址換取DeviceName。
示例代碼如下。
[IMSSubDeviceService subDeviceAuthenLogin:@{@"productKey":productKey ?: "",
@"deviceName”:mac ?: ""} ///這里請務必填寫設備的MAC地址
resultBlock:^(NSDictionary * _Nullable object, NSError * _Nullable error) {
// 成功則讀取到DeviceName
NSString *deviceName = object[@"deviceName"];
}];
- 調用基于時間窗口方式的綁定設備接口在云端綁定設備。
該接口的請求參數中,groupIds默認為@[]
(表示空)即可,homeId配置為當前家的ID。
- 調用notifySubDeviceBinded接口通知設備綁定結果。
示例代碼如下。
[IMSSubDeviceService notifySubDeviceBinded:YES deviceInfo:deviceInfo completeBlock:^(BOOL succeeded, NSError * _Nullable error) {
// 此處succeeded == yes為綁定成功,流程完全結束
}];
其中,deviceInfo:deviceInfo
的示例如下。
NSDictionary *deviceInfo = @{@"deviceName": mac ?: @"",
@"productKey": productKey ?: @"",
@"iotId": iotId ?: @""};
- 設置Wi-Fi狀態。
配網前,將wifistate設置為DeviceWifiStatus_NotSet,表示Wi-Fi的狀態為未配置。示例代碼如下。
IMSThing *thing = [kIMSThingManager buildThing:iotId];
[[thing getThingActions] setWifiStatus:DeviceWifiStatus_NotSet responseHandler:^(IMSThingActionsResponse * _Nullable response) {
}];
- 開發Combo設備配網。
說明 Combo設備的類型為ble_subtype_4時,表示已配網,此時您可忽略該步驟的操作。
- 傳入物模型,以及SSID、密碼、超時時間等。設置代理發起配網。
示例代碼如下。
[kLkAddDevBiz setDevice:self.currentModel]; // self.currentModel 為發現邏輯完成之后的model
[kLkAddDevBiz startAddDevice:self];
[kLkAddDevBiz toggleProvision:ssid pwd:pwd timeout:60];
- 開始配網時,設置wifistate為DeviceWifiStatus_Setting,表示Wi-Fi正在配置中。
示例代碼如下。
IMSThing *thing = [kIMSThingManager buildThing:iotId];
[[thing getThingActions] setWifiStatus:DeviceWifiStatus_Setting responseHandler:^(IMSThingActionsResponse * _Nullable response) {
}];
- 手動繼續配網。
由于設備先綁定再配網,當找到藍牙設備時,您還需要在配網環節的藍牙配置中繼續手動配網。示例代碼如下。
/**
藍牙輔助配網模式相關回調
通知上層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];
}
}
- 監聽代理回調,處理配網結果。
示例代碼如下。
- (void)notifyProvisionResult:(IMLCandDeviceModel *)candDeviceModel withProvisionError:(NSError *)provisionError {
// 處理配網結果,candDeviceModel有數據返回,provisionError中無error則為配網成功
}
- 配網結束后設置配網結果。
示例代碼如下。
IMSThing *thing = [kIMSThingManager buildThing:iotId];
[[thing getThingActions] setWifiStatus:state responseHandler:^(IMSThingActionsResponse * _Nullable response) {
//配網成功state為DeviceWifiStatus_Set;如配網不成功state為DeviceWifiStatus_NotSet
}];
- (可選)當您需要判斷設備是否為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的其他設備
}];