开发者中心

Hello MQTT Java

概述

在本教程中您将了解如何配合立子云预定义的消息(称为"静态模板")来使用Java语言版本的MQTT客户端。

前提条件

为了更好的使用本教程,请检查以下必备条件:

  • 一个有效的租户、一个用户和一个密码,可以用来访问Quarkioe。
  • 安装了Java 7的Maven 3:
  • 
      mvn -v
      Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-10T17:41:47+01:00)
      Maven home: /home/schm/development/devtools/apache-maven-3.3.9
      Java version: 1.7.0_80, vendor: Oracle Corporation
      Java home: /usr/lib/jvm/java-7-oracle/jre
      Default locale: pl_PL, platform encoding: UTF-8
      OS name: "linux", version: "4.4.0-66-generic", arch: "amd64", family: "unix"
                          

Maven可以从Maven下载

开发“Hello,MQTT World!”客户端

开发一个非常简单的“Hello,World!”MQTT客户端,你需要:

  • 创建一个Maven项目。
  • 将对MQTT Java客户端库的依赖添加到Maven pom.xml中(在本例中,我们将使用Paho Java客户机)。
  • 创建一个Java应用程序。
  • 编译并运行Java应用程序。

创建一个MAVEN项目

要用Maven创建一个普通的Java项目,运行:


mvn archetype:generate -DgroupId=c8y.example -DartifactId=hello-mqtt-java -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
                      

这将在当前目录中创建一个文件夹“hello - mqttt - java”,为您的项目提供一个框架结构。

添加MQTT JAVA客户端库

在“hello - mqtt-java”文件夹中,编辑“pom.xml”。向MQTT Paho Java客户机添加一个关联项。


<dependency>
    <groupId>org.eclipse.paho</groupId>
    <artifactId>org.eclipse.paho.client.mqttv3</artifactId>
    <version>1.1.0</version>
</dependency>
                      

创建一个JAVA应用程序

按照如下内容编辑文件夹"hello-mqtt-java/src/main/java/c8y/example"下的 "App.java" 文件


ackage c8y.example;

import org.eclipse.paho.client.mqttv3.*;
import java.util.concurrent.*;

public class App {

    public static void main(String[] args) throws Exception {
        final String clientId = "<>";
        final String serverURI = "<>";

        //configure MQTT connection
        final MqttConnectOptions options = new MqttConnectOptions();
        options.setUserName("<>/<>");
        options.setPassword("<>".toCharArray());
        final MqttClient client = new MqttClient(serverURI, clientId, null);

        //connect to the Cumulocity
        client.connect(options);

        //create device
        client.publish("s/us", "100,My MQTT device,c8y_MQTTDevice".getBytes(), 2, false);

        //set hardware information
        client.publish("s/us", "110,S123456789,MQTT test model,Rev0.1".getBytes(), 2, false);

        //listen for operation
        client.subscribe("s/ds", new IMqttMessageListener() {
            public void messageArrived(final String topic, final MqttMessage message) throws Exception {
                final String payload = new String(message.getPayload());
                System.out.println("Received operation " + payload);
                if (payload.startsWith("510")) {
                    System.out.println("Simulating device restart...");
                    client.publish("s/us", "501,c8y_Restart".getBytes(), 2, false);
                    System.out.println("...restarting...");
                    Thread.sleep(TimeUnit.SECONDS.toMillis(1));
                    client.publish("s/us", "503,c8y_Restart".getBytes(), 2, false);
                    System.out.println("...done...");
                }
            }
        });

        Executors.newSingleThreadScheduledExecutor().scheduleWithFixedDelay(new Runnable() {
            public void run() {
                try {
                    //send temperature measurement
                    client.publish("s/us", new MqttMessage("211,25".getBytes()));
                } catch (MqttException e) {
                    e.printStackTrace();
                }
            }
        }, 1, 3, TimeUnit.SECONDS);
    }
}
                      

用您的数据替换"<<clientId>>", "<<serverUrl>>", "<<tenant>>", "<<username>>", "<<password>>"。 “立子云” MQTT协议既支持未加密TCP,也支持加密SSL连接。 tcp:/ / mqtt.quarkioe.com:1883或ssl:/ / mqtt.quarkioe.com:8883)。

主程序中的代码用来做什么?

  • 配置MQTT连接。
  • 通过MQTT协议连接到“立子云”。
  • 创建一个带有“My MQTT”设备名称和“c8y_MQTTDevice”类型的新设备。
  • 通过使用S123456789串行、MQTT测试模型和Rev0.1修订更新设备硬件信息。
  • 订阅该设备的静态操作模板,将所有接收到的操作打印到控制台,并在c8y_Restart操作模拟设备重启时使用。
  • 创建一个每3秒发送温度测量的新线程。

请注意,订阅是在设备创建之后建立的,否则如果没有给定的设备ID,服务器将不接受它。

编译和运行

编译:

cd hello-mqtt-java
mvn clean install
...
[INFO] 
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ hello-mqtt-java ---
[INFO] Building jar: /home/schm/Pulpit/hello-mqtt-java/target/hello-mqtt-java-1.0-SNAPSHOT.jar
[INFO] 
[INFO] --- maven-install-plugin:2.4:install (default-install) @ hello-mqtt-java ---
[INFO] Installing /home/schm/Pulpit/hello-mqtt-java/target/hello-mqtt-java-1.0-SNAPSHOT.jar to /home/schm/.m2/repository/c8y/example/hello-mqtt-java/1.0-SNAPSHOT/hello-mqtt-java-1.0-SNAPSHOT.jar
[INFO] Installing /home/schm/Pulpit/hello-mqtt-java/pom.xml to /home/schm/.m2/repository/c8y/example/hello-mqtt-java/1.0-SNAPSHOT/hello-mqtt-java-1.0-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.642 s
[INFO] Finished at: 2017-03-14T09:16:25+01:00
[INFO] Final Memory: 14M/301M
[INFO] ------------------------------------------------------------------------
To run:
                      
运行:

mvn exec:java -Dexec.mainClass="c8y.example.App"
...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building hello-mqtt-java 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- exec-maven-plugin:1.6.0:java (default-cli) @ hello-mqtt-java ---
Received operation 510,123456789
                      

启动应用程序后,您应该在“立子云”应用程序的设备列表中的中看到一个新设备。此外,如果为该设备创建了一个新的操作(例如c8y_Restart),它的信息将被打印到控制台。

优化Agent

现在,您已经完成了第一步,请查看Hello MQTT部分,了解更多关于Quarkioe MQTT的知识,并改进您的应用程序。