当需要对设备数据进行复杂或精细化处理,且单个产品下所有设备的消息量小于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,否则消息会被丢弃。
计费说明
创建服务端订阅
在物联网平台创建MNS服务端订阅产品和消息类型后,会自动在当前账号对应SMQ的同地域下创建消息队列。SMQ云端SDK应用会通过监听该消息队列,接收已订阅的设备消息。
登录物联网平台控制台。
在实例概览页签的全部环境下,找到对应的实例,单击实例卡片。
在左侧导航栏,选择 。
在服务端订阅页的订阅列表页签下,单击创建订阅。
在创建订阅对话框中,完成配置,单击确认。
参数
说明
产品
选择订阅消息源设备所属的产品。
订阅类型
选择为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:
/${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}
。在弹出的确认对话框中,单击确认。
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 | 消息类型。 取值:
|
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下载和使用。