使用MNS服务端订阅

当需要对设备数据进行复杂或精细化处理,且单个产品下所有设备的消息量小于1,000 QPS时,可将物联网平台设备消息发送至轻量消息队列(原 MNS) SMQ(Simple Message Queue (formerly MNS))消费。配置MNS服务端订阅产品和消息类型完成创建MNS队列,MNS客户端可通过监听MNS队列,接收设备消息。本文介绍使用MNS服务端订阅设备消息的完整配置流程。

前提条件

已创建产品

背景信息

阿里云轻量消息队列(原 MNS) SMQ(Simple Message Queue (formerly MNS))是一种高效、可靠、安全、便捷和可弹性扩展的分布式消息服务。SMQ能够帮助开发者在应用的分布式组件之间自由地传递数据、通知消息,从而构建松耦合系统。

物联网平台支持使用的SMQ队列模型接收设备消息,详细内容,请参见队列模型特性队列模型基本概念

名词

说明

MNS服务端订阅

在物联网平台配置MNS服务端订阅产品和消息类型,自动创建SMQ队列。

MNS客户端

在您的业务服务器中使用SMQ云端SDK接收设备消息的消费端。SMQ云端SDK开发指南,请参见SDK下载和使用

消息类型

根据设备Topic消息划分的消息类型。订阅消息类型后,该类型下对应的设备Topic消息才能转发到MNS客户端。

消息类型对应设备Topic消息,请参见下文消息类型Topic表

物联网平台提供服务端订阅和云产品流转服务,均可将设备消息转发到SMQ客户端进行消费。对比服务端订阅功能,云产品流转功能支持先指定设备Topic和加工处理设备数据再进行消息转发。您可对比流转方案及应用场景,选择您业务需要的合适方案。具体内容,请参见数据流转方案对比。云产品流转方式的配置方法,请参见添加待流转的数据源数据转发到消息服务MNS

使用限制

  • 华北2(北京)、华南1(深圳)、新加坡、日本(东京)、美国(弗吉尼亚)、美国(硅谷)和德国(法兰克福)地域的企业版实例不支持MNS服务端订阅。

  • MQTT型实例不支持MNS服务端订阅。

  • 一个产品仅可对应创建一个SMQ队列订阅,超出MNS服务端订阅限制的设备消息不会转发到MNS客户端。MNS服务端订阅使用限制,请参见使用限制中队列相关限制说明。

  • 创建MNS服务端订阅后,无论是否有消息从物联网平台流转到队列中,SMQ都会收取队列资源占用费。

  • SMQ队列接收的每条消息不能超过64 KB,否则消息会被丢弃。

计费说明

  • 设备消息可以转发到SMQ的消息数量由设备所属实例下可用消息转发TPS规格决定。公共实例下消息转发TPS固定规格为5条/秒,不收费。企业版实例下消息转发TPS规格采用包年包月方式计费,可使用量由该实例下购买的消息转发TPS规格量决定。具体说明,请参见计费概述

  • SMQ接收消息会收取费用,具体计费方式,请参见计费说明

创建服务端订阅

在物联网平台创建MNS服务端订阅产品和消息类型后,会自动在当前账号对应SMQ的同地域下创建消息队列。SMQ云端SDK应用会通过监听该消息队列,接收已订阅的设备消息。

  1. 登录物联网平台控制台

  2. 实例概览页签的全部环境下,找到对应的实例,单击实例卡片。

  3. 在左侧导航栏,选择消息转发 > 服务端订阅

  4. 服务端订阅页的订阅列表页签下,单击创建订阅

  5. 创建订阅对话框中,完成配置,单击确认

    参数

    说明

    产品

    选择订阅消息源设备所属的产品。

    订阅类型

    选择为MNS

    授权

    单击授权,根据页面提示开通SMQ并授权。

    说明

    若已开通SMQ并授权,忽略此操作。

    立即授权

    单击立即授权,然后单击同意授权,系统创建角色AliyunIOTAccessingMNSRole授权物联网平台访问SMQ,将消息转发到SMQ

    说明

    若已创建角色AliyunIOTAccessingMNSRole,忽略此操作

    推送消息类型

    服务端要订阅的消息类型。目前,服务端可订阅的设备消息类型包括:

    重要

    对于云网关下产品和设备,仅支持推送设备上报消息设备状态变化通知设备生命周期变更的数据。消息转发Topic和数据格式的详情说明,请参见MQTT协议的消息通信说明GB/T 32960协议的消息转发说明JT/T 808协议的消息转发说明SL 651协议的消息转发说明

    • 设备上报消息:产品下所有设备Topic列表中,操作权限发布的Topic中的消息。

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

      例如,一个产品有3个Topic类,分别是:

      • /${productKey}/${deviceName}/user/get,具有订阅权限。

      • /${productKey}/${deviceName}/user/update,具有发布权限。

      • /${productKey}/${deviceName}/thing/event/property/post,具有发布权限。

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

    • 设备状态变化通知:该产品下的设备上下线状态变化时通知的消息。

    • 网关子设备发现上报:网关将发现的子设备信息上报给物联网平台。需要网关上的应用程序支持。网关产品特有消息类型。

    • 设备拓扑关系变更:子设备和网关之间的拓扑关系建立和解除消息。网关产品特有消息类型。

    • 设备生命周期变更:设备创建、删除、禁用、启用等消息。

    • 物模型历史数据上报:设备上报的属性和事件历史数据。

    • OTA升级设备状态通知:验证升级包和批量升级时,设备升级成功或失败的事件通知。

    表 1. Topic说明

    消息类型

    Topic说明

    相关文档

    设备上报消息:自定义Topic

    操作权限发布的自定义Topic。转发自定义数据格式消息的Topic,与原始自定义Topic的格式相同。

    使用自定义Topic通信

    设备上报消息:物模型数据

    消息转发Topic包含:

    • 设备上报属性数据的Topic:/${productKey}/${deviceName}/thing/event/property/post

    • 设备上报事件数据的Topic:/${productKey}/${deviceName}/thing/event/${tsl.event.identifier}/post

    • 设备批量上报属性数据的Topic:/${productKey}/${deviceName}/thing/property/batch/post

    • 设备批量上报事件数据的Topic:/${productKey}/${deviceName}/thing/event/batch/post

    • 设备响应云端命令返回消息的Topic:/${productKey}/${deviceName}/thing/downlink/reply/message

    对应设备上报原始数据的Topic如下:

    • 设备上报属性的Topic:/sys/${productKey}/${deviceName}/thing/event/property/post

    • 设备上报事件的Topic:/sys/${productKey}/${deviceName}/thing/event/${tsl.event.identifier}/post/sys/${productKey}/${deviceName}/thing/event/${tsl.functionBlockId}:{tsl.event.identifier}/post

    • 设备批量上报属性、事件数据的Topic:/sys/${productKey}/${deviceName}/thing/event/property/batch/post

    • 设备响应云端命令返回消息的Topic:/sys/${productKey}/${deviceName}/thing/service/${tsl.service.identifier}_reply

    设备状态变化通知

    物联网平台直接转发设备上下线状态变更消息,Topic为/as/mqtt/status/${productKey}/${deviceName}

    设备上下线状态

    网关发现子设备上报

    网关设备特有的Topic:/${productKey}/${deviceName}/thing/list/found,将发现的子设备信息上报给物联网平台,然后进行流转。

    网关发现子设备

    设备拓扑关系变更

    网关设备特有Topic:/${productKey}/${deviceName}/thing/topo/lifecycle,转发子设备和网关之间的拓扑关系建立和解除消息的Topic。

    设备拓扑关系变更

    对应设备上报原始数据的Topic:/sys/${productKey}/${deviceName}/thing/topo/change

    通知网关拓扑关系变化

    设备生命周期变更

    物联网平台直接转发设备创建、删除、禁用、启用等消息,Topic为/${productKey}/${deviceName}/thing/lifecycle

    设备生命周期变更

    物模型历史数据上报

    消息转发Topic包含:

    • 设备上报历史属性数据的Topic:/${productKey}/${deviceName}/thing/event/property/history/post

    • 设备上报历史事件数据的Topic:/${productKey}/${deviceName}/thing/event/${tsl.event.identifier}/history/post

    对应设备上报物模型历史数据的Topic:/sys/${productKey}/${deviceName}/thing/event/property/history/post

    物模型历史数据上报

    OTA升级设备状态通知

    消息转发Topic包含:

    • 设备上报OTA升级结果的Topic:/${productKey}/${deviceName}/ota/upgrade

    • 设备上报OTA升级进度的Topic:/${productKey}/${deviceName}/ota/progress/post

    对应设备上报升级进度的Topic:/ota/device/progress/${productKey}/${deviceName}

    设备上报升级进度

  6. 在弹出的确认对话框中,单击确认

    SMQ中自动创建SMQ队列,名称格式为aliyun-iot-${productKey}。例如:aliyun-iot-ws4******

    说明

    如果在物联网平台删除已创建的MNS服务端订阅,SMQ中对应的SMQ队列也会自动被删除。

开发消费客户端

在物联网平台配置MNS服务端订阅后,需要在您的业务服务器中使用SMQ云端SDK监听已订阅设备消息的SMQ队列,才能实现SMQ云端应用接收物联网平台设备消息。

物联网平台推荐使用SMQ Java SDK中队列模型Sample的ConsumerDemo ,监听已创建的SMQ队列(例如:aliyun-iot-ws4******)。

您可参考Java SDK版本说明,下载最新sample包文件。Java SDK使用,请参见队列使用手册的ConsumerDemo

您需在ComsumerDemo文件中,配置物联网平台自动创建的SMQ队列名称,例如:aliyun-iot-ws4******

CloudQueue queue = client.getQueueRef("aliyun-iot-ws4******");

接收消息的数据格式

设备接入物联网平台并上报消息(设备端开发,请参见使用设备端SDK接入),SMQ客户端监听设备消息成功后,会获得如下消息代码:

{
    "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:OTA升级设备状态通知。

topic

服务端监听到的信息来源的物联网平台Topic。

Topic说明,请参见上文创建服务端订阅中的Topic说明表。

payload

Base64编码的消息数据。

设备消息转发到轻量消息队列(原 MNS)的Topic和payload数据格式的详细内容,请参见数据格式

timestamp

时间戳,以Epoch时间表示。

相关文档

  • 您可在实例详情页面,查看消息转发TPS可用资源,确保设备消息能正常转发到SMQ进行消费。具体操作,请参见查看实例的可用资源。如果可用资源不足,可进行升配。具体内容,请参见实例计费的升配

  • 查看消息队列监控项,了解接收消息的数量。具体操作,请参见查看队列监控项

  • 您可以使用日志管理功能将消息队列的消息操作日志推送到日志服务Log Service。当消息的消费确认出现异常时,您可以通过MessageId查询消息轨迹等信息,从而进行异常诊断。具体内容,请参见推送日志到Log Service查看日志Log Service

  • 通过监听SMQ队列接收设备状态变化消息的实践教程,请参见服务端订阅(MNS)示例

  • SMQ支持多语言(Python、C#、PHP等)的SDK监听SMQ队列。具体内容,请参见SDK下载和使用