服務端訂閱(MNS)
本文介紹如何佈建服務端訂閱,將產品下的裝置狀態變化訊息推送到Simple Message Queue (formerly MNS) (SMQ)隊列中;伺服器通過監聽MNS隊列接收裝置狀態變化訊息。
前提條件
-
開通阿里雲產品:
-
準備開發環境,本樣本使用Java開發環境如下:
作業系統:Windows 10 64位
JDK版本:JDK8
整合式開發環境:IntelliJ IDEA社區版
佈建服務端訂閱
首先在物聯網平台控制台建立MNS服務端訂閱,選擇要訂閱的訊息類型。
-
登入物聯網平台控制台。
在執行個體概覽頁簽的全部環境下,找到對應的執行個體,單擊執行個體卡片。
-
在左側導覽列,選擇,再單擊建立產品,建立一個氣體監測儀產品。
-
選擇,在剛建立的氣體監測儀產品下建立裝置。
裝置認證資訊將會用於裝置端SDK開發配置。
-
在左側導覽列,選擇,然後單擊建立訂閱,建立MNS服務端訂閱。具體操作,請參見使用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檔案中,配置物聯網平台自動建立的Simple Message Queue (formerly 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"); } } } catch (Exception e) { e.printStackTrace(); } } -
運行程式檔案ComsumerDemo.java。
配置裝置端SDK
-
訪問裝置接入Link SDK,選擇Java SDK。
-
下載Java SDK Demo,然後解壓縮。
說明下載本Demo預設您同意本軟體許可協議。
-
在IntelliJ IDEA中,匯入工程JavaLinkKitDemo。
-
在device_id檔案中,填入裝置認證資訊。
{ "productKey": "xxx", "deviceName": "Esensor", "productSecret": "", "deviceSecret": "1xxx?2" } -
在src\main\java\com.aliyun.alink.devicesdk.demo目錄下的MqttSample檔案中,將publish對應的Topic配置為您的裝置Topic。
public class MqttSample extends BaseSample { final static String TAG = "MqttSample"; public MqttSample(String pk, String dn) { super(pk, dn); } /** * 發布介面樣本 */ public void publish() { MqttPublishRequest request = new MqttPublishRequest(); // topic 用自根據實際情境填寫 request.topic = "/sys/" + productKey + "/" + deviceName + "/thing/deviceinfo/update"; } } -
在src\main\java\com.aliyun.alink.devicesdk.demo目錄下的HelloWorld檔案中,填入裝置接入資訊。
裝置接入資訊的擷取方法,請參見查看和配置執行個體終端節點資訊(Endpoint)。其中
channelHost的拼接格式為{productKey}.iot-as-mqtt.{region}.aliyuncs.com:1883。範例程式碼:public void init(final DeviceInfoData deviceInfoData) { this.pk = deviceInfoData.productKey; this.dn = deviceInfoData.deviceName; LinkKitInitParams params = new LinkKitInitParams(); /** * 設定 Mqtt 初始化參數 */ IoTMqttClientConfig config = new IoTMqttClientConfig(); config.productKey = deviceInfoData.productKey; config.deviceName = deviceInfoData.deviceName; config.deviceSecret = deviceInfoData.deviceSecret; config.channelHost = pk + ".iot-as-mqtt." + deviceInfoData.region + ".aliyuncs.com:1883"; /** * 是否接受離線訊息 * 對應 mqtt 的 cleanSession 欄位 */ // ... } -
運行裝置串連的程式檔案:HelloWorld.java。
結果驗證
裝置端SDK運行後,裝置上線訊息通過服務端訂閱發送到Simple Message Queue (formerly MNS)中。Simple Message Queue (formerly MNS)SDK從隊列中接收訊息,並同時將已接收的訊息從隊列中刪除。
以下樣本展示Simple Message Queue (formerly MNS)SDK接收並刪除訊息。
message handle: 519xxx...AgMA==
message body:
{"payload":"eyJsYXN0xxx...IiwiY2xpZW5xxx...","topic":"/as/mqtt/status/xxx/device1","messageid":15xxx,"timestamp":1661158432}
message id: 51xxx...C49
message dequeue count:1
delete message successfully.