Mosquitto Publish-Subscribe for MQTT Learning (2)

Mosquitto Publish-Subscribe for MQTT Learning (2)

At the end of the article " Mosquitto Installation & Use of MQTT Learning (1) ", I have simulated the publish-subscribe mode, but it was simulated directly on the server at that time, not by java code. Paste the Java code below

1. First introduce the dependency package:

<!-- mosquitto依赖 -->
        <dependency>
            <groupId>org.eclipse.paho</groupId>
            <artifactId>org.eclipse.paho.client.mqttv3</artifactId>
            <version>1.1.0</version>
        </dependency>

 

2. Code

ClientMQTT:

copy code
package org.mqtt.model;


import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttTopic;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;

public  class ClientMQTT {

   public static final String HOST = "tcp://192.168.238.133:1883";
   public static final String TOPIC = "sensor";
   private static final String clientid = "client11";
   private MqttClient client;
   private MqttConnectOptions options;
   private String userName = "admin";
   private String passWord = "password";

   private  void start() {
        try {
            // host is the host name, clientid is the ID of the client connecting to MQTT, generally represented by a unique identifier, MemoryPersistence sets the storage form of clientid, the default is to save in memory 
           client = new MqttClient(HOST, clientid, new MemoryPersistence());
            // MQTT connection setting 
           options = new MqttConnectOptions();
            // Set whether to clear the session, if set to false here, the server will keep the client's connection record, set to true here to indicate each connection Connect to the server with a new identity 
           options.setCleanSession( true );
            // Set the user name of the connection 
           options.setUserName(userName);
            // Set the password of the connection
           options.setPassword(passWord.toCharArray());
            // Set the timeout time unit to seconds 
           options.setConnectionTimeout(10 );
            // Set the session heartbeat time unit to seconds The server will send a message to the client every 1.5*20 seconds The message determines whether the client is online, but this method does not have a reconnection mechanism 
           options.setKeepAliveInterval(20 );
            // Set the callback 
           client.setCallback( new PushCallback());
           MqttTopic topic = client.getTopic(TOPIC);
            // setWill method, this method can be called if the project needs to know whether the client is disconnected. Set the notification message for the final port 
           options.setWill(topic, "close".getBytes(), 2, true );

           client.connect(options);
           // Subscribe message 
           int [] Qos = {1 };
           String[] topic1 = {TOPIC};
           client.subscribe(topic1, Qos);

       } catch (Exception e) {
           e.printStackTrace ();
       }
   }

   public static void main(String[] args) throws MqttException {
       ClientMQTT client = new ClientMQTT();
       client.start();
   }
}
copy code

PushCallback:

copy code
package org.mqtt.model;

import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttMessage;

/**
 * Callback class for publishing messages
 *
 * 必须实现MqttCallback的接口并实现对应的相关接口方法 ◦CallBack 类将实现
 * MqttCallBack。每个客户机标识都需要一个回调实例。在此示例中
 * ,构造函数传递客户机标识以另存为实例数据。在回调中,将它用来标识已经启动了该回调的哪个实例。 ◦必须在回调类中实现三个方法:
 * 
 * public void messageArrived(MqttTopic topic, MqttMessage message) 接收已经预订的发布。
 * 
 * public void connectionLost(Throwable cause) 在断开连接时调用。
 * 
 * public void deliveryComplete(MqttDeliveryToken token)) 接收到已经发布的 QoS 1 或 QoS 2
 * 消息的传递令牌时调用。 ◦由 MqttClient.connect 激活此回调。
 * 
 */
public class PushCallback implements MqttCallback {

    public void connectionLost(Throwable cause) {
        // 连接丢失后,一般在这里面进行重连
        System.out.println("连接断开,可以做重连");
    }
 
    @Override
    public void deliveryComplete(IMqttDeliveryToken arg0) {
        // publish后会执行到这里
        System.out.println("deliveryComplete---------" + arg0.isComplete());
    }


    @Override
    public void messageArrived(String arg0, MqttMessage arg1) throws Exception {
        System.out.println("接收消息主题:" + arg0);
        System.out.println("接收消息Qos:" + arg1.getQos());
        System.out.println("接收消息内容:" + new String(arg1.getPayload()));
    }

}
copy code

ServerMQTT:

copy code
package org.mqtt.model;

/**
 * Created by Administrator on 17-2-10.
 */

import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.MqttPersistenceException;
import org.eclipse.paho.client.mqttv3.MqttTopic;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;

public class ServerMQTT {

    //tcp://MQTT安装的服务器地址:MQTT定义的端口号
    public static final String HOST = "tcp://192.168.238.133:1883";
    //public static final String HOST = "tcp://10.10.10.201:1883";
    
    //定义一个主题
    public static final String TOPIC = "sensor";
    //定义MQTT的ID,可以在MQTT服务配置中指定
    private static final String clientid = "server11";

    private MqttClient client;
    private MqttTopic topic11;
    private String userName = "mosquitto";
    private String passWord = "";

    private MqttMessage message;

    /**
     * 构造函数
     * @throws MqttException
     */
    public ServerMQTT() throws MqttException {
        // MemoryPersistence设置clientid的保存形式,默认为以内存保存
        client = new MqttClient(HOST, clientid, new MemoryPersistence());
        connect();
    }

    /**
     *  用来连接服务器
     */
    private void connect() {
        MqttConnectOptions options = new MqttConnectOptions();
        options.setCleanSession(false);
        options.setUserName(userName);
        options.setPassword(passWord.toCharArray());
        // 设置超时时间
        options.setConnectionTimeout(10);
        // 设置会话心跳时间
        options.setKeepAliveInterval(20);
        try {
            client.setCallback(new PushCallback());
            client.connect(options);

            topic11 = client.getTopic(TOPIC);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     *
     * @param topic
     * @param message
     * @throws MqttPersistenceException
     * @throws MqttException
     */
    public void publish(MqttTopic topic , MqttMessage message) throws MqttPersistenceException,
            MqttException {
        MqttDeliveryToken token = topic.publish(message);
        token.waitForCompletion();
        System.out.println("message is published completely! "
                + token.isComplete());
    }

    /**
     *  启动入口
     * @param args
     * @throws MqttException
     */
    public static void main(String[] args) throws MqttException {
        ServerMQTT server = new ServerMQTT();

        server.message = new MqttMessage();
        server.message.setQos(1);
        server.message.setRetained(true);
  //      server.message.setPayload("hello,topic11".getBytes());
     
        for(int i = 0; i < 1000000;i++){
             server.message.setPayload(("hello,see" + i).getBytes());
             server.publish(server.topic11 , server.message);
        }
       // server.publish(server.topic11 , server.message);
        System.out.println(server.message.isRetained() + "------ratained状态");
    }
}
copy code

 

Tested: ClientMQTT can receive data sent by ServerMQTT in real time

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324824176&siteId=291194637