全部產品
Search
文件中心

IoT Platform:Paho-MQTT Java接入樣本

更新時間:Jun 03, 2026

本文介紹如何使用Java語言的Paho MQTT庫,接入阿里雲物聯網平台,並進行物模型訊息通訊。

前提條件

已在物聯網平台中,建立了產品和裝置,並在產品的功能定義頁簽下,定義一個LightSwitch屬性。

請參見建立產品、單個建立裝置和單個添加物模型。

準備開發環境

本樣本使用的開發環境如下:

下載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>

接入物聯網平台

  1. 單擊開啟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。

  2. 開啟IntelliJ IDEA,建立專案。

  3. 將MqttSign.java匯入專案中。

  4. 在專案中,添加實現裝置接入物聯網平台的程式檔案。

    您需編寫程式調用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());

    關於裝置、伺服器和物聯網平台的通訊方式介紹,請參見物聯網平台通訊方式概述。

  5. 單擊Build Project按鈕build,編譯專案。

範例程式碼

使用Demo代碼程式接入物聯網平台。

  1. 下載程式碼封裝(v3.1.1Demo或v5.0Demo),並解壓縮。

  2. 開啟IntelliJ IDEA,匯入Demo包中的樣本工程aiot-java-demo。

  3. 在pom.xml檔案中修改Maven依賴項版本。詳細說明,請參見上文的“下載Java語言的Paho MQTT庫”。

    重要

    如果使用的相關外掛程式版本不可用,請前往對應外掛程式的官網查看可用版本進行替換。

  4. 在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。

  5. 運行App或Mqtt5App程式。

    運行成功後,程式輸出如下日誌:

    username: example1&a1xxx
    password: 5c9d47198d9d09050043e1f3xxx
    clientid: a1Xxxx.example1|timestamp=1576140939022,_v=paho-java-1.0.0,securemode=2,signmethod=hmacsha256|
    broker: ssl://a1X2bxxx.iot-as-mqtt.cn-shanghai.aliyuncs.com:443 Connected
    subscribe: /sys/a1X2bxxx/example1/thing/event/property/post_reply
    publish: {"id":"1","version":"1.0","params":{"LightSwitch":1}}
    reply topic  : /sys/a1Xxxx/example1/thing/event/property/post_reply
    reply payload: {"code":200,"data":{},"id":"1","message":"success","method":"thing.event.property.post","version":"1.0"}
    Disconnected
    Process finished with exit code 0

    登入物聯網平台控制台,在對應執行個體下,可查看裝置狀態和日誌。

    • 選擇裝置管理 > 裝置,可看到該裝置的狀態顯示為線上。

    • 選擇監控營運 > Log Service,可查看雲端作業記錄和裝置本地日誌日誌。詳情請參見雲端作業記錄、裝置本地日誌。

      如果使用Mqtt5App檔案,可在日誌詳情中查看到上報的自訂屬性。

      在日誌詳情的屬性欄位中,可查看到上報的自訂屬性值,例如 [{"Value":"value1","Key":"key1"}]。

錯誤碼

如果裝置通過MQTT協議接入物聯網平台失敗,請根據錯誤碼排查問題。服務端錯誤碼說明,請參見錯誤排查。