全部產品
Search
文件中心

IoT Platform:AMQP用戶端接入說明

更新時間:Jun 30, 2024

在控制台配置完AMQP服務端訂閱後,您需要參考本文將AMQP用戶端接入物聯網平台。成功接入後,在您的服務端運行AMQP用戶端,即可接收裝置訊息。

使用限制

AMQP協議標準的詳細介紹,請參見AMQP協議標準

阿里雲物聯網平台服務端訂閱僅支援AMQP 1.0版的協議標準。

串連認證過程

  1. AMQP用戶端與物聯網平台經過三向交握建立TCP串連,然後進行TLS握手校正。

    說明

    為了保障安全,接收方必須使用TLS加密,不支援非加密的TCP傳輸。

  2. 用戶端請求建立Connection。

    串連認證方式為PLAIN-SASL,可以理解為使用者名稱(userName)和密碼(password)認證。物聯網平台的雲端認證userName和password通過後,建立Connection。

    此外,根據AMQP協議,用戶端建連時,還需在Open幀中攜帶心跳時間,即AMQP協議的idle-time-out參數。心跳時間單位為毫秒,取值範圍為30,000~300,000。如果超過心跳時間,Connection上沒有任何幀通訊,物聯網平台將關閉串連。SDK不同,idle-time-out參數設定方法不同。具體設定方法,請參見各語言SDK範例文件。

  3. 用戶端向物聯網平台的雲端發起請求,建立Receiver Link(即雲端向用戶端推送資料的單向通道)。

    用戶端建立Connection成功後,需在15秒內完成Receiver Link的建立,否則物聯網平台會關閉串連。

    建立Receiver Link後,用戶端成功接入物聯網平台。

    說明
    • 一個Connection上只能建立一個Receiver Link,不支援建立Sender Link,即只能由物聯網平台的雲端向用戶端推送訊息,用戶端不能向雲端發送訊息。

    • Receiver Link在不同SDK中名稱不同,例如在有的SDK上稱為MessageConsumer,請根據具體SDK設定。

串連配置說明

AMQP用戶端接入物聯網平台的串連地址和串連認證參數說明如下:

接入網域名稱和連接埠

公用執行個體和企業版執行個體中,AMQP的接入網域名稱,請參見查看和配置執行個體終端節點資訊(Endpoint)

說明

SDK中的${YourHost}即為接入網域名稱。

接入前,請確保已在對應執行個體下建立產品和裝置。

  • 對於Java、.NET、Python 2.7、Node.js、Go用戶端:連接埠號碼為5671。

  • 對於Python3、PHP用戶端:連接埠號碼為61614。

用戶端身份認證參數

不同身份帳號開發AMQP用戶端接入物聯網平台,配置的認證參數有區別。

  • 如果是當前物聯網平台所屬阿里雲主帳號或其下直接授權的RAM使用者,認證參數如下:

    說明

    對於直接授權的RAM使用者,需要給該RAM使用者授予操作AMQP服務端訂閱功能的許可權(iot:sub),否則將會串連失敗。授權方法,請參見物聯網平台RAM授權說明

    為提升物聯網平台資料安全,推薦通過RAM角色授予RAM使用者指定的操作許可權。具體說明,請參見下文。

    userName = clientId|iotInstanceId=${iotInstanceId},authMode=aksign,signMethod=hmacsha1,consumerGroupId=${consumerGroupId},authId=${accessKey},timestamp=1573489088171|
    password = signMethod(stringToSign, accessSecret)
  • 如果是通過RAM角色授權的RAM使用者,認證參數如下:

    說明

    通過RAM角色授權的RAM使用者除了當前物聯網平台所屬阿里雲主帳號下的RAM使用者,還支援跨帳號(其他阿里雲主帳號)下的RAM使用者。關於如何通過RAM角色授權RAM使用者操作物聯網平台服務端訂閱功能,請參見本帳號RAM使用者授權服務端訂閱跨帳號RAM使用者授權服務端訂閱

    userName = clientId|iotInstanceId=${iotInstanceId},authMode=ststoken,securityToken=${SecurityToken},signMethod=hmacsha1,consumerGroupId=${consumerGroupId},authId=${accessKey},timestamp=1573489088171|
    password = signMethod(stringToSign, accessSecret)

    表 1. userName參數說明

    參數

    是否必需

    說明

    clientId

    表示用戶端ID,需您自訂,長度不可超過64個字元。建議使用您的AMQP用戶端所在伺服器UUID、MAC地址、IP等唯一標識。

    AMQP用戶端接入並啟動成功後,登入物聯網平台控制台,在對應執行個體的訊息轉寄 > 服務端訂閱 > 消費組列表頁簽,單擊消費組對應的查看消費組詳情頁面將顯示該參數,方便您識別區分不同的用戶端。

    iotInstanceId

    當前物聯網平台執行個體的ID。您可在物聯網平台控制台的執行個體概覽頁簽,查看當前執行個體的ID

    • 若有ID值,必須傳入該ID值。

    • 若無執行個體概覽頁簽或ID值,則無需傳入。

    authMode

    鑒權模式。

    • 當前物聯網平台所屬阿里雲主帳號或其下直接授權的RAM使用者:使用aksign模式。

    • 通過RAM角色授權的RAM使用者:使用ststoken模式。

    securityToken

    重要

    僅通過RAM角色授權的RAM使用者開發AMQP用戶端時,需配置此參數。

    RAM使用者扮演RAM角色的臨時身份憑證((STS Token)),可以通過調用AssumeRole介面擷取,具體內容,請參見AssumeRole

    signMethod

    簽名演算法。可選:hmacmd5hmacsha1hmacsha256

    consumerGroupId

    當前物聯網平台對應執行個體中的消費組ID。

    登入物聯網平台控制台,在對應執行個體的訊息轉寄 > 服務端訂閱 > 消費組列表查看您的消費組ID。

    authId

    認證資訊。

    • 對於當前物聯網平台所屬阿里雲主帳號或其下直接授權的RAM使用者

      分別對應取值為阿里雲主帳號的AccessKey ID,或RAM使用者的AccessKey ID。

      登入物聯網平台控制台,將滑鼠移至帳號頭像上,然後單擊AccessKey管理,擷取AccessKey。

    • 對於通過RAM角色授權的RAM使用者

      取值為扮演RAM角色的RAM使用者的AccessKey ID。

    timestamp

    目前時間。Long類型的毫秒值時間戳記。

    表 2. password參數說明

    參數

    是否必需

    說明

    signMethod

    簽名演算法。請使用userName中指定的簽名演算法計算簽名值,並轉為base64字串。

    stringToSign

    待簽名的字串。

    將需要簽名的參數的索引值對按照首字母字典排序,並在索引值間添加等號(=);參數間添加與號(&),拼接成待簽名的字串。

    • 對於當前物聯網平台所屬阿里雲主帳號或其下直接授權的RAM使用者

      需要簽名的參數為:authIdtimestamp

      待簽名的字串為:stringToSign = authId=${accessKey}&timestamp=1573489088171

    • 對於通過RAM角色授權的RAM使用者

      需要簽名的參數為:securityTokenauthIdtimestamp

      待簽名的字串為:stringToSign = authId=${accessKey}&securityToken=${SecurityToken}&timestamp=1573489088171

    accessSecret

    • 對於當前物聯網平台所屬阿里雲主帳號或其下直接授權的RAM使用者

      分別對應取值為阿里雲主帳號的AccessKey Secret,或RAM使用者的AccessKey Secret。

      登入物聯網平台控制台,將滑鼠移至帳號頭像上,然後單擊AccessKey管理,擷取AccessKey。

    • 對於通過RAM角色授權的RAM使用者

      取值為扮演RAM角色的RAM使用者的AccessKey Secret。

接收物聯網平台推送的訊息

用戶端和物聯網平台雲端之間的Receiver Link建連成功後,雲端就可以在這條Link上向AMQP用戶端推送訊息。

說明

用戶端僅支援接收物聯網平台已經訂閱的訊息,要向裝置發送訊息或指令,可根據需要,調用對應的API。更多資訊,請參見API列表

物聯網平台推送的訊息:

  • 訊息體:訊息的payload為二進位格式。

  • 訊息的業務屬性,如訊息Topic和Message ID等,需要從AMQP協議的Application Properties中擷取。格式為key:value

    Key

    含義

    topic

    訊息Topic。

    messageId

    訊息ID。

    generateTime

    訊息產生時間。

    說明

    訊息產生時間generateTime不能作為判斷訊息順序的依據。

訊息回執:

按照AMQP協議的定義,用戶端需要給物聯網平台的雲端回執(AMQP協議上一般稱為settle),通知雲端訊息已經被成功接收。AMQP用戶端通常會提供自動回執模式(推薦)和手動回執模式。具體請參考相應的用戶端的使用說明。

訊息策略:

  • 即時訊息直接推送。

  • 進入堆積列隊的訊息

    由於消費用戶端離線、訊息消費慢等原因,訊息不能即時消費,而進入堆積隊列。

    • 消費用戶端重新上線並恢複穩定消費能力後,物聯網平台重試推送堆積訊息。

    • 如果用戶端對重試推送的訊息消費失敗,可能導致堆積隊列阻塞。按大約一分鐘間隔,物聯網平台向用戶端再次重試推送。

說明
  • 消費端存在短暫的流量不均衡,屬於正常現象。一般能在10分鐘內恢複。如果您的訊息QPS較高或訊息處理較耗費資源,建議增加消費端的數量,保持消費能力冗餘。

  • 資料流轉時,為確保訊息送達,同一條訊息可能重複發送,直到用戶端返回ACK或訊息到期。同一條訊息的訊息ID相同,您可根據訊息ID去重。

  • 關於訊息限制的更多資訊,請參見服務端訂閱使用限制

  • 您可以在物聯網平台控制台清除堆積訊息。具體操作,請參見查看和監控消費組

訊息時序:

說明

訊息不保序,即接收到訊息的時間順序不一定是訊息實際產生的時間順序。

  • 裝置上下線訊息:

    收到訊息的順序不是實際裝置上下線時間排序。裝置上下線順序需按照time具體值排序。

    例如,您依次收到3條訊息:

    1. 上線:2018-08-31 10:02:28.195

    2. 下線:2018-08-31 10:01:28.195

    3. 下線:2018-08-31 10:03:28.195

    這3條訊息展示了,裝置先下線,再上線,最後下線的過程。

    關於訊息中參數的更多資訊,請參見資料格式

  • 其他類型的訊息:

    您需要在業務層,給訊息增加序號。根據接收到訊息中的序號,等冪判斷訊息是否需要處理。

接入樣本

阿里雲提供以下語言的AMQP用戶端接入樣本。樣本中的參數配置,請參見串連配置說明

重要

接入過程中,您可能會遇到訊息相關的錯誤碼。更多資訊,請參見訊息相關錯誤碼