业务数据订阅服务

更新时间:2020-08-03 19:41:26

除了设备数据可以由平台订阅以外,一些预定义好的业务数据也可以通过HTTP/2通道流转到您的服务器。


image.png


配置HTTP/2服务的订阅可以参考设备数据订阅服务中的操作步骤

通用定义

topic

业务消息以模块维度发布,在topic上以${subject}体现数据分类,payload中是消息详情。

/broadcast/${uid}/homelink/${subject}


通用消息体

参数 类型 含义
id String 消息ID
messageType String 消息标题(类型)
gmtCreate Long 数据消息产生时间, 自1970-1-1起流逝的毫秒值
data JSON 业务数据,见具体具体数据定义。

1. 设备重置

设备重置消息区分设备类型
普通设备重置

  1. 先下发“发起重置”消息;
  2. 云端解绑所有设备关系;
  3. 完成后下发“完成重置”消息。


网关设备重置

  1. 先下发网关设备的“发起重置”消息
  2. 循环处理所有子设备重置,步骤见普通设备重置
  3. 云端解绑所有网关设备关系;
  4. 完成后下发网关设备的“完成重置”消息。


举例来说:

  1. 如果被重置的设备是一台普通设备,订阅后会收到两条消息:
    1. 第一条是设备的发起重置消息
    2. 第二条是设备的完成重置消息;
  2. 如果被重置的设备是一台网关设备,下面有两个子设备。会收到:
    1. 第一条是网关设备的发起重置消息;
    2. 第二条和第三条是第一个子设备的发起重置完成重置消息;
    3. 第四条和第五条是第二个子设备的发起重置完成重置消息;
    4. 最后一条是网关设备的完成重置消息;

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;
    });
}


results matching ""

    No results matching ""