收藏官网首页
机智云 门户 新闻频道 查看内容

APP与设备之间的数据透传解析

2016-12-23 15:48| 发布者: Genius| 查看: 10964| 评论: 1

摘要: APP与设备之间的数据透传

导读:本文先介绍消息透传,再介绍如何使用机智云设备接入SDK来进行APP与设备之间的数据透传。在APP和MCU之间,有两种数据透传方式: 利用“扩展类型”数据点进行透传;不定义数据点直接进行数据透传,即纯透传。



目前的消息推送方式主要有两种:通知和透传。
什么是透传?透传即是透明传送,即传送网络无论传输业务如何,只负责将需要传送的业务传送到目的节点,同时保证传输的质量即可,而不对传输的业务进行处理。透传消息,就是消息体格式及内容,对于传递的通道来说是不去过问的,通道只负责消息的传递,对消息不做任何处理,当客户端接收到透传消息后,由客户端自己来决定如何处理消息。正是因为透传消息可以自定义消息体,也可以自定义消息的展示方式及后续动作处理,所以弥补了通知栏消息的一些不足之处(通知栏消息是直接展示出来,相关的动作客户端无法捕获到)。


透传消息主要有如下几个方面的特点
1. 后台处理,用户无感知。
2. 前台展示,提醒用户。
3. 展示的多样化。

整个透传消息的流程如下:根据个推提供的API接口或在个推开发者平台上推送透传消息,个推服务端接收到推送的消息后,不做任何处理,直接发送给目标用户。当客户端SDK接收到透传消息后,以广播方式发送给客户端,客户端在配置的第三方BroadReceiver里接收到透传消息后进行处理。


透传消息的消息体,可以根据不同的需求传递不同的参数或格式。如传递一个简单的字符串,或传递一个Json字符串,里面根据需求传递需要的字段。

用户无感知的透传,如:更新相关信息,在主界面中相关栏位用红点标识进行弱提醒,推送一条命令用来检测用户是否有登录等。通知栏消息虽然方便的提醒用户,但也在一定程度上给用户带来了打扰,用户无感知的消息推送有时效果会更好。
用户有感知的透传:把透传消息处理成通知栏展示出来,提醒用户方便点击查看相关信息(如个人帐单信息),直接打开应用或跳转到指定的应用界面中(根据透传消息的相关参数来判断跳转到哪一个指定的界面,相关参数传递要打开的界面的类名或Intent即可)等。对于开发者,处理成通知栏的相关事件也是可以捕获的,如通知栏的展示、点击等事件都可以进行捕获,以方便进行后续的操作。

因透传消息可以自己处理成通知栏内容展示,所以通知栏的样式也可以根据需求来做对应的改变。在Android 4.4及以上的系统,通知栏可以是样式丰富的通知栏,放入图片和视频等;可以展示普通的通知,也可以展示多样化的通知。


下面,我将介绍如何使用机智云设备接入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上报拓展数据类型代码示例:

final protected static char[] hexArray = "0123456789ABCDEF".toCharArray();
// 将16进制的byte转为string,比如byte值为{0x62,0x63},那么将转为“6263”
public static String bytesToHex(byte[] bytes) {
char[] hexChars = new char[bytes.length * 3];
for (int j = 0; j < bytes.length; j++) {
int v = bytes[j] & 0xFF;
hexChars[j * 3] = hexArray[v >>> 4];
hexChars[j * 3 + 1] = hexArray[v & 0x0F];
hexChars[j * 3 + 2] = ' ';
}
return new String(hexChars);
}
@Override
protected void didReceiveData(GizWifiErrorCode result, GizWifiDevice device,
ConcurrentHashMap<String, Object> dataMap, int sn) {
if (result == GizWifiErrorCode.GIZ_SDK_SUCCESS) {
// 普通数据点类型,有布尔型、整形和枚举型数据,该种类型一般为可读写
if (dataMap.get("data") != null) {
ConcurrentHashMap<String, Object> map = (ConcurrentHashMap<String, Object>) dataMap.get("data");
// 扩展数据点,key为"kuozhan"
byte[] bytes = (byte[]) map.get("kuozhan");
String string = bytesToHex(bytes);
Toast.makeText(this, string, Toast.LENGTH_SHORT).show();
}
}
}

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

- (void)device:(GizWifiDevice *)device didReceiveData:(NSError *)result data:(NSDictionary *)dataMap withSN:(NSNumber *)sn
{
if (result.code == GIZ_SDK_SUCCESS)
{
NSLog(@"接收到数据");
NSDictionary *data = dataMap[@"data"];
NSString *kuozhan = data[@"kuozhan"];
NSLog(@"dataMap = %@", dataMap);
NSLog(@"kuozhan = %@", kuozhan);
}
}

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,对应的值即为透传的数据。
dataMap = {
    alerts={
    };
    data ={
        kuozhan = <01020304 05060708 09000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000>;
    };
    faults={
    };
}


6.APP下发数据代码示例

APP在GizWifiDevice类的write接口中,按照数据点定义发送扩展数据。

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

byte[] input1 = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 };
// byte[] input2 = { 11, 22, 33, 44, 55, 66, 77, 88, 99};
ConcurrentHashMap dataMap = new ConcurrentHashMap();
dataMap.put("kuozhan", input1);
device.write(dataMap, 0);

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

char input1[7] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77};
// char input2[7] = {11, 22, 33, 44, 55, 66, 77};
NSData* data = [NSData dataWithBytes:input1 length:sizeof(input1)];
NSDictionary *request = @{@"kuozhan": data};
[self.device write:request withSN:44];

上述代码中,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内传输。

Alt text

如设备上报指令: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接收数据代码示例


鲜花

握手

雷人

路过

鸡蛋
发表评论

最新评论

引用 Genius 2016-12-23 16:06
原文参考:http://docs.gizwits.com/zh-cn/AppDev/SDK%E6%95%B0%E6%8D%AE%E9%80%8F%E4%BC%A0%E6%96%B9%E6%B3%95%E8%A7%A3%E6%9E%90.html

查看全部评论(1)

最新文章
一场狂欢 共享单车正引领物联网第一波爆发
一场狂欢 共享单车正引领物联网第一波爆发
2014年共享单车首次出现在北大校园,一群北大青年成立了一家叫OFO的公司,当时在北大
东芝确认7月分拆能源以外业务 防止核电危机扩散
东芝确认7月分拆能源以外业务 防止核电危机
4月25日,东芝发布消息称,7月以后将陆续拆分社会基础设施等4项主要业务。
机智云智能家电运营管理服务平台获艾普兰智能创新奖
机智云智能家电运营管理服务平台获艾普兰智
机智云智能家电运营管理服务平台获艾普兰智能创新奖
国产芯片这里找:2016年中国半导体行业设计/制造/封测十强名单公布! ...
国产芯片这里找:2016年中国半导体行业设计
根据中国半导体行业协会统计,2016年中国集成电路产业销售额达到4335.5亿元,同比增长
谷歌Hangouts推出两项新功能
谷歌Hangouts推出两项新功能
唯一比会议更加讨厌的就是会议筹备。为了简化会议筹备流程,3月10日谷歌在其通讯聊天
加入Q群 返回顶部

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

返回顶部