设备数据HTTP/2方式推送

更新时间:2019-07-29 10:16:44

HTTP/2转储功能适用于飞燕平台与企业服务器之间的大量消息流转。通过集成和使用HTTP/2 SDK,即可实现身份认证、消息接收的能力。
注意:设备数据HTTP/2方式推送是尽量但不保证送达,不会进行重传,因此会出现一定概率的数据丢失。

未命名.png | center | 728x239

一、准备工作

登录控制台,进入要启用数据推送的项目的项目设置界面,启动项目的数据推送服务,并配置要订阅数据的产品信息。

⚠️当开启推送服务后,集成HTTP/2客户端SDK来订阅数据,此时通过控制台关闭推送服务,再开启时客户端SDK需要重新进行连接流程,否则无法正常接收数据。

未命名.png | center | 728x239

二、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,该信息可以从控制台中获取,如图所示:

未命名.png | center | 728x239

建连时使用MessageClient.connect(Profile, MessageCallback)方法,Profile需要提供EndPoint,AppKey和AppSecret用于鉴权,MessageCallback为默认的消息回调,用于接收消息。
示例如下:

Profile profile = Profile.getAppKeyProfile("${END_POINT}", "${APP_KEY}", "${APP_SECRET}");

MessageCallback messageCallback = new MessageCallback() {
    public Action consume(MessageToken messageToken) {
        System.out.println("receive : " + new String(messageToken.getMessage().getPayload()));
        return Action.CommitSuccess;
    }
};

3、消息接收

连接建立后,服务端会立即向SDK推送已订阅的消息,因此建连时需要提供默认消息接收接口,用于处理未设置回调的消息。建议在connect之前,调用setMessageListener设置消息回调。
默认消息回调设置示例如下:

MessageClient messageClient = MessageClientFactory.messageClient(profile);
messageClient.setMessageListener(messageCallback);

3.1 消息接收接口

用户需要实现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);

3.2 指定Topic回调

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

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

3.3 通用回调

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

// 当收到消息的topic未匹配到已指定的Topic时,调用该回调
messageClient.setMessageListener(messageCallback);

4、完整示例

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

5、连接节点信息

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

6、消息格式

(1) 物的属性变更消息

消息字段说明:

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

(2) 物的事件变更消息

消息字段说明:

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

(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": {}
}

(4) 物的状态变更消息

消息字段说明:

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

results matching ""

    No results matching ""