本文介紹使用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客戶端連接物聯網平臺會失敗。
您可根據日志提示,檢查代碼或網絡環境,然后修正問題,重新運行代碼。
相關文檔
服務端訂閱消息相關錯誤碼,請參見消息相關錯誤碼。