收藏官网首页
查看: 20579|回复: 0

[分享] SDK数据透传方法解析

92

主题

277

帖子

1305

积分

金牌会员

Rank: 6Rank: 6

积分
1305
跳转到指定楼层
楼主
发表于 2017-3-1 10:24:11 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
免费使用STM32、APP自动代码生成工具
本文主要介绍如何使用机智云设备接入SDK来进行APP与设备之间的数据透传。在APP和MCU之间,有两种数据透传方式:
  • 利用“扩展类型”数据点进行透传
  • 不定义数据点直接进行数据透传,即纯透传




扩展类型数据点透传
1.定义数据点






在机智云产品管理中的数据点中定义一个拓展类型的数据点,如上图所示:
定义数据长度为60个byte(透传情况下,数据长度暂时支持900字节内数据传输)。


2.设备上报数据协议说明
设备MCU按照数据点的定义格式上报透传数据,在完成新产品的定义后,每个新产品都有相应的串口通信协议文档,文档下载路径如下图所示:






在串口通信协议文档文档的4.9部分则有MCU上报数据的格式,如下图:





图中的dev_status(60B)即为需要透传的数据。


3.SDK回调接口说明
APP端接收到MCU上报数据的回调接口:didReceiveData,判断result为GizWifiErrorCode.GIZ_SDK_SUCCESS,则接收到的数据可能为普通数据点或者扩展数据点。


4.APP接收数据代码示例
Andriod接收到MCU上报拓展数据类型代码示例:

  1. <font face="微软雅黑" size="3">final protected static char[] hexArray = "0123456789ABCDEF".toCharArray();

  2. // 将16进制的byte转为string,比如byte值为{0x62,0x63},那么将转为“6263”
  3. public static String bytesToHex(byte[] bytes) {
  4.                 char[] hexChars = new char[bytes.length * 3];
  5.                 for (int j = 0; j < bytes.length; j++) {
  6.                         int v = bytes[j] & 0xFF;
  7.                         hexChars[j * 3] = hexArray[v >>> 4];
  8.                         hexChars[j * 3 + 1] = hexArray[v & 0x0F];
  9.                         hexChars[j * 3 + 2] = ' ';
  10.                 }
  11.                 return new String(hexChars);
  12. }

  13. @Override
  14. protected void didReceiveData(GizWifiErrorCode result, GizWifiDevice device,
  15.                         ConcurrentHashMap<String, Object> dataMap, int sn) {

  16.         if (result == GizWifiErrorCode.GIZ_SDK_SUCCESS) {
  17.         // 普通数据点类型,有布尔型、整形和枚举型数据,该种类型一般为可读写
  18.                 if (dataMap.get("data") != null) {
  19.                         ConcurrentHashMap<String, Object> map = (ConcurrentHashMap<String, Object>) dataMap.get("data");
  20.                         // 扩展数据点,key为"kuozhan"
  21.                         byte[] bytes = (byte[]) map.get("kuozhan");
  22.                         String string = bytesToHex(bytes);
  23.                         Toast.makeText(this, string, Toast.LENGTH_SHORT).show();
  24.                 }
  25.         }
  26. }
  27. </font>
复制代码


iOS接收到MCU上报拓展数据类型代码示例:

  1. <font face="微软雅黑" size="3">- (void)device:(GizWifiDevice *)device didReceiveData:(NSError *)result data:(NSDictionary *)dataMap withSN:(NSNumber *)sn
  2. {
  3.     if (result.code == GIZ_SDK_SUCCESS)
  4.     {
  5.         NSLog(@"接收到数据");
  6.         NSDictionary *data = dataMap[@"data"];
  7.         NSString *kuozhan = data[@"kuozhan"];
  8.             
  9.         NSLog(@"dataMap = %@", dataMap);
  10.         NSLog(@"kuozhan = %@", kuozhan);
  11.         
  12.     }
  13. }
  14. </font>
复制代码

5.设备上报数据案例
案例:根据数据点上报格式上报数据:


FF FF 00 42 05 00 00 00 04 01 02 03 04 05 06 07 08 09 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 78


注意定义的扩展数据类型为60个字节,因此上报数据的时候也一定要保证上报命令中“设备状态”字节数为60个字节,否则APP端将不会收到数据。多余的数据可以进行补零操作。


APP端接收到的dataMap字典中有一个”kuozhan”的key,对应的值即为透传的数据。

  1. <font face="微软雅黑" size="3">dataMap = {
  2.     alerts={
  3.     };
  4.     data ={
  5.         kuozhan = <01020304 05060708 09000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000>;
  6.     };
  7.     faults={
  8.     };
  9. }
  10. </font>
复制代码

6.APP下发数据代码示例
APP在GizWifiDevice类的write接口中,按照数据点定义发送扩展数据。


Andriod下发拓展数据类型命令代码示例:

  1. <font face="微软雅黑" size="3">byte[] input1 = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 };
  2. // byte[] input2 = { 11, 22, 33, 44, 55, 66, 77, 88, 99};
  3. ConcurrentHashMap<String, Object> dataMap = new ConcurrentHashMap<String, Object>();
  4. dataMap.put("kuozhan", input1);
  5. device.write(dataMap, 0);
  6. </font>
复制代码


iOS下发拓展数据类型命令代码示例:

  1. <font face="微软雅黑" size="3">char input1[7] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77};
  2. // char input2[7] = {11, 22, 33, 44, 55, 66, 77};
  3.     NSData* data = [NSData dataWithBytes:input1 length:sizeof(input1)];
  4.     NSDictionary *request = @{@"kuozhan": data};
  5.     [self.device write:request withSN:44];
  6. </font>
复制代码


上述代码中,input1与input2的透传结果是不一样的,input1中定义的是十六进制的数值,input2中则是十进制的数值。如果使用input1中0x11的值下发给设备,那么设备将收到0x11的十六进制值,如果使用input2中11的值下发给设备,那么设备收到将是0x0b(十进制11对应十六进制b)。使用input1下发设备,MCU收到的数据为:


FF FF 00 43 03 45 00 00 01 01 11 22 33 44 55 66 77 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 69




无数据点透传
1.设备上报数据协议说明
MCU上报数据的格式如下表所示,包长度(len)是指从命令开始一直到校验和的字节长度(包括命令和校验和)。dev_status是需要透传数据,可以设置任意长度,但是暂时支持900B内传输。






如设备上报指令:FF FF 00 0D 05 00 00 00 06 11 22 33 44 55 66 77 F4 ;那么透传的数据为11 22 33 44 55 66 77


2.SDK回调接口说明
APP端接收到MCU上报数据的回调接口: didReceiveData,判断result为GizWifiErrorCode.GIZ_SDK_SUCCESS,则表示接收到数据成功,回传参数的dataMap 中的“binary”字段的值为透传数据。


3.APP接收数据代码示例
Andriod接收MCU无数据点上报代码示例:

  1. <font face="微软雅黑" size="3">@Override
  2. protected void didReceiveData(GizWifiErrorCode result, GizWifiDevice device,ConcurrentHashMap<String, Object> dataMap, int sn) {
  3.         if (result == GizWifiErrorCode.GIZ_SDK_SUCCESS) {
  4.                 // 透传数据,无数据点定义,适合开发者自行定义协议自行解析
  5.                 if (dataMap.get("binary") != null) {
  6.                 byte[] binary = (byte[]) dataMap.get("binary");
  7.                 Log.i("info", "Binary data:" + bytesToHex(binary));
  8.                         // 收到后面需要自行解析
  9.                 }
  10.         }
  11. }
  12. </font>
复制代码
iOS接收MCU无数据点上报代码示例:
  1. <font face="微软雅黑" size="3">- (void)device:(GizWifiDevice *)device didReceiveData:(NSError *)result data:(NSDictionary *)dataMap withSN:(NSNumber *)sn
  2. {
  3.     if (result.code == GIZ_SDK_SUCCESS)
  4.     {
  5.         NSLog(@"接收到数据");
  6.         NSLog(@"dataMap = %@", dataMap);
  7.         
  8.         NSString *binary = dataMap[@"binary"];
  9.         // 后面需要自行对binary数据进行解析
  10.         }
  11. }
  12. </font>
复制代码


如MCU上报:FF FF 00 0D 05 00 00 00 06 11 22 33 44 55 66 77 F4
则APP将打印: Binary data:11 22 33 44 55 66 77


4.APP下发数据代码示例
APP在GizWifiDevice类的write接口中,发送的json格式为:{“binary”: “xxxxxx”};
MCU接收的数据格式如下:






Andriod下发无数据点透传数据代码示例:
  1. <font face="微软雅黑" size="3">byte[] input1 = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 };
  2. ConcurrentHashMap<String, Object> dataMap = new ConcurrentHashMap<String, Object>();
  3. dataMap.put("binary", input1);
  4. device.write(dataMap, 0);
  5. </font>
复制代码


iOS下发无数据点透传数据代码示例:

  1. <font face="微软雅黑" size="3">char input1[7] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77};
  2. // char input2[7] = {11, 22, 33, 44, 55, 66, 77};   
  3. NSData* data = [NSData dataWithBytes:input1 length:sizeof(input1)];
  4. NSDictionary *request = @{@"binary": data};   
  5. [self.device write:request withSN:0];
  6. </font>
复制代码


MCU接收到的APP下发数据格式(即以上bytes数组下发后,MCU接收到的数据):
FF FF 00 0D 03 16 00 00 05 11 22 33 44 55 66 77 07


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

加入Q群 返回顶部

版权与免责声明 © 2006-2024 Gizwits IoT Technology Co., Ltd. ( 粤ICP备11090211号 )

快速回复 返回顶部 返回列表