Genius 发表于 2016-7-7 16:42:52

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]
查看完整版本: iOS SDK 2.0文档 7-SDK流程之设备控制部分