Paho-MQTT Java接入示例

本文介绍如何使用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连接参数usernamepasswordclientid

    • 成员:

      类型定义

      方法描述

      public void

      calculate(String productKey, String deviceName, String deviceSecret)

      根据设备的productKeydeviceNamedeviceSecret计算出MQTT连接参数usernamepasswordclientid

      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.1Demov5.0Demo),并解压缩。

  2. 打开IntelliJ IDEA,导入Demo包中的示例工程aiot-java-demo

  3. pom.xml文件中修改Maven依赖项版本。详细说明,请参见上文的“下载Java语言的Paho MQTT库”。

    重要

    如果使用的相关插件版本不可用,请前往对应插件的官网查看可用版本进行替换。

  4. src/main/java/com.aliyun.iotAppMqtt5App文件中,修改设备信息为您的设备信息。

    说明

    MQTT 3.1和3.1.1协议通信,使用App文件,MQTT 5.0协议通信,使用Mqtt5App文件。

    • 替换一下代码中productKeydeviceNamedeviceSecret的值为您的设备证书信息。

      String productKey = "${ProductKey}";
      String deviceName = "${DeviceName}";
      String deviceSecret = "${DeviceSecret}";
    • 修改代码String broker = "ssl://" + productKey + ".iot-as-mqtt.cn-shanghai.aliyuncs.com" + ":" + port;中的接入域名。详细说明,请参见上文“接入物联网平台”中的步骤4。

  5. 运行AppMqtt5App程序。

    运行成功日志如下图所示。result

    登录物联网平台控制台,在对应实例下,可查看设备状态和日志。

    • 选择设备管理 > 设备,可看到该设备的状态显示为在线

    • 选择监控运维 > 日志服务,可查看云端运行日志设备本地日志日志。详情请参见云端运行日志设备本地日志

      如果使用Mqtt5App文件,可在日志详情中查看到上报的自定义属性。

      属性

错误码

如果设备通过MQTT协议接入物联网平台失败,请根据错误码排查问题。服务端错误码说明,请参见错误排查