iOS SDK 2.0文档 7-SDK流程之设备控制部分
3.5.设备控制部分SDK通过字典键值对方式进行设备控制和状态接收。SDK接收到APP下发的指令字典后,对应解析为设备可识别的数据,发送给设备。反之,SDK收到设备回复或上报的数据后,对应解析为字典键值对上报给APP。智能设备需正确烧写了GAgent固件和机智云串口通讯协议。如果设备定义了数据点,APP发送的指令必须符合数据点定义。如果设备没有定义数据点,设备指令可以按照透传数据以自定义格式下发。
3.5.1. 设备控制流程图https://gizwits.kf5.com/attachments/download/768123/0015768dffaa331bf6f7fede4a80381/
3.5.2. 发送控制指令设备订阅变成可控状态后,APP可以发送控制指令。控制指令是字典格式,键值对为数据点名称和值。操作指令的确认回复,通过didReceiveData回调返回。
APP下发操作指令时可以指定sn,通过回调参数中的sn能够对应到下发指令是否发送成功了。但回调参数dataMap有可能是空字典,这取决于设备回复时是否携带当前数据点的状态。
如果APP下发指令后只关心是否有设备状态上报,那么下发指令的sn可填0,这时回调参数sn也为0。
【示例代码】
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/*
* 以下代码为App使用sn的示例。如果App不使用sn,sn可设为0,回调中也不需要判断sn
*/
//在设备列表中得到设备对象,设置委托
mDevice.delegate = self;
// 对已订阅变为可控状态的设备,发送开灯指令
int sn = 5;
;
// 实现回调
- (void)device:(GizWifiDevice *)device didReceiveData:(NSError *)result data:(NSDictionary *)data withSN:(NSNumber *)sn {
if(result.code == GIZ_SDK_SUCCESS) {
// 如果App不使用sn,此处不需要判断sn
if (sn == 5) {
// 命令序号相符,开灯指令执行成功
} else {
// 其他命令的ack或者数据上报
}
} else {
// 执行失败
}
}
3.5.3. 接收设备状态设备订阅变成可控状态后,APP可以随时收到设备状态的主动上报,仍然通过didReceiveData回调返回。设备上报状态时,回调参数sn为0,回调参数dataMap为设备上报的状态。
【示例代码】
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
- (void)device:(GizWifiDevice *)device didReceiveData:(NSError *)result data:(NSDictionary *)dataMap withSN:(NSNumber *)sn {
if (result.code == GIZ_SDK_SUCCESS) {
// 已定义的设备数据点,有布尔、数值、枚举、扩展类型
NSDictionary *dataDict = dataMap[@"data"];
// 普通数据点,以布尔类型为例,打印对应的key和value
BOOL onOff = boolValue];
NSLog(@"开关值LED_OnOff:%@", @(onOff));
// 扩展类型数据点,key如果是“extData”
NSData *extData = dataMap[@"extdata"];
NSLog(@"扩展数据extData:%@", extData);
// 已定义的设备故障或报警数据点,设备发生故障或报警后该字段有内容,没有发生故障或报警则没内容
NSDictionary *alertsDict = dataMap[@"alerts"];
NSDictionary *faultsDict = dataMap[@"faults"];
NSLog(@"报警:%@, 故障:%@", alertsDict, faultsDict);
// 透传数据,无数据点定义,适合开发者自行定义协议做数据解析
NSData *binary = dataMap[@"binary"];
NSLog(@"透传数据:%@", binary);
} else {
//出错,处理 result 信息
}
}
3.5.4. 设备状态查询设备订阅变成可控状态后,APP可以查询设备状态。设备状态查询结果也通过didReceiveData回调返回,回调参数sn为0。回调参数dataMap为设备回复的状态。
【示例代码】
1
2
3
4
5
6
7
8
9
10
11
// mDevice是从设备列表中获取到的设备实体对象,为其设置委托
mDevice.delegate = self;
;
- (void)device:(GizWifiDevice *)device didReceiveData:(NSError *)result data:(NSDictionary *)data withSN:(NSNumber *)sn {
if(result.code == GIZ_SDK_SUCCESS) {
// 数据解析与3.5.3相同
} else {
// 查询失败
}
}
页:
[1]