设备数据HTTP/2方式推送
更新时间:2018-10-19 11:29:34
HTTP/2转储功能适用于飞燕平台与企业服务器之间的大量消息流转。通过集成和使用HTTP/2 SDK,即可实现身份认证、消息接收的能力。
一、准备工作
登录控制台,进入要启用数据推送的项目的项目设置界面,启动项目的数据推送服务,并配置要订阅数据的产品信息。
⚠️当开启推送服务后,集成HTTP/2客户端SDK来订阅数据,此时通过控制台关闭推送服务,再开启时客户端SDK需要重新进行连接流程,否则无法正常接收数据。
二、HTTP/2 SDK使用
1、依赖引入
在项目中添加maven依赖,maven信息如下
<dependency>
<groupId>com.aliyun.openservices</groupId>
<artifactId>iot-client-message</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.11</version>
</dependency>
2. 身份认证
身份认证需要使用AppKey和AppSecret,该信息可以从控制台中获取,如图所示:
建连时使用MessageClient.connect(Profile, MessageCallback)方法,Profile需要提供EndPoint,AppKey和AppSecret用于鉴权,MessageCallback为默认的消息回调,用于接收消息。
示例如下:
Profile profile = Profile.getAppKeyProfile("${END_POINT}", "${APP_KEY}", "${APP_SECRET}");
MessageCallback messageCallback = new MessageCallback() {
public Action consume(MessageToken messageToken) {
System.out.println("receive : " + new String(messageToken.getMessage().getPayload()));
return Action.CommitSuccess;
}
};
3、消息接收
连接建立后,服务端会立即向SDK推送已订阅的消息,因此建连时需要提供默认消息接收接口,用于处理未设置回调的消息。建议在connect之前,调用setMessageListener设置消息回调。
默认消息回调设置示例如下:
MessageClient messageClient = MessageClientFactory.messageClient(profile);
messageClient.setMessageListener(messageCallback);
3.1 消息接收接口
用户需要实现MessageCallback接口的consume方法,并调用client的setMessageListener()方法。
代码片段示例如下:
MessageCallback messageCallback = new MessageCallback() {
public Action consume(MessageToken messageToken) {
System.out.println("receive : " + new String(messageToken.getMessage().getPayload()));
return Action.CommitSuccess;
}
};
messageClient.setMessageListener(messageCallback);
3.2 指定Topic回调
对于消息接收的回调,可以指定带通配符的Topic,如/${ProductKey}/{$DeviceName}/#,指定Topic的回调优先级高于通用的回调,一条消息匹配到多个Topic时,按字典序优先调用,仅会回调一次。
示例如下:
// 当收到消息的Topic匹配到"/Product_A/Device_B/update"时,会优先调用该回调
messageClient.setMessageListener("/Product_A/Device_B/#",messageCallback);
3.3 通用回调
设置该回调后,对于未设置指定的topic回调的消息,均会调用该回调。示例如下:
// 当收到消息的topic未匹配到已指定的Topic时,调用该回调
messageClient.setMessageListener(messageCallback);
4、完整示例
public static void main(String[] args) throws UnsupportedEncodingException {
Profile profile = Profile.getAppKeyProfile("要连接的<END_POINT>", "你的<AppKey>", "你的<AppSecret>");
MessageCallback messageCallback = new MessageCallback() {
public Action consume(MessageToken messageToken) {
System.out.println("receive : " + new String(messageToken.getMessage().getPayload()));
return Action.CommitSuccess;
}
};
MessageClient messageClient = MessageClientFactory.messageClient(profile);
messageClient.setMessageListener(messageCallback);
messageClient.connect(messageCallback);
try
{
System.in.read();
} catch (Exception e) {}
}
5、连接节点信息
区域 | End point |
---|---|
国内 | https://ilop.iot-as-http2.cn-shanghai.aliyuncs.com:443 |
海外 | https://ilop.iot-as-http2.ap-southeast-1.aliyuncs.com:443 |
6、消息格式
(1) 物的属性变更消息
消息字段说明:
参数 | 类型 | 含义 |
---|---|---|
deviceType | String | 设备品类Key |
gmtCreate | Long | 数据流转消息产生时间, 自1970-1-1起流逝的毫秒值 |
iotId | String | 物的唯一id |
productKey | String | 设备所属产品 |
deviceName | String | 设备名称 |
items | JSON | 变更的状态列表,列表元素包括:attribute - 变更属性, value - 变更值, time - 采样时间 |
消息范例:
{
"deviceType": "SmartDoor",
"iotId": "Xzf15db9sucTHBgUo6WR001046b400",
"productKey": "a17xxd5TYNA",
"gmtCreate": 1534299145304,
"deviceName": "Xzf15db9sucTHBgUo6WR",
"items": {
"WIFI_Rx_Rate": {
"value": 74274,
"time": 1534299145344
}
}
}
(2) 物的事件变更消息
消息字段说明:
参数 | 类型 | 含义 |
---|---|---|
deviceType | String | 设备品类Key |
iotId | String | 物的唯一id |
productKey | String | 设备所属产品 |
deviceName | String | 设备名称 |
identifier | String | 事件标识符,对应事件的 identifier |
name | String | 事件名称 |
type | String | 事件类型 |
time | Long | 设备上报value对应的时间戳(毫秒) |
value | JSON | 变更的事件属性列表:key - value 键值对 |
消息范例:
{
"deviceType": "SmartDoor",
"identifier": "DoorOpenNotification",
"iotId": "Xzf15db9sucTHBgUo6WR001046b400",
"name": "开门通知",
"time": 1534319108982,
"type": "info",
"productKey": "a17xxd5TYNA",
"deviceName": "Xzf15db9sucTHBgUo6WR",
"value": {
"KeyID": "x8hQRXMkDY",
"LockType": 3
}
}
(3) 物的服务回复消息
消息字段说明:
参数 | 类型 | 含义 |
---|---|---|
gmtCreate | Long | 数据流转消息产生时间, 自1970-1-1起流逝的毫秒值 |
iotId | String | 物的唯一id |
productKey | String | 设备所属产品 |
deviceName | String | 设备名称 |
requestId | String | 阿里云产生和设备通信的信息id |
code | Integer | 调用的结果信息 |
message | String | 结果信息说明 |
data | Object | 设备返回的结果,非透传之间返回设备结果,透传则需要经过脚本转换 |
消息范例:
{
"gmtCreate": 1510292739881,
"iotId": "4z819VQHk6VSLmmBJfrf00107ee200",
"productKey": "p1gsv0teUBd",
"deviceName": "xxxxxxxxxx",
"requestId": "1234",
"code": 200,
"message": "success",
"topic": "/sys/p1gsv0teUBd/xxxxxxxxxx/thing/service/property/set",
"data": {}
}
(4) 物的状态变更消息
消息字段说明:
参数 | 类型 | 含义 |
---|---|---|
deviceType | String | 设备品类Key |
gmtCreate | Long | 数据流转消息产生时间, 自1970-1-1起流逝的毫秒值 |
iotId | String | 物的唯一id |
action | String | 设备状态变更动作: online - 上线动作,offline - 下线动作 |
productKey | String | 设备所属产品 |
deviceName | String | 设备名称 |
status | JSON | 状态信息,元素包括:value - 状态值, time - 采样时间 value状态值定义: 1(在线), 0(离线) |
消息范例:
{
"deviceType": "SmartDoor",
"iotId": "Xzf15db9sucTHBgUo6WR001046b400",
"action": "online",
"productKey": "a17xxd5TYNA",
"gmtCreate": 1534319611368,
"deviceName": "Xzf15db9sucTHBgUo6WR",
"status": {
"time": 1534319611368,
"value": "1"
}
}