本文介紹使用AMQP協議的JMS用戶端接入阿里雲物聯網平台,接收服務端訂閱訊息的樣本。
前提條件
已擷取消費組ID,並訂閱Topic訊息。
管理AMQP消費組:您可使用物聯網平台預設消費組(DEFAULT_GROUP)或建立消費組。
配置AMQP服務端訂閱:您可通過消費組訂閱需要的Topic訊息。
準備開發環境
樣本使用的開發環境如下:
作業系統:Windows10
JDK版本:JDK8
整合式開發環境:IntelliJ IDEA社區版
下載Apache Qpid JMS用戶端
您可訪問Qpid JMS 0.57.0,查看Qpid JMS使用說明。
本文樣本中,通過在Maven工程中添加如下依賴,下載Qpid JMS用戶端。
<!-- amqp 1.0 qpid client -->
<dependency>
<groupId>org.apache.qpid</groupId>
<artifactId>qpid-jms-client</artifactId>
<version>0.57.0</version>
</dependency>
<!-- util for base64-->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.10</version>
</dependency>
樣本Demo
假設企業A和企業B分別有一個阿里雲主帳號A和阿里雲主帳號B,企業A使用阿里雲主帳號在物聯網平台已佈建服務端訂閱:
對於阿里雲主帳號A或其下直接授權的RAM使用者
說明對於直接授權的RAM使用者,需要給該RAM使用者授予操作AMQP服務端訂閱功能的許可權(iot:sub),否則將會串連失敗。授權方法,請參見物聯網平台RAM授權說明。
為提升物聯網平台資料安全,推薦通過RAM角色授予RAM使用者指定的操作許可權。具體說明,請參見下文。
開發AMQP用戶端接收服務端訂閱的裝置訊息,請參見本帳號接收服務端訂閱訊息。
對於通過RAM角色授權的RAM使用者
RAM使用者可為阿里雲主帳號A下的RAM使用者,或阿里雲主帳號B下的RAM使用者,即支援使用本帳號(阿里雲主帳號A)和跨帳號(阿里雲主帳號B)的RAM使用者,開發AMQP用戶端接入本帳號的物聯網平台,接收服務端訂閱的裝置訊息。
開發AMQP用戶端接收服務端訂閱的裝置訊息,請參見通過RAM角色授權的RAM使用者接收服務端訂閱訊息。
本帳號接收服務端訂閱訊息
下載Demo程式碼封裝,並解壓。
開啟IntelliJ IDEA,匯入Demo包中的樣本工程amqp-demo。
在
pom.xml
檔案中,已添加Maven依賴,下載Qpid JMS用戶端。在
src/main/java/com.aliyun.iotx.demo
目錄下AmqpClient.java
檔案中,參照下表,修改AMQP的接入資訊。重要請確保參數值輸入正確,否則AMQP用戶端接入會失敗。
本樣本Demo代碼中,添加了結束程式的代碼(
Thread.sleep(60 * 1000);
),即程式啟動成功,運行一分鐘後會結束。實際情境中,您可根據需要自行設定已耗用時間。
更多參數說明,請參見AMQP用戶端接入說明。
參數
說明
accessKey
阿里雲主帳號或對應RAM使用者的AccessKey ID和AccessKey Secret。
登入物聯網平台控制台,將滑鼠移至帳號頭像上,然後單擊AccessKey管理,擷取AccessKey ID和AccessKey Secret。
accessSecret
consumerGroupId
當前物聯網平台對應執行個體中的消費組ID。
登入物聯網平台控制台,在對應執行個體的
查看您的消費組ID。iotInstanceId
執行個體ID。您可在物聯網平台控制台的執行個體概覽頁面,查看當前執行個體的ID。
若有ID值,必須傳入該ID值。
若無執行個體概覽頁面或ID值,傳入空值,即
iotInstanceId = ""
。
clientId
表示用戶端ID,需您自訂,長度不可超過64個字元。建議使用您的AMQP用戶端所在伺服器UUID、MAC地址、IP等唯一標識。
AMQP用戶端接入並啟動成功後,登入物聯網平台控制台,在對應執行個體的 頁簽,單擊消費組對應的查看,消費組詳情頁面將顯示該參數,方便您識別區分不同的用戶端。
connectionCount
啟動AMQP用戶端的串連數,最大不超過128個。用於即時訊息推送的擴容。
消費組詳情頁面會以
${clientId}+"-"+數字
形式,顯示串連的用戶端。其中數字最小值為0。host
AMQP接入網域名稱。
${YourHost}
對應的AMQP接入網域名稱資訊,請參見查看和配置執行個體終端節點資訊(Endpoint)。運行
AmqpClient.java
程式。成功:返回類似如下日誌資訊,表示AMQP用戶端已接入物聯網平台並成功接收訊息。
topic = /***********/******/thing/event/property/post, message = 2**************7, content = {"temperature":29,"humidity":29,"time":1617357297270}
參數
說明
topic
裝置屬性上報的Topic。
messageId
訊息的ID。
content
訊息的內容。
失敗:例如代碼或網路環境有問題,AMQP用戶端串連物聯網平台會失敗。
您可根據日誌提示,檢查代碼或網路環境,然後修正問題,重新運行代碼。
通過RAM角色授權的RAM使用者接收服務端訂閱訊息
前提條件
RAM使用者已通過RAM角色授權擷取企業A阿里雲帳號物聯網平台的服務端訂閱操作許可權。具體操作,請參見本帳號RAM使用者授權服務端訂閱、跨帳號RAM使用者授權服務端訂閱。
接入樣本
下載Demo程式碼封裝,然後解壓。
開啟IntelliJ IDEA,匯入Demo包中的樣本工程amqp-sts-demo。
在
pom.xml
檔案中,已添加Maven依賴,下載Qpid JMS用戶端。在
src/main/java/com/aliyun/iotx/demo
目錄下AmqpStsTokenClient.java
檔案中,參照下表,修改AMQP的接入資訊。重要請確保參數值輸入正確,否則AMQP用戶端接入會失敗。
STS Token有效期間最長1個小時,需要定時更新AMQP用戶端接入中的建連資訊,以確保AMQP用戶端正常重連成功。具體修改方式可參考樣本Demo代碼中的
scheduledExecutorService.scheduleAtFixedRate
部分。本樣本Demo代碼中,添加了結束程式的代碼(
Thread.sleep(6000 * 1000);
),即程式啟動成功,運行一分鐘後會結束。實際情境中,您可根據需要自行設定已耗用時間。
更多參數說明,請參見AMQP用戶端接入說明。
參數
說明
CONNECTION_COUNT
啟動AMQP用戶端的串連數,最大不超過128個。用於即時訊息推送的擴容。
本帳號物聯網平台的消費組詳情頁面會以
"clientId-"+數字
形式,顯示串連的用戶端。其中數字最小值為0。DURATION_SECONDS
串連參數Token有效期間,不能超過1小時,取值範圍:15~60分鐘。
STS_ENDPOINT
STS Token擷取服務存取點。具體資訊,請參見服務存取點。
STS_ACCESS_KEY
扮演企業A阿里雲帳號下RAM角色的RAM使用者的AccessKey ID和AccessKey Secret。
STS_ACCESS_SECRET
STS_ROLE_ARN
企業A阿里雲帳號下要扮演的RAM角色ARN,格式為
acs:ram::<account-id>:role/<role-name>
。其中,
<role-name>
部分會將角色的名稱全部轉換為小寫。建立角色後,您可以單擊角色名稱,在基本資料地區查看角色ARN。CONSUMER_GROUP_ID
企業A阿里雲帳號下服務端訂閱的消費組ID。
可在物聯網平台控制台對應執行個體的
頁簽,查看消費組ID。IOT_INSTANCE_ID
企業A阿里雲帳號下物聯網平台執行個體ID。
可在物聯網平台控制台的執行個體概覽頁簽,查看執行個體的ID。
若有ID值,必須傳入該ID值。
若無執行個體概覽頁簽或ID值,傳入空值,即
IOT_INSTANCE_ID = ""
。
HOST
企業A阿里雲帳號下物聯網平台執行個體的AMQP接入網域名稱。具體資訊,請參見查看和配置執行個體終端節點資訊(Endpoint)。
運行
AmqpStsTokenClient.java
程式。成功:返回類似如下日誌資訊,表示AMQP用戶端已接入物聯網平台並成功接收訊息。
topic = /***********/******/thing/event/property/post, message = 2**************7, content = {"temperature":29,"humidity":29,"time":1617357297270}
參數
說明
topic
裝置屬性上報的Topic。
messageId
訊息的ID。
content
訊息的內容。
失敗:例如代碼或網路環境有問題,AMQP用戶端串連物聯網平台會失敗。
您可根據日誌提示,檢查代碼或網路環境,然後修正問題,重新運行代碼。
相關文檔
服務端訂閱訊息相關錯誤碼,請參見訊息相關錯誤碼。