在某些物联网场景下,设备状态信息和设备采集的数据不通过规则引擎流转到其他阿里云云产品中,而是直接由业务服务器接收。使用服务端订阅功能,可将设备产生的消息通过HTTP/2通道直接推送到业务服务器,以便您根据自身业务场景消费数据。

前提条件

在控制台创建产品、创建设备,设备连接物联网平台。具体请参考快速入门

背景信息

本文以温湿度计为例,构建客户端,介绍服务端订阅功能的使用和数据流转。



配置服务端订阅

  1. 物联网平台控制台,单击左侧导航栏产品管理
  2. 在产品列表中,搜索到要配置服务端订阅的产品,并单击该产品对应的查看按钮。
  3. 产品详情页,单击服务端订阅 > 设置
  4. 勾选服务端要订阅的消息类型。本示例中,选择设备上报消息,即服务端订阅设备上报的数据。

    选择消息类型

使用服务端订阅SDK

说明 当前仅提供Java8版SDK。
  1. 在工程中添加以下依赖,导入服务端HTTP/2 SDK。
    <!-- Aliyun core -->
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>aliyun-java-sdk-core</artifactId>
        <version>3.7.1</version>
    </dependency>
    
    <!-- iot message client -->
    <dependency>
        <groupId>com.aliyun.openservices</groupId>
        <artifactId>iot-client-message</artifactId>
        <version>1.1.2</version>
    </dependency>
  2. 基于您的阿里云账号信息进行身份认证,建立HTTP/2 SDK与物联网平台的连接。
    import java.net.UnknownHostException;
    import java.util.concurrent.ExecutionException;
    
    import com.aliyun.openservices.iot.api.Profile;
    import com.aliyun.openservices.iot.api.message.MessageClientFactory;
    import com.aliyun.openservices.iot.api.message.api.MessageClient;
    import com.aliyun.openservices.iot.api.message.callback.MessageCallback;
    import com.aliyun.openservices.iot.api.message.entity.Message;
    
    public class H2Client {
    
        public static void main(String[] args) throws UnknownHostException, 
                                    ExecutionException, InterruptedException {
            // 身份
            String accessKey = "阿里云accessKey";
            String accessSecret = "阿里云accessSecret";
            String regionId = "cn-shanghai";
            String uid = "阿里云账号 uid";
            String endPoint = "https://" + uid + ".iot-as-http2." + regionId + ".aliyuncs.com";
            // 连接配置
            Profile profile = Profile.getAccessKeyProfile(endPoint, regionId, accessKey, accessSecret);
    
            // 构造客户端
            MessageClient client = MessageClientFactory.messageClient(profile);
            // 数据接收
            client.connect(messageToken -> {
                Message m = messageToken.getMessage();
                System.out.println("\ntopic="+m.getTopic());
                System.out.println("payload=" + new String(m.getPayload()));
                System.out.println("generateTime=" + m.getGenerateTime());
                // 此处标记CommitSuccess已消费,IoT平台会删除当前Message,否则会保留到过期时间
                return MessageCallback.Action.CommitSuccess;
            });
        }
    }

设备上报消息后,物联网平台通过HTTP/2通道会将消息数据发送给服务端。

数据流转示例

  • 不使用物模型的设备

    设备上线,发布温湿度消息,然后下线。

    自定义温湿度数据格式:

    {
        "temperature": 27,
        "humidity": 26
    }

    业务服务器接收到的消息:

    # 设备上线 消息
    topic=/as/mqtt/status/a1wLOMQOK4K/temperature-Monitor
    payload={
        "lastTime": "2018-09-04 14:59:59.782",
        "utcLastTime": "2018-09-04T06:59:59.782Z",
        "clientIp": "42.120.75.152",
        "utcTime": "2018-09-04T06:59:59.794Z",
        "time": "2018-09-04 14:59:59.794",
        "productKey": "a1wLOMQOK4K",
        "deviceName": "temperature-Monitor",
        "status": "online"
    }
    generateTime=1536044399797
    
    # 设备上报 数据消息
    topic=/a1wLOMQOK4K/temperature-Monitor/temperatureData
    payload={
        "temperature": 27,
        "humidity": 26
    }
    generateTime=1536044404762
    
    # 设备离线 消息
    topic=/as/mqtt/status/a1wLOMQOK4K/temperature-Monitor
    payload={
        "lastTime": "2018-09-04 15:00:09.761",
        "utcLastTime": "2018-09-04T07:00:09.761Z",
        "utcTime": "2018-09-04T07:00:13.337Z",
        "time": "2018-09-04 15:00:13.337",
        "productKey": "a1wLOMQOK4K",
        "deviceName": "temperature-Monitor",
        "status": "offline"
    }
    generateTime=1536044413339
    说明 目前服务端订阅是基于阿里云账号UID的,该账号创建的产品的消息都会被HTTP/2客户端接收。因此,您可以根据Topic中包含的产品ProductKey和DeviceName区分服务端消费。
  • 使用物模型的设备

    设备上线,发布温湿度消息,然后下线。

    上报属性数据格式:

    {
        "id": 1536045963829,
        "params":{
            "temperature": 20,
            "humidity": 22
        },
        "method": "thing.event.property.post"
    }

    业务服务器接收到的消息:

    # 设备上线 消息
    topic=/as/mqtt/status/a1gMuCoK4m2/nuwr5r9hf6l
    payload={
        "lastTime": "2018-09-04 15:25:53.771",
        "utcLastTime": "2018-09-04T07:25:53.771Z",
        "clientIp": "42.120.75.152",
        "utcTime": "2018-09-04T07:25:53.787Z",
        "time": "2018-09-04 15:25:53.787",
        "productKey": "a1gMuCoK4m2",
        "deviceName": "nuwr5r9hf6l",
        "status": "online"
    }
    generateTime=1536045953787
    
    # 设备上报 经过物模型解析后的数据消息
    topic=/a1gMuCoK4m2/nuwr5r9hf6l/thing/event/property/post
    payload={
        "deviceType": "None",
        "iotId": "hutrRN9iuBvO5QOclH4f0010885100",
        "productKey": "a1gMuCoK4m2",
        "gmtCreate": 1536045958765,
        "deviceName": "nuwr5r9hf6l",
        "items":{
            "temperature":{
                "value": 20,
                "time": 1536045958770
            },
            "humidity":{
                "value": 22,
                "time": 1536045958770
            }
        }
    }
    generateTime=1536045958770
    
    # 设备离线 消息
    topic=/as/mqtt/status/a1gMuCoK4m2/nuwr5r9hf6l
    payload={
        "lastTime": "2018-09-04 15:26:03.749",
        "utcLastTime": "2018-09-04T07:26:03.749Z",
        "utcTime": "2018-09-04T07:26:06.586Z",
        "time": "2018-09-04 15:26:06.586",
        "productKey": "a1gMuCoK4m2",
        "deviceName": "nuwr5r9hf6l",
        "status": "offline"
    }
    generateTime=1536045966588
    说明 使用物模型的设备数据消息格式为物模型解析后的格式,非设备原始payload格式。

    数据流转过程