在控制台配置完AMQP服務端訂閱後,您需要參考本文將AMQP用戶端接入物聯網平台。成功接入後,在您的服務端運行AMQP用戶端,即可接收裝置訊息。
使用限制
AMQP協議標準的詳細介紹,請參見AMQP協議標準。
阿里雲物聯網平台服務端訂閱僅支援AMQP 1.0版的協議標準。
串連認證過程
AMQP用戶端與物聯網平台經過三向交握建立TCP串連,然後進行TLS握手校正。
說明為了保障安全,接收方必須使用TLS加密,不支援非加密的TCP傳輸。
用戶端請求建立Connection。
串連認證方式為PLAIN-SASL,可以理解為使用者名稱(userName)和密碼(password)認證。物聯網平台的雲端認證userName和password通過後,建立Connection。
此外,根據AMQP協議,用戶端建連時,還需在Open幀中攜帶心跳時間,即AMQP協議的idle-time-out參數。心跳時間單位為毫秒,取值範圍為30,000~300,000。如果超過心跳時間,Connection上沒有任何幀通訊,物聯網平台將關閉串連。SDK不同,idle-time-out參數設定方法不同。具體設定方法,請參見各語言SDK範例文件。
用戶端向物聯網平台的雲端發起請求,建立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
是
簽名演算法。可選:
hmacmd5
、hmacsha1
和hmacsha256
。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使用者
需要簽名的參數為:
authId
和timestamp
。待簽名的字串為:
stringToSign = authId=${accessKey}×tamp=1573489088171
。對於通過RAM角色授權的RAM使用者
需要簽名的參數為:
securityToken
、authId
和timestamp
。待簽名的字串為:
stringToSign = authId=${accessKey}&securityToken=${SecurityToken}×tamp=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用戶端通常會提供自動回執模式(推薦)和手動回執模式。具體請參考相應的用戶端的使用說明。
訊息策略:
即時訊息直接推送。
進入堆積列隊的訊息
由於消費用戶端離線、訊息消費慢等原因,訊息不能即時消費,而進入堆積隊列。
消費用戶端重新上線並恢複穩定消費能力後,物聯網平台重試推送堆積訊息。
如果用戶端對重試推送的訊息消費失敗,可能導致堆積隊列阻塞。按大約一分鐘間隔,物聯網平台向用戶端再次重試推送。
訊息時序:
訊息不保序,即接收到訊息的時間順序不一定是訊息實際產生的時間順序。
裝置上下線訊息:
收到訊息的順序不是實際裝置上下線時間排序。裝置上下線順序需按照time具體值排序。
例如,您依次收到3條訊息:
上線:
2018-08-31 10:02:28.195
。下線:
2018-08-31 10:01:28.195
。下線:
2018-08-31 10:03:28.195
。
這3條訊息展示了,裝置先下線,再上線,最後下線的過程。
關於訊息中參數的更多資訊,請參見資料格式。
其他類型的訊息:
您需要在業務層,給訊息增加序號。根據接收到訊息中的序號,等冪判斷訊息是否需要處理。
接入樣本
阿里雲提供以下語言的AMQP用戶端接入樣本。樣本中的參數配置,請參見串連配置說明。
接入過程中,您可能會遇到訊息相關的錯誤碼。更多資訊,請參見訊息相關錯誤碼。