本文介紹如何使用Java語言的Paho MQTT庫,接入阿里雲物聯網平台,並進行物模型訊息通訊。
前提條件
已在物聯網平台中,建立了產品和裝置,並在產品的功能定義頁簽下,定義一個LightSwitch屬性。
準備開發環境
本樣本使用的開發環境如下:
作業系統:Windows 10
JDK版本:JDK8
整合式開發環境:IntelliJ IDEA社區版
下載Java語言的Paho MQTT庫
根據要使用的MQTT協議版本,在Maven工程中添加如下依賴:
您需要通過官網查看MQTT協議的可用版本,替換version
值。
MQTT 3.1和3.1.1版本
<dependencies> <dependency> <groupId>org.eclipse.paho</groupId> <artifactId>org.eclipse.paho.client.mqttv3</artifactId> <version>1.2.1</version> </dependency> </dependencies>
MQTT 5.0版本
<dependency> <groupId>org.eclipse.paho</groupId> <artifactId>org.eclipse.paho.mqttv5.client</artifactId> <version>1.2.5</version> </dependency>
接入物聯網平台
單擊開啟MqttSign.java,擷取阿里雲提供的擷取MQTT串連參數所需的原始碼。
MqttSign.java檔案定義了MqttSign類,類說明如下:
原型:
class MqttSign
功能:
用於計算裝置接入物聯網平台的MQTT串連參數username、password和clientid。
成員:
類型定義
方法描述
public void
calculate(String productKey, String deviceName, String deviceSecret)
根據裝置的productKey、deviceName和deviceSecret計算出MQTT串連參數username、password和clientid。
public String
getUsername()
用於擷取MQTT建連參數username。
public String
getPassword()
用於擷取MQTT建連參數password。
public String
getClientid()
用於擷取MQTT建連參數clientid。
開啟IntelliJ IDEA,建立專案。
將MqttSign.java匯入專案中。
在專案中,添加實現裝置接入物聯網平台的程式檔案。
您需編寫程式調用MqttSign.java中的MqttSign類計算MQTT串連參數,實現裝置接入物聯網平台和通訊。
開發說明和範例程式碼如下:
調用MqttSign計算MQTT串連參數。
String productKey = "a1X2bEn****"; String deviceName = "example1"; String deviceSecret = "ga7XA6KdlEeiPXQPpRbAjOZXwG8y****"; // 計算MQTT串連參數。 MqttSign sign = new MqttSign(); sign.calculate(productKey, deviceName, deviceSecret); System.out.println("username: " + sign.getUsername()); System.out.println("password: " + sign.getPassword()); System.out.println("clientid: " + sign.getClientid());
調用Paho MQTT用戶端串連物聯網平台。
//接入物聯網平台的網域名稱。 String port = "443"; String broker = "ssl://" + productKey + ".iot-as-mqtt.cn-shanghai.aliyuncs.com" + ":" + port; // Paho MQTT用戶端。 MqttClient sampleClient = new MqttClient(broker, sign.getClientid(), persistence); // Paho MQTT串連參數。 MqttConnectOptions connOpts = new MqttConnectOptions(); connOpts.setCleanSession(true); connOpts.setKeepAliveInterval(180); connOpts.setUserName(sign.getUsername()); connOpts.setPassword(sign.getPassword().toCharArray()); sampleClient.connect(connOpts); System.out.println("Broker: " + broker + " Connected");
重要修改代碼
String broker = "ssl://" + productKey + ".iot-as-mqtt.cn-shanghai.aliyuncs.com" + ":" + port;
中的接入網域名稱,broker 值的格式為"ssl://" + "${對應執行個體下MQTT接入網域名稱}" + ":" + port
。公用執行個體和企業版執行個體接入網域名稱的格式說明,請參見查看執行個體終端資訊。
發布訊息。
以下範例程式碼上報物模型屬性LightSwitch。
// Paho MQTT發布訊息。 String topic = "/sys/" + productKey + "/" + deviceName + "/thing/event/property/post"; String content = "{\"id\":\"1\",\"version\":\"1.0\",\"params\":{\"LightSwitch\":1}}"; MqttMessage message = new MqttMessage(content.getBytes()); message.setQos(0); sampleClient.publish(topic, message);
如果您使用MQTT 5.0協議通訊,可添加以下範例程式碼,上報訊息時攜帶自訂屬性。
//MQTT 5.0新特性:使用者自訂屬性 MqttProperties properties = new MqttProperties(); List<UserProperty> userPropertys = new ArrayList<>(); userPropertys.add(new UserProperty("key1","value1")); properties.setUserProperties(userPropertys); //MQTT 5.0新特性:請求/響應模式 properties.setCorrelationData("requestId12345".getBytes()); properties.setResponseTopic("/" + productKey + "/" + deviceName + "/user/get"); message.setProperties(properties); //支援MQTT 5.0的Paho SDK預設會使用Topic別名 sampleClient.publish(topic, message);
物模型通訊資料格式,請參見裝置屬性、事件、服務。
如果您要使用自訂Topic通訊,請參見什麼是Topic。
訂閱Topic,擷取雲端下發訊息。
以下樣本中,訂閱的是上報屬性值後,物聯網平台返回應答訊息的Topic。
class MqttPostPropertyMessageListener implements IMqttMessageListener { @Override public void messageArrived(String var1, MqttMessage var2) throws Exception { System.out.println("reply topic : " + var1); System.out.println("reply payload: " + var2.toString()); } } ... // Paho MQTT訊息訂閱。 String topicReply = "/sys/" + productKey + "/" + deviceName + "/thing/event/property/post_reply"; sampleClient.subscribe(topicReply, new MqttPostPropertyMessageListener());
關於裝置、伺服器和物聯網平台的通訊方式介紹,請參見物聯網平台通訊方式概述。
單擊Build Project按鈕,編譯專案。
範例程式碼
使用Demo代碼程式接入物聯網平台。
下載程式碼封裝(v3.1.1Demo或v5.0Demo),並解壓縮。
開啟IntelliJ IDEA,匯入Demo包中的樣本工程aiot-java-demo。
在pom.xml檔案中修改Maven依賴項版本。詳細說明,請參見上文的“下載Java語言的Paho MQTT庫”。
重要如果使用的相關外掛程式版本不可用,請前往對應外掛程式的官網查看可用版本進行替換。
在src/main/java/com.aliyun.iot下App或Mqtt5App檔案中,修改裝置資訊為您的裝置資訊。
說明MQTT 3.1和3.1.1協議通訊,使用App檔案,MQTT 5.0協議通訊,使用Mqtt5App檔案。
替換一下代碼中productKey、deviceName和deviceSecret的值為您的裝置認證資訊。
String productKey = "${ProductKey}"; String deviceName = "${DeviceName}"; String deviceSecret = "${DeviceSecret}";
修改代碼
String broker = "ssl://" + productKey + ".iot-as-mqtt.cn-shanghai.aliyuncs.com" + ":" + port;
中的接入網域名稱。詳細說明,請參見上文“接入物聯網平台”中的步驟4。
運行App或Mqtt5App程式。
錯誤碼
如果裝置通過MQTT協議接入物聯網平台失敗,請根據錯誤碼排查問題。服務端錯誤碼說明,請參見錯誤排查。