业务数据订阅服务
更新时间:2020-08-03 19:41:26
除了设备数据可以由平台订阅以外,一些预定义好的业务数据也可以通过HTTP/2通道流转到您的服务器。
配置HTTP/2服务的订阅可以参考设备数据订阅服务中的操作步骤。
通用定义
topic
业务消息以模块维度发布,在topic上以${subject}体现数据分类,payload中是消息详情。
/broadcast/${uid}/homelink/${subject}
通用消息体
参数 | 类型 | 含义 |
---|---|---|
id | String | 消息ID |
messageType | String | 消息标题(类型) |
gmtCreate | Long | 数据消息产生时间, 自1970-1-1起流逝的毫秒值 |
data | JSON | 业务数据,见具体具体数据定义。 |
1. 设备重置
设备重置消息区分设备类型
普通设备重置
- 先下发“发起重置”消息;
- 云端解绑所有设备关系;
- 完成后下发“完成重置”消息。
网关设备重置
- 先下发网关设备的“发起重置”消息
- 循环处理所有子设备重置,步骤见普通设备重置
- 云端解绑所有网关设备关系;
- 完成后下发网关设备的“完成重置”消息。
举例来说:
- 如果被重置的设备是一台普通设备,订阅后会收到两条消息:
- 第一条是设备的发起重置消息
- 第二条是设备的完成重置消息;
- 如果被重置的设备是一台网关设备,下面有两个子设备。会收到:
- 第一条是网关设备的发起重置消息;
- 第二条和第三条是第一个子设备的发起重置和完成重置消息;
- 第四条和第五条是第二个子设备的发起重置和完成重置消息;
- 最后一条是网关设备的完成重置消息;
1.1. 发起重置
当重置请求到达云端,准备处理设备重置动作前,先下发“发起重置”消息。
Topic: /broadcast/${uid}/homelink/device
messageType: RESET
数据定义
参数 | 类型 | 含义 |
---|---|---|
iotId | String | 设备ID |
resetType | String | 重置动作的发起端类型 - COUND 云端发起的重置 - DEVICE 设备端发起的重置动作 - APP 用户从手机端发起的重置动作 |
示例
{
"iotId":"ODFL8xIUDLrtAnfNw90v001020ae10",
"resetType":"CLOUD"
}
1.2. 完成重置
当重置动作完成后,会把设备重置前的所有关系快照信息组织到消息中,下发“发起重置”消息。
Topic: /broadcast/${uid}/homelink/device
messageType: RESET_COMPLETE
数据定义
参数 | 类型 | 含义 |
---|---|---|
iotId | String | 设备ID |
resetType | String | 重置动作的发起端类型 - COUND 云端发起的重置 - DEVICE 设备端发起的重置动作 - APP 用户从手机端发起的重置动作 |
deviceType | String | 设备类型 - DEVICE 普通设备 - GATEWAY 网关 |
users | JSONArray | 设备的关联用户,结构见DeviceUser。 |
spaces | JSONArray | 设备的关联空间,结构见DeviceSpace。 |
scenes | JSONArray | 设备的关联场景,结构见DeviceScene。 |
children | JSONArray | 当设备是网关设备时,列出重置时的所有子设备的相关信息。 |
注:如果当前设备是网关设备,则所有子设备的关联信息都为空。包括users, spaces, scenes和children字段。
子设备的关联信息由单独的消息发送。
DeviceUser
参数 | 类型 | 含义 |
---|---|---|
identityId | JSONObject | 关联用户,类型Identity |
Identity
参数 | 类型 | 含义 |
---|---|---|
hid | String | 用户在人居的标识,见身份信息 |
hidType | String | 用户标识的类型,见身份信息 |
DeviceSpace
参数 | 类型 | 含义 |
---|---|---|
id | String | 用户在人居的标识,见身份信息 |
name | String | 用户标识的类型,见身份信息 |
rootSpaceId | String | 根空间ID |
parentId | String | 父空间ID |
typeCode | String | 空间类型代码 |
typeName | String | 空间类型名称 |
DeviceScene
参数 | 类型 | 含义 |
---|---|---|
id | String | 场景ID |
示例
{
"iotId":"ODFL8xIUDLrtAnfNw90v001020ae10",
"resetType":"CLOUD",
"deviceType":"GATEWAY",
"users":[
{
"identity":{
"hid":"abcd1234",
"hidType":"OPEN"
}
}
],
"spaces":[
{
"id":"space_id",
"name":"卧室",
"parentId":"parent_space_id_1",
"typeCode":"HOUSE",
"typeName":"房屋"
}
],
"scenes":[],
"children":[
{
"iotId":"child_device_1",
"deviceType":"GATEWAY",
"users":[
{
"identity":{
"appKey":"1234",
"hid":"abcd1234",
"hidType":"OPEN"
}
}
],
"spaces":[
{
"id":"space_id",
"name":"卧室",
"parentId":"parent_space_id_1",
"typeCode":"HOUSE",
"typeName":"房屋"
}
],
"scenes":[
{
"id":"scene_id_2"
}
],
"children":[]
}
]
}
1.3. 修改备注名
用户修改设备的备注名时,下发消息。
如果用户发起了修改操作,即使备注名不改变,仍会下发消息。
发生时机:
设备绑定时,如果传入了设备备注名(nickName)
调用更新设备备注名接口时
- /home/paas/device/nickname/update
- /home/app/device/nickname/update
第三方设备绑定时
Topic: /broadcast/${uid}/homelink/device
messageType: NICK_NAME
数据定义
参数 | 类型 | 含义 |
---|---|---|
iotId | String | 设备ID |
nickName | String | 新备注名 |
示例
{
"iotId":"ODFL8xIUDLrtAnfNw90v001020ae10",
"nickName":"卧室的灯"
}
2. 场景消息
删除设备的场景处理
触发设备重置时(云端、APP端或设备端),会尝试从关联的场景中把设备删除掉。相关的策略见:设备重置对场景的影响。
从场景人解绑设备,可能触发不同的场景处理动作:
如果删除设备后,场景仍然保持完整性,会重新保存不包含待删除设备的场景;
如果删除后,不能保持场景的完整性,则会删除场景;
Topic: /broadcast/${uid}/homelink/scene
messageType: unbindDevice
数据定义
**
参数 | 类型 | 含义 |
---|---|---|
iotId | String | 设备ID |
sceneId | String | 场景ID |
result | String | 处理结果: - UNBIND_DEVICE 成功解绑设备,场景重新保存 - DELETE_SCENE 删除场景 - DELETE_SCENE_ERROR 删除场景异常(联系技术支持) |
示例
{
"iotId":"ODFL8xIUDLrtAnfNw90v001020ae10",
"sceneId":"tObMKy4bazM9eejM",
"result":"UNBIND_DEVICE"
}
订阅
订阅时主要是创建连接,可以不指定要订阅的topic。
public static void main(String[] args) throws IOException, JoranException {
// 身份
String accessKey = "[accessKey]";
String accessSecret = "[accessSecret]";
String uid = "[uid]";
String regionId = "cn-shanghai";
String endPoint = "https://" + uid + ".iot-as-http2." + regionId + ".aliyuncs.com";
// 连接配置
Profile profile = Profile.getAccessKeyProfile(endPoint, regionId, accessKey, accessSecret);
profile.getAuthParams().put(Constraint.PARAM_ALIYUNCS_HOST, "iot.aliyuncs.com");
// 构造客户端
MessageClient client = MessageClientFactory.messageClient(profile);
// 数据接收
client.connect(messageToken -> {
Message m = messageToken.getMessage();
System.out.println("topic=" + m.getTopic());
System.out.println("payload=" + new String(m.getPayload()));
System.out.println("generateTime=" + m.getGenerateTime());
// 此处标记CommitSuccess已消费,IoT平台会删除当前Message,否则会保留到过期时间
return MessageCallback.Action.CommitSuccess;
});
}