本文介紹設備與物聯網平臺和物聯網平臺與服務器端的通信相關問題和解決方法。
類目 | 問題 |
上下行消息 | |
通信Topic訂閱 | |
消息轉發 | |
消息存儲 | |
查詢消息 |
設備重復收到消息,如何去重?
由于QoS 1消息的機制是保證最少收到一次消息,所以可能會出現重復收到消息的情況,但重復消息的消息ID是相同的。設備端可以根據消息ID去重;物聯網平臺也會減少重復發送QoS 1消息。
設備使用MQTT協議接入物聯網平臺后,接收不到通信數據,怎么辦?
設備接收不到數據時,您可以根據實際場景,從以下幾個方面進行排查解決:
如果一直接收不到消息:檢查設備是否訂閱對應的通信Topic,MQTT設備接收消息需要先訂閱對應的通信Topic。
如果偶爾接收不到消息:查看設備端通信程序的回調中是否存在耗時邏輯。如果存在,建議相關耗時業務另起線程處理,不要在回調中直接處理。
如果設備端是Android、Java等SDK:設備程序中需先執行通信Topic的訂閱操作,再執行初始化操作,以免消息下推時,SDK尚未完成訂閱,導致錯過消息接收。
如果是QoS 1的消息沒有接收到:檢查MQTT連接參數cleanSession是否為false。cleanSession需要設置為false才可以接收離線期間的QoS 1消息。
物聯網平臺是否會保存消息?
消息通過Topic發送后,物聯網平臺就會立即將消息轉發給訂閱了該Topic的設備。
QoS 0消息:物聯網平臺不保存。
QoS 1消息:物聯網平臺會保存7天。
物聯網平臺的設備數據,在不轉儲的情況下,數據保留多長時間?
QoS 0消息:物聯網平臺不保存。
QoS 1消息:物聯網平臺會保存7天。
物聯網平臺發送消息比較慢,存在超時情況,為什么?
可能是網絡不穩定導致。
您可以執行以下操作,測試設備連接通信的網絡可用性:
登錄物聯網平臺控制臺。
在實例概覽頁面,找到對應的實例,單擊實例ID或備注名稱。
在左側導航欄,選擇設備管理 > 設備。
在設備頁面的設備列表上方,輸入目標設備的DeviceName或備注名稱,搜索設備。
單擊設備對應操作列的查看,查看設備信息。
在設備信息頁簽下,單擊實時延遲右側的測試。
單擊確認,測試網絡延遲。
您可重復步驟6~步驟7,多測試幾次。如果通信鏈路有高延遲,則說明是網絡不穩定。
物聯網平臺支持遺囑消息和保留消息嗎?
支持。物聯網平臺支持使用MQTT 5.0通信協議設置遺囑消息和保留消息。使用說明,請參見物聯網平臺支持的MQTT 5.0特性。
服務器端如何獲取設備消息?
服務器端可通過以下兩種方式獲取設備消息。
服務端訂閱:使用物聯網平臺的服務端訂閱功能,訂閱一個或多個消息類型。物聯網平臺根據您設置的訂閱,將產品下所有設備的該類型消息流轉至您的服務器。支持以下兩種方式的服務端訂閱:
云產品流轉:使用消息轉發的云產品流轉功能,通過數據流轉規則將指定設備數據流轉到輕量消息隊列(原 MNS) SMQ(Simple Message Queue (formerly MNS))的主題或消息隊列(RocketMQ)的隊列中。服務器通過MNS或RocketMQ SDK接收消息。詳細內容,請參見云產品流轉概述。
已配置MNS服務端訂閱,但在控制臺上發送消息,SMQ的隊列中并沒有收到該消息,為什么?
在物聯網平臺控制臺發送的消息和調用云端API發送的消息均屬于服務端發送的消息,不會轉發到輕量消息隊列(原 MNS) SMQ(Simple Message Queue (formerly MNS))隊列,只有設備發出的消息(設備上報消息、設備狀態變化通知、設備標簽變更等)才會轉發到SMQ隊列里。
如何判斷MNS服務端收到的消息是來自哪個Topic?
發送到輕量消息隊列(原 MNS) SMQ(Simple Message Queue (formerly MNS))隊列中的消息格式:
{
"messageid": "12345",
"messagetype": "status/upload",
"topic": "null/topic",
"payload": {},
"timestamp": 1469564576
}
您可根據topic
字段進行判斷。
如何從物聯網平臺云端下發指令到設備端?
您可調用物聯網平臺API下發消息,支持API如下:
API | 說明 |
通過自定義Topic向指定設備發布消息。 | |
通過自定義Topic,向指定產品下的多個設備,批量發送消息。 | |
向指定產品下在線設備發布廣播消息。 在線設備可指定為所有在線設備或訂閱了指定Topic的在線設備。 | |
向指定設備發送請求消息,并同步返回響應。 | |
設置指定設備的物模型屬性值。 | |
設置指定產品下多個設備的物模型屬性值。 | |
在單個設備上調用指定的物模型服務。 | |
在指定產品下多個設備上調用指定的物模型服務。 |
兩個設備之間能通信嗎?
同一實例下的兩個設備之間可以通信。
通過云產品流轉或Topic消息路由可以將一個設備的Topic消息內容,轉發到另一個設備的Topic,實現不同設備間的通信。
以物模型數據上報Topic為例,將設備Topic數據轉發到其他Topic,請參見數據轉發到其他Topic。
基于云產品流轉功能,構建智能燈和手機App的連接。請參見基于消息轉發的M2M設備間通信。
基于Topic消息路由服務,構建智能燈和手機App的連接。請參見基于Topic消息路由的M2M設備間通信。
為什么發送QoS 2消息失???
物聯網平臺僅支持QoS 0、QoS 1,不支持QoS 2。
詳細內容,請參見MQTT協議規范。
如何在物聯網平臺上實現設備連接和狀態同步?
可通過服務端訂閱功能訂閱設備狀態變更消息,實現設備連接和狀態信息的同步。
詳細內容,請參見服務端訂閱。
物聯網平臺如何實現設備上報數據的可視化?
通過服務端訂閱或云產品流轉功能,將設備數據轉發到目的服務器或數據庫后,可自行實現數據可視化。
通過物聯網平臺云端SDK調用相關API獲取設備上報數據,用戶獲取數據后,可自行實現數據可視化。
獲取設備數據的API如下:
API
說明
查詢指定設備的所有屬性快照。
查詢指定設備本身上報的原始屬性(通過和未通過物模型校驗的所有屬性)快照。
查詢指定設備本身上報的原始屬性(通過和未通過物模型校驗的所有屬性)記錄。
查詢指定設備本身上報的原始事件(通過和未通過物模型校驗的所有事件)記錄。
查詢指定設備本身調用的原始服務(通過和未通過物模型校驗的所有服務)記錄。
查詢指定設備的期望屬性值。
查詢指定設備在指定時間段內,單個屬性的數據。
查詢指定設備在指定時間段內,多個屬性的數據。
查詢指定設備的事件記錄。
查詢指定設備的服務調用記錄。
通過消息ID查詢設備上下行消息的詳情,包括消息的內容、消息的產生時間、發送消息的Topic等
查詢數據服務中存儲的時序數據。
查詢數據服務中時序數據存儲的快照數據。
使用物聯網平臺的數據服務,將平臺系統表、產品屬性時序表、產品屬性快照表、產品事件表和自定義存儲表等數據,通過大數據開發治理平臺DataWorks集成到云原生大數據計算服務MaxCompute中構建數據倉庫,進而實現數據可視化。詳細內容,請參見離線數據集成(DataWorks+MaxCompute)。
通過物聯網應用開發服務,開發Web可視化頁面或移動可視化頁面,通過組件配置展示設備數據。詳細內容,請參見IoT Studio。
如何在物聯網平臺上發布16進制的消息,是否有相應的API接口可用?
從物聯網平臺控制臺的在線調試、設備模擬器和設備詳情頁面的Topic列表頁簽,下發消息給設備時,不支持十六進制格式數據。
您可調用Pub、BatchPub、PubBroadcast接口發送十六進制的消息內容,接口的請求參數MessageContent是原始消息內容經過Base64編碼后的內容。調用接口時,可以傳入String類型或十六進制的Byte數組類型數據通過Base64編碼后下發給設備。
業務服務器調用接口發送消息后,物聯網平臺會自動對消息內容進行Base64解碼,再轉發給設備。
設備上報數據能導出嗎?
物聯網平臺支持的QoS 0和QoS 1消息的最大存儲時間分別為1天和7天。
您可以使用數據服務的數據存儲功能,存儲設備離線數據和時序數據。離線數據包括平臺系統表、時序表、快照表和自定義存儲表。設備時序數據包括設備上報的物模型(屬性、服務和事件)數據和通過時序數據存儲規則配置的自定義Topic數據。詳細內容,請參見配置數據存儲。
如果需要獲取設備數據,可以使用API查詢,把數據推送到您自己的服務器,您自行做存儲。
自定義Topic數據
查詢時序數據:QueryDevicesHotStorageData。
查詢快照數據:QueryDevicesHotStorageDataStatus。
物模型數據
設備或IoT孿生節點的所有屬性快照:QueryDevicePropertyStatus。
設備上報的原始屬性(通過和未通過物模型校驗的所有屬性)快照:QueryDeviceOriginalPropertyStatus。
設備上報的原始屬性(通過和未通過物模型校驗的所有屬性)記錄:QueryDeviceOriginalPropertyData。
設備上報的原始事件(通過和未通過物模型校驗的所有事件)記錄:QueryDeviceOriginalEventData。
設備調用的原始服務(通過和未通過物模型校驗的所有服務)記錄:QueryDeviceOriginalServiceData。
數據服務中存儲表數據
查詢自定義時序存儲表的快照數據:QueryCustomTimelineTableStatus。
查詢平臺系統表和時序、快照表數據:CreateDownloadDataJob和GetDownloadFile。
數據服務中數據API
執行數據服務API對應的查詢任務,獲取數據源里的指定數據:ListAnalyticsData。
如果需要長時間存儲設備數據、降低存儲成本、進一步處理設備數據(例如SQL分析、數據報表、數據API),可以備份設備數據源。開啟產品數據備份后,會自動在離線存儲中創建相應產品的時序/快照表,包括產品屬性時序表、產品屬性快照表和產品事件表。
設備上報的十六進制的數據可以通過AMQP服務端訂閱嗎?
可以。
您可以通過以下方案進行十六進制數據轉發:
設備可通過自定義Topic上傳十六進制格式的數據。使用自定義Topic通信的消息說明,請參見使用自定義Topic通信。
配置消息轉發訂閱設備上報的自定義Topic消息。
配置AMQP服務端訂閱:在物聯網平臺配置推送消息類型為設備上報消息。
配置數據轉發到AMQP服務端訂閱消費組:在消息解析器中使用函數
payload('binary')
將設備上報數據轉換成二進制變量進行透傳。云產品流轉中的解析器支持的函數說明,請參見函數列表。
使用AMQP客戶端SDK消費設備上報的自定義消息。
阿里云物聯網平臺提供以下語言的AMQP SDK示例代碼供您使用。
其中Python3和PHP語言的AMQP客戶端SDK是使用STOMP協議和物聯網平臺云端通信,需要在使用AMQP客戶端SDK時,將消息內容Base64編碼后再推送,否則消息內容可能會被截斷。
SDK使用的詳細說明,請參見AMQP客戶端接入。
一個消費組對應一個AMQP消息隊列嗎?
是的。
一個AMQP消息隊列中,可以啟動最多128個AMQP客戶端消費消息。
一個設備可以只對應一個AMQP消息隊列嗎?
可以。
您可以使用云產品流轉功能配置數據轉發到AMQP服務端訂閱的消費組,在消息轉發的解析器中,通過函數topic(number)
或deviceName()
指定設備名稱,通過if
控制語句將指定設備的消息轉發到AMQP消息隊列。
解析器示例代碼如下:
// 通過payload函數,獲取設備上報的消息內容,并按照JSON格式轉換。
var data = payload("json");
// 獲取上報消息的設備名稱。
var dn = deviceName();
// 流轉指定設備的物模型上報數據。
if (dn == 'device01') {
writeAmqp(1000, data, "調試");
}
解析器腳本說明,請參見腳本語法。配置消息轉發解析器的詳細內容,請參見數據轉發到AMQP服務端訂閱消費組消費。
設備上線后,如何通知App或小程序?
物聯網平臺的服務端訂閱功能,可同步設備狀態變更消息。您可在App或小程序所在服務器中部署并啟動AMQP客戶端應用,接收設備狀態變更消息。
實現方案如下:
配置AMQP服務端訂閱:在物聯網平臺控制臺,配置服務端訂閱消費組,推送設備狀態變更消息。
AMQP客戶端接入:在您的App或小程序所在服務器中部署并啟動AMQP客戶端接入物聯網平臺。
設備狀態變更消息的數據格式說明,請參見設備上下線狀態。AMQP客戶端接收消息后如何在App或小程序中顯示,需您自行實現。
設備接入:設備接入物聯網平臺后,設備狀態信息會轉發到AMQP客戶端消費。
通過接口Pub下發消息成功后,設備沒有收到消息為什么?
對于調用接口Pub下發消息的Topic,設備端沒有訂閱。
您可調用SubscribeTopic接口使設備先訂閱對應通信Topic,才能接收到通過該Topic下發的消息。
設備訂閱Topic列表為空,如何創建和查看訂閱的Topic?
設備端需要主動訂閱Topic,且訂閱成功后,物聯網平臺控制臺對應實例下的設備的Topic列表才會展示已訂閱的Topic。
設備端未完成訂閱Topic的功能開發,且未接入物聯網平臺前,設備詳情頁面的Topic列表頁簽不顯示已訂閱的設備Topic。
訂閱Topic
設備端可通過以下方式訂閱Topic:
使用物聯網平臺提供的C語言Link SDK 3.1、3.2、4.x版本、Python語言Link SDK,設備會自動訂閱具有訂閱權限的基礎通信Topic和物模型Topic。
您可創建具有訂閱權限的自定義Topic后,通過SDK中提供的接口訂閱自定義Topic:
C Link SDK 3.1、3.2版本中接口:IOT_MQTT_Subscribe。
C Link SDK 4.x版本中接口:aiot_mqtt_sub。
Python Link SDK中接口:lk.subscribe_topic(topic,qos=1) 。
如果創建自定義Topic時,開啟了代理訂閱,設備與物聯網平臺建連時,物聯網平臺查詢已開啟代理訂閱的Topic,幫助設備完成訂閱。
添加自定義Topic操作,請參見使用自定義Topic通信。
啟動設備模擬器:使用物聯網平臺提供的設備模擬器功能,設備會自動訂閱基礎通信Topic和物模型Topic。
您可以創建具有訂閱權限的自定義Topic后,使用自定義Topic的上行指令調試功能,訂閱自定義Topic。
使用MQTT.fx接入物聯網平臺:設備在線后使用Subscribe功能訂閱設備Topic。
SubscribeTopic:設備接入物聯網平臺在線后,調用該接口訂閱設備Topic。
您可以創建具有訂閱權限自定義Topic后,再調用接口SubscribeTopic訂閱Topic。
查看已訂閱的Topic
選擇以下方式:
調用接口QueryDeviceSubTopic查詢設備已訂閱的Topic列表。
AMQP服務端訂閱設備上報消息后,為什么收不到RRPC通信Topic的消息?
RRPC通信是服務端下發RRPC消息數據并同步等待設備響應數據。物聯網平臺不支持AMQP服務端訂閱RRPC通信消息。
RRPC通信的詳細內容,請參見MQTT同步通信(RRPC)。
自定義Topic通信數據的標準JSON格式是什么?
對于自定義Topic的通信,物聯網平臺對數據格式沒有要求,需您自定義。
設備端與物聯網平臺交互通信需要符合的ICA標準數據格式(Alink JSON)的通信Topic和數據格式說明,請參見Alink協議說明。
如果設備所屬產品創建時選擇數據格式為透傳/自定義,需要配置消息解析將設備通過自定義Topic上報給物聯網平臺云端的自定義格式數據Payload解析為JSON格式。詳細內容,請參見自定義Topic消息解析。
物模型通信報錯“5092 - property not found”
上下行信息中的屬性不在物模型中。
可能原因:
屬性是在自定義物模型模塊中定義的:上下行通信的屬性要拼接自定義模塊標識符,格式為
{tsl.functionBlockId}:{tsl.properties.identifier}
。
物模型字段的詳細說明,請參見物模型TSL字段說明。消息通信相關錯誤碼更多信息,請參見云端運行日志的錯誤碼。
屬性設置的設備響應,報錯6335
物模型的屬性設置方法,定義的響應數據為空,所以物聯網平臺云端向設備下發屬性設置指令后,設備響應消息中的data字段應該返回空。如果data非空,設備響應就會報錯。
更多錯誤碼說明,請參見云端運行日志的錯誤碼。
真實的設備接入需要與產品中的設備保持同一個Topic嗎?
是的。真實設備的通信Topic必須與產品下對應設備的通信Topic保持一致。
設備可以訂閱其他設備的通信Topic嗎?
不可以。設備僅支持訂閱設備自身的通信Topic,無法訂閱其他設備的Topic。
阿里云怎么配置能讓服務器監聽所有設備的信息?
可以使用AMQP服務端訂閱功能實現服務器訂閱設備消息。詳細內容,請參見使用AMQP服務端訂閱。
硬件設備和MQTT客戶端使用同一設備證書接入物聯網平臺,訂閱同一Topic失敗
一個設備證書同一時間僅支持一個設備使用,硬件設備和MQTT客戶端需要使用不同的設備證書接入物聯網平臺。
兩個設備之間的通信,不能通過訂閱同一Topic實現,因為設備只能訂閱設備本身的通信Topic,不能訂閱其他設備的Topic,也不能向其他設備的Topic發布消息。
通過云產品流轉或Topic消息路由可以將一個設備的Topic消息內容,轉發到另一個設備的Topic,實現不同設備間的通信。
例如:
以物模型數據上報Topic為例,將設備Topic數據轉發到其他Topic,請參見數據轉發到其他Topic。
基于云產品流轉功能,構建智能燈和手機App的連接。請參見基于消息轉發的M2M設備間通信。
基于Topic消息路由服務,構建智能燈和手機App的連接。請參見基于Topic消息路由的M2M設備間通信。
如何設置和修改通信Topic的操作權限?
物聯網平臺提供的基礎通信Topic和物模型通信Topic的操作權限已定義,不支持修改。查看操作權限方法:
登錄物聯網平臺控制臺。
在控制臺左上方,選擇物聯網平臺所在地域。
在實例概覽頁簽的全部環境下,找到對應的實例,單擊實例卡片。
在左側導航欄,選擇
。在產品頁面,找到目標產品,單擊對應操作列的查看。
在產品詳情頁面,單擊Topic類列表,分別查看基礎通信Topic、物模型通信Topic頁簽中Topic列表。
Topic列表中對應Topic的操作權限列,顯示該Topic的發布、訂閱權限。
調用接口QueryProductTopic,查詢指定產品下自定義Topic類列表的詳細信息。
云端運行日志能直接導出嗎?
不能。
您可在自己的業務服務器中調用接口QueryMessageInfo,通過消息ID查詢設備上下行消息的詳情,包括消息的內容、消息的產生時間、發送消息的Topic等。把數據推送到您自己的服務器后,您可自行做存儲。
您可以開通日志服務,然后在物聯網平臺控制臺開通云端運行日志轉儲,將云端運行日志導出到您阿里云日志服務的日志庫(Logstore)中長期存儲。具體操作,請參見云端運行日志轉儲。
開通云端運行日志轉儲后,日志服務系統自動創建的日志存儲位置如下,您可在日志服務中查看轉儲的云端運行日志。
Project:
iot-log-${uid}-${regionId}
。其中,${uid}
是您的阿里云賬號ID,${regionId}
是您的物聯網平臺服務所在地域代碼。Logstore:iot-logs。
物聯網平臺如何保證設備的一條消息發送到多個服務端,避免設備發送的消息被重復發送?
AMQP服務端訂閱時,一個消費組對應一個AMQP消息隊列(消費端)。如果啟動的多個消費端綁定同一個消費組,設備消息會隨機發送到其中一個。如果需要每個消費端都收到設備消息,需要分別綁定不同的消費組。
詳細內容,請參見:
配置AMQP服務端訂閱消費組:配置AMQP服務端訂閱或數據轉發到AMQP服務端訂閱消費組消費。
服務器中啟動AMQP消費端:AMQP客戶端接入說明。
物聯網平臺如何將同一個消息發送到多個設備上?
物聯網平臺提供接口PubBroadcast,可向指定產品下的多個在線設備發布廣播消息。在線設備可指定為所有在線設備或訂閱了指定Topic的在線設備。
物聯網平臺服務端訂閱報錯“9203”
消息流轉到服務端訂閱時,服務端訂閱的AMQP客戶端或輕量消息隊列(原 MNS) SMQ(Simple Message Queue (formerly MNS))客戶端不在線。AMQP客戶端在線方法,請參見AMQP客戶端接入說明。MNS客戶端在線方法,請參見開發MNS消費客戶端。
物聯網平臺設備只要訂閱一次還是每次上電都要訂閱?
只需要訂閱一次。建議是每次上電都訂閱一次,用來觸發代碼的回調。設備訂閱通信Topic的詳細說明,請參見服務器向設備下發數據。
物聯網平臺支持服務端先發送設備后訂閱嗎?
不支持的,設備只有訂閱了通信Topic,才能收到該Topic的消息。詳細內容,請參見使用消息通信Topic。
如何使用客戶端連接物聯網平臺并訂閱設備屬性實時變化?
配置AMQP服務端訂閱:在物聯網平臺配置推送消息類型為設備上報消息。
使用AMQP客戶端SDK接入物聯網平臺可以接收已訂閱的設備上報數據,包含設備屬性數據。
阿里云物聯網平臺提供以下語言的AMQP SDK示例代碼供您使用。
其中Python3和PHP語言的AMQP客戶端SDK是使用STOMP協議和物聯網平臺云端通信,需要在使用AMQP客戶端SDK時,將消息內容Base64編碼后再推送,否則消息內容可能會被截斷。
SDK使用的詳細說明,請參見AMQP客戶端接入說明。