本文介紹如何配置服務端訂閱,將產品下的設備狀態變化消息推送到輕量消息隊列(原 MNS) SMQ(Simple Message Queue (formerly MNS))隊列中;服務器通過監聽MNS隊列接收設備狀態變化消息。
前提條件
開通阿里云產品:
準備開發環境,本示例使用Java開發環境如下:
操作系統:Windows 10 64位
JDK版本:JDK8
集成開發環境:IntelliJ IDEA社區版
配置服務端訂閱
首先在物聯網平臺控制臺創建MNS服務端訂閱,選擇要訂閱的消息類型。
登錄物聯網平臺控制臺。
在實例概覽頁簽的全部環境下,找到對應的實例,單擊實例卡片。
在左側導航欄,選擇 ,再單擊創建產品,創建一個氣體監測儀產品。
選擇 ,在剛創建的氣體監測儀產品下創建設備。
設備證書信息將會用于設備端SDK開發配置。
在左側導航欄,選擇使用MNS(SMQ)服務端訂閱。 ,然后單擊創建訂閱,創建MNS服務端訂閱。具體操作,請參見
說明首次設置推送到MNS時,需單擊提示中的授權,進入RAM控制臺同意授權IoT訪問MNS。
本示例中,選擇推送消息類型為設備狀態變化通知,即該產品下所有設備的狀態變化消息,都會被推送到MNS隊列中。
訂閱成功后,物聯網平臺會在MNS中,自動創建一個接收物聯網平臺消息的隊列。隊列名稱格式為:
aliyun-iot-${yourProductKey}
。您在配置MNS SDK監聽消息時,需填入該隊列名稱。在訂閱列表中,單擊MNS右側的圖標,可查看MNS隊列名稱。
配置服務端MNS SDK接收消息
本示例使用MNS Java SDK Demo。
訪問MNS Java SDK版本說明,下載sample包文件,并解壓縮。
本示例使用sample包文件為aliyun-sdk-mns-samples-1.1.9.1.zip。
在IntelliJ IDEA中,導入工程aliyun-sdk-mns-samples-1.1.9.1文件夾。
在計算機的本地目錄C:\Users\${YourComputerUserName}下,添加一個PROPERTIES類型文件.aliyun-mns.properties,并在文件中輸入MNS訪問身份認證信息,格式如下:
說明Linux系統用戶目錄為/home/YOURNAME/,Windows系統用戶目錄為C:\Users\YOURNAME。
mns.accountendpoint=http://${your_accountId}.mns.${your_regionId}.aliyuncs.com mns.accesskeyid=${your_accesskeyid} mns.accesskeysecret=${your_accesskeysecret}
參數
說明
accountendpoint
您的MNS服務Endpoint。請在輕量消息隊列(原 MNS)控制臺,選擇隊列所在地域單擊隊列的詳情查看。
accesskeyid
您的阿里云賬號的AccessKey ID和AccessKey Secret。
登錄物聯網平臺控制臺,將鼠標移至賬號頭像上,然后單擊AccessKey管理,獲取AccessKey ID和AccessKey Secret。
accesskeysecret
在src\main\java\com.aliyun.mns.sample.Queue目錄下的ComsumerDemo文件中,配置物聯網平臺自動創建的輕量消息隊列(原 MNS)名稱。
public static void main(String[] args) { CloudAccount account = new CloudAccount( ServiceSettings.getMNSAccessKeyId(), ServiceSettings.getMNSAccessKeySecret(), ServiceSettings.getMNSAccountEndpoint()); MNSClient client = account.getMNSClient(); //client初始化 // 提取消息 try{ CloudQueue queue = client.getQueueRef("aliyun-iot-a1eN7La****");// 替換為物聯網平臺自動創建的隊列 for (int i = 0; i < 10; i++) { Message popMsg = queue.popMessage(); //長輪詢等待時間 if (popMsg != null){ System.out.println("message handle: " + popMsg.getReceiptHandle()); System.out.println("message body: " + popMsg.getMessageBodyAsString()); //獲取原始消息 System.out.println("message id: " + popMsg.getMessageId()); System.out.println("message dequeue count:" + popMsg.getDequeueCount()); //<<to add your special logic.>> //從隊列中刪除消息 queue.deleteMessage(popMsg.getReceiptHandle()); System.out.println("delete message successfully.\n"); } } }
運行程序文件ComsumerDemo.java。
配置設備端SDK
訪問設備接入Link SDK,選擇Java SDK。
在Java Link SDK的環境要求與配置中,下載Java SDK Demo,然后解壓縮。
在IntelliJ IDEA中,導入工程JavaLinkKitDemo。
在device_id文件中,填入設備證書信息。
在src\main\java\com.aliyun.alink.devicesdk.demo目錄下的MqttSample文件中,將publish對應的Topic配置為您的設備Topic。
在src\main\java\com.aliyun.alink.devicesdk.demo目錄下的HelloWorld文件中,填入設備接入信息。
設備接入信息的獲取方法,請參見查看和配置實例終端節點信息(Endpoint)。
運行設備連接的程序文件:HelloWorld.java。
結果驗證
設備端SDK運行后,設備上線消息通過服務端訂閱發送到輕量消息隊列(原 MNS)中。輕量消息隊列(原 MNS)SDK從隊列中接收消息,并同時將已接收的消息從隊列中刪除。
下圖展示輕量消息隊列(原 MNS)SDK接收并刪除消息。