设备数据订阅服务
更新时间:2019-11-16 11:38:47
设备连接物联网平台后,数据将直接上报至平台,平台上的数据可以通过HTTP/2通道流转至您的服务器。这一步中,我们将配置HTTP/2服务端订阅功能,并设置HTTP/2 SDK。您的服务器可以通过接入HTTP/2 SDK,接收设备数据。当前版本支持订阅所有已配网的设备上报的属性、事件、上下线状态。
操作步骤
- 在智能人居开放平台上,找到扩展服务->设备数据订阅,打开数据同步开关。
- 接入HTTP/2 SDK。如果您使用Apache Maven来管理Java项目,需在项目的pom.xml文件中加入以下依赖项。说明 目前仅提供Java8版SDK。
<dependency> <groupId>com.aliyun.openservices</groupId> <artifactId>iot-client-message</artifactId> <version>1.1.3</version> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>3.7.1</version> </dependency>
- 基于您的阿里云账号AccessKey进行身份认证,建立SDK与平台的连接。
// 阿里云accessKey String accessKey = "xxxxxxxxxxxxxxx"; // 阿里云accessSecret String accessSecret = "xxxxxxxxxxxxxxx"; // regionId String regionId = "cn-shanghai"; // 阿里云uid String uid = "xxxxxxxxxxxx"; // endPoint: https://${uid}.iot-as-http2.${region}.aliyuncs.com String endPoint = "https://" + uid + ".iot-as-http2." + regionId + ".aliyuncs.com"; // 连接配置 Profile profile = Profile.getAccessKeyProfile(endPoint, regionId, accessKey, accessSecret); // 构造客户端 MessageClient client = MessageClientFactory.messageClient(profile); // 数据接收 client.connect(messageToken -> { Message m = messageToken.getMessage(); System.out.println("receive message from " + m); return MessageCallback.Action.CommitSuccess; });
- 其中, a. accessKey和accessSecret:登录阿里云控制台后,将光标移至账号头像上,在选项框中单击accesskeys,即可跳转至用户信息管理页,获取您的Access Key ID和Access Key Secret。 b. uid:登录阿里云控制台后,将光标移至账号头像上,在选项框中单击安全设置,即可跳转至账号管理页面,获取您的账号ID。 c. regionId:您物联网平台服务所在地域。RegionId 的表达方法,请参见通用参考地域与可用区
- 确认HTTP/2 SDK可以接收到设备消息。若成功监听,可以通过SDK的消息回调获得以下数据:
参数 | 说明 |
---|---|
messageId | 物联网平台生成的消息ID,19位大小。 |
topic | 消息来自的Topic,此处的Topic为/sys/${productKey}/${deviceName}/homelink/device 。${productKey}和${deviceName}分别表示设备在物联网平台上的设备证书中的ProductKey和DeviceName。 |
payload | 消息内容:根据其中的messageType字段区分消息类型 DEVICE_PROPERTY 物的属性变更消息 DEVICE_EVENT 物的事件变更消息 DEVICE_STATUS_CHANGE 物的状态变更消息 详见下面的字段说明和消息范例。 |
generateTime | 消息生成时间戳,以毫秒表示。 |
qos | 0:消息最多投递1次。 1:消息最少投递1次。 |
(1) 属性变更消息
消息字段说明:
参数 | 类型 | 含义 |
---|---|---|
messageType | String | DEVICE_PROPERTY 属性变更消息 |
deviceType | String | 设备品类Key |
gmtCreate | Long | 数据流转消息产生时间, 自1970-1-1起流逝的毫秒值 |
iotId | String | 物的唯一id |
productKey | String | 设备所属产品 |
deviceName | String | 设备名称 |
items | JSON | 变更的状态列表,列表元素包括:attribute - 变更属性, value - 变更值, time - 采样时间 |
消息范例:
{
"messageType": "PROPERTIES_CHANGED",
"deviceType": "SmartDoor",
"iotId": "Xzf15db9sucTHBgUo6WR001046b400",
"productKey": "a17xxd5TYNA",
"gmtCreate": 1534299145304,
"deviceName": "Xzf15db9sucTHBgUo6WR",
"items": {
"WIFI_Rx_Rate": {
"value": 74274,
"time": 1534299145344
}
}
}
(2) 事件变更消息
消息字段说明:
参数 | 类型 | 含义 |
---|---|---|
messageType | String | DEVICE_EVENT 事件变更消息 |
deviceType | String | 设备品类Key |
iotId | String | 物的唯一id |
productKey | String | 设备所属产品 |
deviceName | String | 设备名称 |
identifier | String | 事件标识符,对应事件的 identifier |
name | String | 事件名称 |
type | String | 事件类型 |
time | Long | 设备上报value对应的时间戳(毫秒) |
value | JSON | 变更的事件属性列表:key - value 键值对 |
消息范例:
{
"messageType":"DEVICE_EVENT",
"deviceType":"test_device_type",
"productKey":"test_pk",
"deviceName":"test_dn",
"iotId":"test_id",
"gmtCreate":1551258879819,
"identifier":"test_code", //eventCode
"name":"test_name", //eventName
"type":"test_type", //eventType
"time":1551266428908,
"value":{
"test_attr":"test_val"
}
}
(3) 状态变更消息
消息字段说明:
参数 | 类型 | 含义 |
---|---|---|
messageType | String | DEVICE_STATUS_CHANGE 状态变更消息 |
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(离线) |
消息范例:
{
"messageType":"DEVICE_STATUS_CHANGE",
"deviceType":"test_device_type",
"productKey":"test_pk",
"deviceName":"test_dn",
"iotId":"test_id",
"gmtCreate":1551258879819,
"action":"online",
"status":{
"time":1551258879819,
"value":"1"
}
}