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

前提条件

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

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}");
  3. 接收云端消息。

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

    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()方法;在consume方法中,当正确处理完消息后,需要返回Action.CommitSuccess状态,否则服务端会重传该条消息,导致不必要的数据重复,并且会影响后续的消息处理。代码片段示例如下。

      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匹配到"/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) {}
    }

连接节点信息

区域 End point
国内 https://ilop.iot-as-http2.cn-shanghai.aliyuncs.com:443
海外 https://ilop.iot-as-http2.ap-southeast-1.aliyuncs.com:443

消息格式

  • 物的属性变更消息

    消息字段说明如下。

    参数 类型 含义
    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
            }
        }
    }  
  • 物的事件变更消息

    消息字段说明如下。

    参数 类型 含义
    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
        }
    }
  • 物的服务回复消息

    消息字段说明如下。

    参数 类型 含义
    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": {}
    }           
  • 物的状态变更消息

    消息字段说明如下。

    参数 类型 含义
    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"
        }
    }