當需要對設備數據進行復雜或精細化處理,且單個產品下所有設備的消息量小于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下載和使用。