全部產品
Search
文件中心

IoT Platform:通訊訊息相關問題

更新時間:Oct 25, 2024

本文介紹裝置與物聯網平台和物聯網平台與伺服器端的通訊相關問題和解決方案。

類目

問題

上下行訊息

通訊Topic訂閱

訊息轉寄

訊息儲存

查詢訊息

裝置重複收到訊息,如何去重?

由於QoS 1訊息的機制是保證最少收到一次訊息,所以可能會出現重複收到訊息的情況,但重複訊息的訊息ID是相同的。裝置端可以根據訊息ID去重;物聯網平台也會減少重複發送QoS 1訊息。

裝置使用MQTT協議接入物聯網平台後,接收不到通訊資料,怎麼辦?

裝置接收不到資料時,您可以根據實際情境,從以下幾個方面進行排查解決:

  • 如果一直接收不到訊息:檢查裝置是否訂閱對應的通訊Topic,MQTT裝置接收訊息需要先訂閱對應的通訊Topic。

  • 如果偶爾接收不到訊息:查看裝置端通訊程式的回調中是否存在耗時邏輯。如果存在,建議相關耗時業務另起線程處理,不要在回調中直接處理。

  • 如果裝置端是Android、Java等SDK:裝置程式中需先執行通訊Topic的訂閱操作,再執行初始化操作,以免訊息下推時,SDK尚未完成訂閱,導致錯過訊息接收。

  • 如果是QoS 1的訊息沒有接收到:檢查MQTT串連參數cleanSession是否為falsecleanSession需要設定為false才可以接收離線期間的QoS 1訊息。

物聯網平台是否會儲存訊息?

訊息通過Topic發送後,物聯網平台就會立即將訊息轉寄給訂閱了該Topic的裝置。

  • QoS 0訊息:物聯網平台不儲存。

  • QoS 1訊息:物聯網平台會儲存7天。

物聯網平台的裝置資料,在不轉儲的情況下,資料保留多長時間?

  • QoS 0訊息:物聯網平台不儲存。

  • QoS 1訊息:物聯網平台會儲存7天。

您可在物聯網平台控制台對應執行個體下的監控營運 > Log Service頁面,查看最近7天的通訊日誌。詳細內容,請參見Log Service

物聯網平台發送訊息比較慢,存在逾時情況,為什嗎?

可能是網路不穩定導致。

您可以執行以下操作,測試裝置串連通訊的網路可用性:

  1. 登入物聯網平台控制台

  2. 執行個體概覽頁面,找到對應的執行個體,單擊執行個體ID或備忘名稱。

  3. 在左側導覽列,選擇裝置管理 > 裝置

  4. 裝置頁面的裝置列表上方,輸入目標裝置的DeviceName備忘名稱,搜尋裝置。

  5. 單擊裝置對應操作列的查看,查看裝置資訊。

  6. 裝置資訊頁簽下,單擊即時延遲右側的測試

  7. 單擊確認,測試網路延遲。

您可重複步驟6~步驟7,多測試幾次。如果通訊鏈路有高延遲,則說明是網路不穩定。

物聯網平台支援遺囑訊息和保留訊息嗎?

支援。物聯網平台支援使用MQTT 5.0通訊協定設定遺囑訊息和保留訊息。使用說明,請參見物聯網平台支援的MQTT 5.0特性

伺服器端如何擷取裝置訊息?

伺服器端可通過以下兩種方式擷取裝置訊息。

  • 服務端訂閱:使用物聯網平台的服務端訂閱功能,訂閱一個或多個訊息類型。物聯網平台根據您設定的訂閱,將產品下所有裝置的該類型訊息流程轉至您的伺服器。支援以下兩種方式的服務端訂閱:

    • AMQP服務端訂閱:使用AMQP SDK接收物聯網平台轉寄的裝置訊息。

    • MNS服務端訂閱:使用MNS SDK接收物聯網平台轉寄到Simple Message Queue (formerly MNS) (SMQ)隊列的裝置訊息。

  • 雲產品流轉:使用訊息轉寄的雲產品流轉功能,通過資料流轉規則將指定裝置資料流轉到Simple Message Queue (formerly MNS) (SMQ)的主題或訊息佇列(RocketMQ)的隊列中。伺服器通過MNS或RocketMQ SDK接收訊息。詳細內容,請參見雲產品流轉概述

已配置MNS服務端訂閱,但在控制台上發送訊息,SMQ的隊列中並沒有收到該訊息,為什嗎?

在物聯網平台控制台發送的訊息和調用雲端API發送的訊息均屬於服務端發送的訊息,不會轉寄到Simple Message Queue (formerly MNS) (SMQ)隊列,只有裝置發出的訊息(裝置上報訊息、裝置狀態變化通知、裝置標籤變更等)才會轉寄到SMQ隊列裡。

如何判斷MNS服務端收到的訊息是來自哪個Topic?

發送到Simple Message Queue (formerly MNS) (SMQ)隊列中的訊息格式:

{
	"messageid": "12345",
	"messagetype": "status/upload",
	"topic": "null/topic",
	"payload": {},
	"timestamp": 1469564576
}

您可根據topic欄位進行判斷。

如何從物聯網平台雲端下髮指令到裝置端?

您可調用物聯網平台API下發訊息,支援API如下:

API

說明

Pub

通過自訂Topic向指定裝置發布訊息。

BatchPub

通過自訂Topic,向指定產品下的多個裝置,批量發送訊息。

PubBroadcast

向指定產品下線上裝置發布廣播訊息。

線上裝置可指定為所有線上裝置或訂閱了指定Topic的線上裝置。

RRpc

向指定裝置發送請求訊息,並同步返迴響應。

SetDeviceProperty

設定指定裝置的物模型屬性值。

SetDevicesProperty

設定指定產品下多個裝置的物模型屬性值。

InvokeThingService

在單個裝置上調用指定的物模型服務。

InvokeThingsService

在指定產品下多個裝置上調用指定的物模型服務。

兩個裝置之間能通訊嗎?

同一執行個體下的兩個裝置之間可以通訊。

通過雲產品流轉Topic訊息路由可以將一個裝置的Topic訊息內容,轉寄到另一個裝置的Topic,實現不同裝置間的通訊。

為什麼發送QoS 2訊息失敗?

物聯網平台僅支援QoS 0、QoS 1,不支援QoS 2。

詳細內容,請參見MQTT協議規範

如何在物聯網平台上實現裝置串連和狀態同步?

可通過服務端訂閱功能訂閱裝置狀態變更訊息,實現裝置串連和狀態資訊的同步。

詳細內容,請參見服務端訂閱

物聯網平台如何?裝置上報資料的可視化?

如何在物聯網平台上發布16進位的訊息,是否有相應的API介面可用?

物聯網平台控制台線上調試裝置模擬器和裝置詳情頁面的Topic列表頁簽,下發訊息給裝置時,不支援十六進位格式資料。

您可調用PubBatchPubPubBroadcast介面發送十六進位的訊息內容,介面的請求參數MessageContent是原始訊息內容經過Base64編碼後的內容。調用介面時,可以傳入String類型或十六進位的Byte數群組類型資料通過Base64編碼後下發給裝置。

商務服務器調用介面發送訊息後,物聯網平台會自動對訊息內容進行Base64解碼,再轉寄給裝置。

裝置上報資料能匯出嗎?

物聯網平台支援的QoS 0和QoS 1訊息的最大儲存時間分別為1天和7天。

您可以使用資料服務的資料存放區功能,存放裝置離線資料和時序資料。離線資料包括平台系統資料表、時序表、快照表和自訂儲存表。裝置時序資料包括裝置上報的物模型(屬性、服務和事件)資料和通過時序資料存放區規則配置的自訂Topic資料。詳細內容,請參見配置資料存放區

裝置上報的十六進位的資料可以通過AMQP服務端訂閱嗎?

可以。

您可以通過以下方案進行十六進位資料轉寄:

  1. 裝置可通過自訂Topic上傳十六進位格式的資料。使用自訂Topic通訊的訊息說明,請參見使用自訂Topic通訊

  2. 配置訊息轉寄訂閱裝置上報的自訂Topic訊息。

  3. 使用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用戶端應用,接收裝置狀態變更訊息。

實現方案如下:

  1. 配置AMQP服務端訂閱:在物聯網平台控制台,佈建服務端訂閱消費組,推送裝置狀態變更訊息

  2. AMQP用戶端接入:在您的App或小程式所在伺服器中部署並啟動AMQP用戶端接入物聯網平台。

    裝置狀態變更訊息的資料格式說明,請參見裝置上下線狀態。AMQP用戶端接收訊息後如何在App或小程式中顯示,需您自行實現。

  3. 裝置接入:裝置接入物聯網平台後,裝置狀態資訊會轉寄到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:

    如果建立自訂Topic時,開啟了代理訂閱,裝置與物聯網平台建連時,物聯網平台查詢已開啟代理訂閱的Topic,協助裝置完成訂閱。

    添加自訂Topic操作,請參見使用自訂Topic通訊

  • 啟動裝置模擬器:使用物聯網平台提供的裝置模擬器功能,裝置會自動訂閱基礎通訊Topic和物模型Topic。

    您可以建立具有訂閱許可權的自訂Topic後,使用自訂Topic的上行指令調試功能,訂閱自訂Topic。

  • 使用MQTT.fx接入物聯網平台:裝置線上後使用Subscribe功能訂閱裝置Topic。

  • SubscribeTopic:裝置接入物聯網平台線上後,調用該介面訂閱裝置Topic。

    您可以建立具有訂閱許可權自訂Topic後,再調用介面SubscribeTopic訂閱Topic。

查看已訂閱的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失敗

  1. 一個裝置認證同一時間僅支援一個裝置使用,硬體裝置和MQTT用戶端需要使用不同的裝置認證接入物聯網平台。

  2. 兩個裝置之間的通訊,不能通過訂閱同一Topic實現,因為裝置只能訂閱裝置本身的通訊Topic,不能訂閱其他裝置的Topic,也不能向其他裝置的Topic發布訊息。

  3. 通過雲產品流轉Topic訊息路由可以將一個裝置的Topic訊息內容,轉寄到另一個裝置的Topic,實現不同裝置間的通訊。

    例如:

如何設定和修改通訊Topic的操作許可權?

  • 物聯網平台提供的基礎通訊Topic和物模型通訊Topic的操作許可權已定義,不支援修改。查看操作許可權方法:

    1. 登入物聯網平台控制台

    2. 在控制台左上方,選擇物聯網平台所在地區。

    3. 執行個體概覽頁簽的全部環境下,找到對應的執行個體,單擊執行個體卡片。

    4. 在左側導覽列,選擇裝置管理 > 產品

    5. 產品頁面,找到目標產品,單擊對應操作列的查看

    6. 產品詳情頁面,單擊Topic類列表,分別查看基礎通訊Topic物模型通訊Topic頁簽中Topic列表。

      Topic列表中對應Topic的操作許可權列,顯示該Topic的發布訂閱許可權。

      image

  • 調用介面QueryProductTopic,查詢指定產品下自訂Topic類列表的詳細資料。

雲端作業記錄能直接匯出嗎?

不能。

  • 您可以開通Log Service,然後在物聯網平台控制台開通雲端作業記錄轉儲,將雲端作業記錄匯出到您阿里雲Log Service的日誌庫(Logstore)中長期儲存。具體操作,請參見雲端作業記錄轉儲

    開通雲端作業記錄轉儲後,Log Service系統自動建立的日誌儲存位置如下,您可在Log Service中查看轉儲的雲端作業記錄。

    • Projectiot-log-${uid}-${regionId}。其中,${uid}是您的阿里雲帳號ID,${regionId}是您的物聯網平台服務所在地區代碼。

    • Logstoreiot-logs

物聯網平台如何保證裝置的一條訊息發送到多個服務端,避免裝置發送的訊息被重複發送?

AMQP服務端訂閱時,一個消費組對應一個AMQP訊息佇列(消費端)。如果啟動的多個消費端綁定同一個消費組,裝置訊息會隨機發送到其中一個。如果需要每個消費端都收到裝置訊息,需要分別綁定不同的消費組。

詳細內容,請參見:

物聯網平台如何將同一個訊息發送到多個裝置上?

物聯網平台提供介面PubBroadcast,可向指定產品下的多個線上裝置發布廣播訊息。線上裝置可指定為所有線上裝置或訂閱了指定Topic的線上裝置。

物聯網平台服務端訂閱報錯“9203

訊息流程轉到服務端訂閱時,服務端訂閱的AMQP用戶端或Simple Message Queue (formerly MNS) (SMQ)用戶端不線上。AMQP用戶端線上方法,請參見AMQP用戶端接入說明。MNS用戶端線上方法,請參見開發MNS消費用戶端

物聯網平台裝置只要訂閱一次還是每次上電都要訂閱?

只需要訂閱一次。建議是每次上電都訂閱一次,用來觸發代碼的回調。

物聯網平台支援服務端先發送裝置後訂閱嗎?

不支援的,裝置只有訂閱了通訊Topic,才能收到該Topic的訊息。詳細內容,請參見使用訊息通訊Topic

如何使用用戶端串連物聯網平台並訂閱裝置屬性即時變化?

  1. 配置AMQP服務端訂閱:在物聯網平台配置推送訊息類型裝置上報訊息

  2. 使用AMQP用戶端SDK接入物聯網平台可以接收已訂閱的裝置上報資料,包含裝置屬性資料。

    阿里雲物聯網平台提供以下語言的AMQP SDK範例程式碼供您使用。

    其中Python3和PHP語言的AMQP用戶端SDK是使用STOMP協議和物聯網平台雲端通訊,需要在使用AMQP用戶端SDK時,將訊息內容Base64編碼後再推送,否則訊息內容可能會被截斷。

    SDK使用的詳細說明,請參見AMQP用戶端接入說明

如何在物聯網平台中授權其他帳號訪問並查看資料?

  • 使用裝置分發功能,通過跨帳號方式,將源執行個體下的裝置分發到目標帳號的目標執行個體中,目標帳號可以查看分發裝置的相關資料。裝置分發的使用限制和詳細使用方式,請參見裝置分發