HTTP/2转储功能适用于生活物联网平台与企业服务器之间的消息流转。通过集成和使用HTTP/2 SDK,即可实现身份认证、消息接收的能力。我们推荐使用HTTP/2的方式推送设备数据(如设备状态数据、设备控制记录等),用户信息数据等。

前提条件

启动设备数据同步,并配置要同步数据的产品。详细参见设置数据同步数据同步
说明 当开启数据同步后,集成HTTP/2客户端SDK来订阅数据。如果通过控制台关闭数据同步再开启时,客户端SDK需要重新进行连接流程,否则无法正常接收数据。如果切换不同的HTTP/2客户端,需要把之前的客户端断开,再连接新的客户端。否则新客户端无法正常接收数据。

HTTP/2 SDK使用

  1. 引入依赖。
    在项目中添加Maven依赖,Maven信息如下。
    <dependency>
      <groupId>com.aliyun.openservices</groupId>
      <artifactId>iot-client-message</artifactId>
      <version>1.1.5</version>
    </dependency>
    
    <dependency>
        <groupId>commons-codec</groupId>
        <artifactId>commons-codec</artifactId>
        <version>1.11</version>
    </dependency>
                            
  2. 认证身份信息。
    • 身份认证需要使用AppKey和AppSecret,该信息可以从控制台中获取。获取身份信息
    • 认证身份信息需要profile信息,且Profile需要提供EndPoint、AppKey和AppSecret用于鉴权。
      Profile profile = Profile.getAppKeyProfile("${END_POINT}", "${APP_KEY}", "${APP_SECRET}");

      其中,EndPoint是连接节点,具体取值如下表所示。

      区域 End Point
      中国内地 https://ilop.iot-as-http2.cn-shanghai.aliyuncs.com:443
      新加坡 https://ilop.iot-as-http2.ap-southeast-1.aliyuncs.com:443
      美国(弗吉尼亚) https://ilop.iot-as-http2.us-east-1.aliyuncs.com:443
      德国(法兰克福) https://ilop.iot-as-http2.eu-central-1.aliyuncs.com:443
  3. 接收云端消息。

    首先需要创建消息接收的客户端对象client,并传入上面身份认证的profile信息。当消息接收的客户端和服务端建立连接后,服务端会立即向消息接收的客户端推送已订阅的消息,因此建立连接时需要提供默认消息接收的回调接口,用于处理云端推送的消息。

    代码片段示例如下。

    MessageClient messageClient = MessageClientFactory.messageClient(profile);
    MessageCallback messageCallback = new MessageCallback() {
            public Action consume(MessageToken messageToken) {
                System.out.println("receive : " + new String(messageToken.getMessage().getPayload()));
                return Action.CommitSuccess;
            }
        };
    
    messageClient.connect(messageCallback);
    • 消息接收的回调接口

      用户需要实现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);
    • 指定Topic回调

      对于消息接收的回调接口,可以指定带通配符的Topic,如/${ProductKey}/{$DeviceName}/#,指定Topic的回调优先级高于通用的回调,一条消息匹配到多个Topic时,按英文字母顺序优先调用,仅会回调一次。

      关于topic的概念请参见什么是Topic

      示例如下。

      // 当收到消息的Topic匹配到"/Product_A/Device_B/update"时,会优先调用该回调
      messageClient.setMessageListener("/Product_A/Device_B/#",messageCallback);
    • 通用回调

      设置该回调后,对于未设置指定的topic回调的消息,均会调用该回调。示例如下。

      // 当收到消息的topic未匹配到已指定的Topic时,调用该回调。该通用回调的设置效果等同于messageClient.connect(messageCallback)的。
      messageClient.setMessageListener(messageCallback);

    完整示例如下。

    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) {}
    }
    说明 消息推送失败时,平台会重新推送,重试策略如下。
    • 如果对端不在线或未回复ack消息,则会造成消息堆积,堆积的消息转为离线消息。
    • 离线消息每隔5min重试推送一次(每次推送10条)。对端如果成功接收了消息,则重试策略会继续推送剩余的离线消息(推送失败的消息,下一次继续推送)。
    • 离线消息最多会保存7天,如果7天后仍然无法推送成功,则会被删除。
    • 离线消息会进入单独的队列,不会影响后续消息的实时推送。

消息格式

  • 物的属性变更消息

    topic:/${productKey}/${deviceName}/thing/event/property/post

    消息字段说明如下。

    参数 子参数 子参数 类型 含义
    deviceType String 设备所属品类
    gmtCreate Long 数据流转消息产生时间,自1970-1-1起流逝的毫秒值
    iotId String 设备的唯一ID
    productKey String 设备所属产品的唯一标识符
    deviceName String 设备名称
    items JSON 变更的状态列表
    attribute String 发生变更的属性,具体取值由具体情况确定
    value 具体数据类型由具体情况确定 变更值
    time Long 设备属性发生变化的时间,自1970-1-1起流逝的毫秒值

    消息示例如下。

    {
        "deviceType": "SmartDoor",
        "iotId": "Xzf15db9xxxxxxxxWR001046b400",
        "productKey": "a17xxxxTYNA",
        "gmtCreate": 153xxxx145304,
        "deviceName": "Xzf15xxxxucTHBgUo6WR",
        "items": {
            "WIFI_Rx_Rate": {
                "value": 74274,
                "time": 1534299145344
            }
        }
    }  
  • 物的事件变更消息

    topic:/${productKey}/${deviceName}/thing/event/{tsl.event.identifier}/post

    消息字段说明如下。

    参数 子参数 类型 含义
    deviceType String 设备所属品类
    iotId String 设备的唯一ID
    productKey String 设备所属产品的唯一标识符
    deviceName String 设备名称
    identifier String 事件标识符,对应事件的identifier
    name String 事件名称
    type String 事件类型
    time Long 设备上报value对应的时间,自1970-1-1起流逝的毫秒值
    value JSON 变更的事件属性列表:key-value键值对
    key String 属性key
    value 具体数据类型由具体情况确定 属性取值

    消息示例如下。

    {
        "deviceType": "SmartDoor",
        "identifier": "Doorxxxxication",
        "iotId": "Xzf15db9xxxxxxxxx01046b400",
        "name": "开门通知",
        "time": 1534319108982,
        "type": "info",
        "productKey": "a17xxxxTYNA",
        "deviceName": "Xzf15xxxxucTHBgUo6WR",
        "value": {
            "KeyID": "x8xxxxxkDY",
            "LockType": 3
        }
    }
  • 设备服务返回消息

    topic:/${productKey}/${deviceName}/thing/downlink/reply/message

    消息字段说明如下。

    参数 类型 含义
    gmtCreate Long 数据流转消息产生时间,自1970-1-1起流逝的毫秒值
    iotId String 设备的唯一ID
    productKey String 设备所属产品的唯一标识符
    deviceName String 设备名称
    requestId String 阿里云产生和设备通信的信息ID
    code Integer 调用的结果信息
    message String 结果信息说明
    topic String 服务调用下行时使用的topic
    data Object 设备返回的结果,非透传之间返回设备结果,透传则需要经过脚本转换

    消息示例如下。

    {
      "gmtCreate": 151xxxx39881,
      "iotId": "4z819VQHxxxxxxxxxxxx7ee200",
      "productKey": "p1gxxxxBd",
      "deviceName": "xxxxxxxxxx",
      "requestId": "1234",
      "code": 200,
      "message": "success",
      "topic": "/sys/p1gsv0teUBd/xxxxxxxxxx/thing/service/property/set",
      "data": {}
    }           
  • 物的状态变更消息

    为了提高消息有效性,设备上下线过于频繁时,会对消息进行筛检。

    topic: /${productKey}/${deviceName}/mqtt/status

    消息字段说明如下。

    参数 子参数 类型 含义
    deviceType String 设备所属品类
    gmtCreate Long 数据流转消息产生时间,自1970-1-1起流逝的毫秒值
    iotId String 设备的唯一ID
    action String 设备状态变更动作:
    • online:上线动作
    • offline:下线动作
    productKey String 设备所属产品的唯一标识符
    deviceName String 设备名称
    status JSON 状态信息,元素包括:value-状态值,time-发生变化的时间
    time Long 设备上下线状态发生变化的时间,自1970-1-1起流逝的毫秒值
    value String 设备上下线状态

    value状态值定义:

    • 1:在线
    • 0:离线

    消息示例如下。

    {
        "deviceType": "SmartDoor",
        "iotId": "Xzf15dxxxxxxxxxxxxxxxx01046b400",
        "action": "online",
        "productKey": "a17xxxxxxTYNA",
        "gmtCreate": 153xxxx1368,
        "deviceName": "Xzf1xxxxxxxxxxxxgUo6WR",
        "status": {
            "time": 1534319611368,
            "value": "1"
        }
    }       
  • 用户绑定变更消息

    用户绑定/解绑设备产生的回流消息,用于同步用户与设备的绑定、解绑。

    topic:/${productKey}/${deviceName}/thing/awss/enrollee/user

    消息字段说明如下。

    参数 子参数 类型 含义
    bind bool true-绑定;false-解绑
    productKey String 设备所属产品的唯一标识符
    deviceName String 设备名称
    iotId String 设备的唯一ID
    messageCreateTime JSON 消息创建时间
    identityInfos list 用户信息列表
    identityId String 用户身份ID
    scopeId String 隔离ID
    tenantId String 租户ID
    owned Integer 拥有标记
    • 0:分享者
    • 1:拥有者
    params Map 扩展参数(暂未使用)
    {
      "bind":true,
      "productKey": "123xxxx569",
      "deviceName": "deviceNamexxxx34",
      "iotId": "",
      "messageCreateTime": 151xxxx9881,
      "identityInfos":[
         {
           "identityId":"50xxxxxxxxxxxx62060259",
           "scopeId":"",
           "tenantId":"1D89B5xxxxxxxxxxxxxxxx861678FF",
           "owned":1
         }
      ],
      "params":{
      }
    }