物联网平台服务端订阅支持将设备消息发送至消息服务(MNS),云端应用通过监听MNS队列,获取设备消息。下面讲解使用MNS订阅设备消息的配置方法。

前提条件

如果使用子账号,子账号需拥有AliyunIOTAccessingMNSRole角色权限。
说明 华北2(北京)、华南1(深圳)地域不支持MNS服务端订阅。

操作步骤

  1. 在物联网平台控制台上,为产品配置服务端订阅,实现物联网平台将消息自动转发至MNS。
    1. 登录物联网平台控制台
    2. 在左侧导航栏,选择规则引擎 > 服务端订阅
    3. 服务端订阅页的订阅列表页签下,单击创建订阅
    4. 创建订阅对话框中,完成配置,单击确定
      参数 说明
      产品 选择订阅消息源设备所属的产品。
      订阅类型 选择为MNS
      推送消息类型 服务端要订阅的消息类型。目前,服务端可订阅的设备消息类型包括:
      • 设备上报消息:产品下所有设备Topic列表中,操作权限发布的Topic中的消息。勾选后,可以通过AMQP SDK接收设备发布的消息。

        设备上报消息,包括设备上报的自定义数据和物模型数据(属性上报、事件上报、属性设置响应和服务调用响应)。推送到服务端的物模型数据是经物联网平台系统处理过后的数据,数据格式请参见数据格式

        例如,一个产品有3个Topic类,分别是:
        • /${YourProductKey}/${YourDeviceName}/user/get,具有订阅权限。
        • /${YourProductKey}/${YourDeviceName}/user/update,具有发布权限。
        • /${YourProductKey}/${YourDeviceName}/thing/event/property/post,具有发布权限。

        那么,服务端订阅会推送具有发布权限的Topic类中的消息,即/${YourProductKey}/${YourDeviceName}/user/update/${YourProductKey}/${YourDeviceName}/thing/event/property/post中的消息。

      • 设备状态变化通知:该产品下的设备上下线状态变化时通知的消息。
      • 网关子设备发现上报:网关将发现的子设备信息上报给物联网平台。需要网关上的应用程序支持。网关产品特有消息类型。
      • 设备拓扑关系变更:子设备和网关之间的拓扑关系建立和解除消息。网关产品特有消息类型。
      • 设备生命周期变更:设备创建、删除、禁用、启用等消息。
      • 物模型历史数据上报:设备上报的属性和事件历史数据。
      • 固件升级状态通知:验证固件和批量升级时,设备升级成功或失败的事件通知。
    5. 在弹出的确认对话框中,单击确定
      物联网平台将自动创建MNS消息队列,名称格式为aliyun-iot-${yourProductKey}。您在配置监听MNS队列时,需配置为该队列。

      MNS会收取费用,具体计费方式,请参见MNS计费

      说明 如果删除已创建的MNS服务端订阅,对应的MNS队列也会自动删除。
  2. 配置MNS客户端,监听MNS队列,以接收设备消息。

    以下示例中,使用MNS Java SDK监听消息。

    下载MNS SDK Demo,请访问MNS文档

    1. 在pom.xml文件中,添加如下依赖安装MNS Java SDK。
      <dependency>
          <groupId>com.aliyun.mns</groupId>
          <artifactId>aliyun-sdk-mns</artifactId>
          <version>1.1.8</version>
          <classifier>jar-with-dependencies</classifier>
      </dependency>
    2. 配置接收消息时,需填入以下信息。
      CloudAccount account = new CloudAccount( $AccessKeyId, $AccessKeySecret, $AccountEndpoint);
      • $AccessKeyId$AccessKeySecret需替换为您的阿里云账号访问API的基本信息。登录阿里云控制台,光标移至阿里云账号头像上,然后单击AccessKey管理,创建或查看AccessKey信息。
      • $AccountEndpoint需填写实际的Endpoint值。在MNS控制台,单击获取Endpoint获取。
    3. 填写接收设备消息的逻辑。
      MNSClient client = account.getMNSClient(); 
      CloudQueue queue = client.getQueueRef("aliyun-iot-a1xxxxxx8o9"); //请输入物联网平台自动创建的队列名称。
      
          while (true) { 
          // 获取消息。 
          Message popMsg = queue.popMessage(10); //长轮询等待时间为10秒。      
          if (popMsg != null) { 
              System.out.println("PopMessage Body: "+ popMsg.getMessageBodyAsRawString()); //获取原始消息。 
              queue.deleteMessage(popMsg.getReceiptHandle()); //从队列中删除消息。 
          } else { 
              System.out.println("Continuing"); } }
                                  
    4. 运行程序,完成对MNS队列的监听。
  3. 启动设备,上报消息。

    设备端SDK开发,请参见Link SDK文档

  4. 检查云端应用是否监听到设备消息。若成功监听,将获得如下所示消息代码。
    {
    "messageid":" ",
    "messagetype":"upload",
    "topic":"/al12345****/device123/user/update",
    "payload":" ", 
    "timestamp": " ",
    }
    参数 说明
    messageid 物联网平台生成的消息ID。
    messagetype 消息类型。 取值:
    • upload:设备上报消息
    • status:设备状态变化通知
    • topo_listfound:网关子设备发现上报
    • topo_lifecycle:设备拓扑关系变更
    • device_lifecycle:设备生命周期变更
    • thing_history:物模型历史数据上报
    • ota_event:固件升级状态通知
    topic 服务端监听到的信息来源的物联网平台Topic。
    payload Base64编码的消息数据。

    payload数据格式,请参见数据格式

    timestamp 时间戳,以Epoch时间表示。