对于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的其他设备
}];