本文介绍如何配置服务端订阅,将产品下的设备状态变化消息推送到消息服务(MNS)队列中;服务器通过监听MNS队列接收设备状态变化消息。

前提条件

背景信息

数据流转流程如下图所示。

设备消息订阅

配置服务端订阅

首先在物联网平台控制台创建MNS服务端订阅,选择要订阅的消息类型。

  1. 登录物联网平台控制台
  2. 实例概览页面,找到对应的实例,单击实例进入实例详情页面。
    注意 目前华东2(上海)、日本(东京)地域开通了企业版实例服务。其他地域,请跳过此步骤。
    实例概览
  3. 在左侧导航栏,选择设备管理 > 产品,再单击创建产品,创建一个气体监测仪产品。
  4. 选择设备 > 添加设备,在刚创建的气体监测仪产品下创建设备。

    设备证书信息将会用于设备端SDK开发配置。

  5. 在左侧导航栏,选择规则引擎 > 服务端订阅,然后单击创建订阅,创建MNS服务端订阅。具体操作,请参见使用MNS服务端订阅
    说明 首次设置推送到MNS时,需单击提示中的授权,进入RAM控制台同意授权IoT访问MNS。

    本示例中,选择推送消息类型为设备状态变化通知,即该产品下所有设备的状态变化消息,都会被推送到MNS队列中。

    订阅成功后,物联网平台会在MNS中,自动创建一个接收物联网平台消息的队列。队列名称格式为:aliyun-iot-${yourProductKey}。您在配置MNS SDK监听消息时,需填入该队列名称。

    在订阅列表中,单击MNS右侧的图标,可查看MNS队列名称。

    设备消息订阅

配置服务端MNS SDK接收消息

本示例使用MNS Java SDK Demo。

  1. 访问MNS Java SDK版本说明,下载sample包文件,并解压缩。
    本示例使用sample包文件为aliyun-sdk-mns-samples-1.1.9.1.zip
  2. 在IntelliJ IDEA中,导入工程aliyun-sdk-mns-samples-1.1.9.1文件夹。
  3. 在计算机的本地目录C:\Users\${YourComputerUserName}下,添加一个PROPERTIES类型文件.aliyun-mns.properties,并在文件中输入MNS访问身份认证信息,格式如下:
    说明 Linux系统用户目录为/home/YOURNAME/,Windows系统用户目录为C:\Users\YOURNAME
    mns.accountendpoint=http://${your_accountId}.mns.${your_regionId}.aliyuncs.com
    mns.accesskeyid=${your_accesskeyid}
    mns.accesskeysecret=${your_accesskeysecret}
    参数 说明
    accountendpoint 您的MNS服务Endpoint。请在消息服务控制台,选择队列所在地域单击队列的详情查看。
    accesskeyid 您的阿里云账号的AccessKey ID和AccessKey Secret。

    登录物联网平台控制台,将鼠标移至账号头像上,然后单击AccessKey管理,获取AccessKey ID和AccessKey Secret。

    accesskeysecret
  4. src\main\java\com.aliyun.mns.sample.Queue目录下的ComsumerDemo文件中,配置物联网平台自动创建的消息服务队列名称。
        public static void main(String[] args) {
            CloudAccount account = new CloudAccount(
                    ServiceSettings.getMNSAccessKeyId(),
                    ServiceSettings.getMNSAccessKeySecret(),
                    ServiceSettings.getMNSAccountEndpoint());
            MNSClient client = account.getMNSClient(); //client初始化
    
            // 提取消息
            try{
                CloudQueue queue = client.getQueueRef("aliyun-iot-a1eN7La****");// 替换为物联网平台自动创建的队列
                for (int i = 0; i < 10; i++)
                {
                    Message popMsg = queue.popMessage(); //长轮询等待时间
                    if (popMsg != null){
                        System.out.println("message handle: " + popMsg.getReceiptHandle());
                        System.out.println("message body: " + popMsg.getMessageBodyAsString()); //获取原始消息
                        System.out.println("message id: " + popMsg.getMessageId());
                        System.out.println("message dequeue count:" + popMsg.getDequeueCount());
                        //<<to add your special logic.>>
    
                        //从队列中删除消息
                        queue.deleteMessage(popMsg.getReceiptHandle());
                        System.out.println("delete message successfully.\n");
                    }
                }
            }
  5. 运行程序文件ComsumerDemo.java

配置设备端SDK

  1. 访问设备接入Link SDK,选择Java SDK。
  2. 下载Java SDK Demo,然后解压缩。
    说明 下载本Demo默认您同意本软件许可协议
  3. 在IntelliJ IDEA中,导入工程JavaLinkKitDemo
  4. device_id文件中,填入设备证书信息。
    设备消息订阅
  5. src\main\java\com.aliyun.alink.devicesdk.demo目录下的MqttSample文件中,将publish对应的Topic配置为您的设备Topic。
    设备消息订阅
  6. src\main\java\com.aliyun.alink.devicesdk.demo目录下的HelloWorld文件中,填入设备接入信息。
    设备接入信息的获取方法,请参见查看实例终端节点接入地址
  7. 运行设备连接的程序文件:HelloWorld.java

结果验证

设备端SDK运行后,设备上线消息通过服务端订阅发送到消息服务队列中。消息服务SDK从队列中接收消息,并同时将已接收的消息从队列中删除。

下图展示消息服务SDK接收并删除消息。

设备消息订阅