Java's mqtt producer and consumer code

background

In the era of the Internet of Things, mqtt will inevitably be used in projects. If you are just learning, you will inevitably use the code of the generator and consumer to play mqtt and self-test. These codes are also difficult to remember, but they are very useful and can improve development efficiency, so they are hereby recorded.

rely

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


Use java open source mqtt broker code download

https://gitee.com/smartboot/smart-mqtt

Tools

package com.example.demo.smartMqttTest;


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.persist.MemoryPersistence;

import java.util.UUID;


public class MqUtils {
    
    
    /**
     * 功能描述:连接MQ
     * @param clientId
     * @param userName
     * @param password
     */
    public static MqttClient connect(String clientId, String userName, String password) throws MqttException {
    
    
        MemoryPersistence persistence = new MemoryPersistence();
        MqttConnectOptions connOpts = new MqttConnectOptions();
        connOpts.setCleanSession(true);
        connOpts.setUserName(userName);
        connOpts.setPassword(password.toCharArray());
        connOpts.setConnectionTimeout(10);// 设置超时时间
        connOpts.setKeepAliveInterval(20); // 设置会话心跳时间
        // broker,clientid即连接MQTT的客户端ID,一般以唯一标识符表示,MemoryPersistence设置clientid的保存形式,默认为以内存保存
        MqttClient mqttClient = new MqttClient(com.example.demo.mqtt.MqConfig.broker, clientId, persistence);
        mqttClient.setCallback(new com.example.demo.mqtt.PushCallback("test"));//设置回调
        mqttClient.connect(connOpts);
        return mqttClient;
    }

    /**
     * 功能描述:连接MQ
     * @param clientId
     * @param userName
     * @param password
     */
    public static MqttClient connect(String address,String clientId, String userName, String password) throws MqttException {
    
    
        MemoryPersistence persistence = new MemoryPersistence();
        MqttConnectOptions connOpts = new MqttConnectOptions();
        connOpts.setCleanSession(true);
        connOpts.setUserName(userName);
        connOpts.setPassword(password.toCharArray());
        connOpts.setConnectionTimeout(10);// 设置超时时间
        connOpts.setKeepAliveInterval(20); // 设置会话心跳时间
        // broker,clientid即连接MQTT的客户端ID,一般以唯一标识符表示,MemoryPersistence设置clientid的保存形式,默认为以内存保存
        MqttClient mqttClient = new MqttClient(address, clientId, persistence);
        mqttClient.setCallback(new com.example.demo.mqtt.PushCallback("test"));//设置回调
        mqttClient.connect(connOpts);
        return mqttClient;
    }

    public static MqttClient connect(String address,String clientId) throws MqttException {
    
    
        MemoryPersistence persistence = new MemoryPersistence();
        MqttConnectOptions connOpts = new MqttConnectOptions();
        connOpts.setCleanSession(true);
        connOpts.setConnectionTimeout(10);// 设置超时时间
        connOpts.setKeepAliveInterval(20); // 设置会话心跳时间
        // broker,clientid即连接MQTT的客户端ID,一般以唯一标识符表示,MemoryPersistence设置clientid的保存形式,默认为以内存保存
        MqttClient mqttClient = new MqttClient(address, clientId, persistence);
        mqttClient.setCallback(new PushCallback("test"));//设置回调
        mqttClient.connect(connOpts);
        return mqttClient;
    }


    /**
     * 功能描述:连接MQ
     * @param clientId 客户端唯一标识
     */
    protected static MqttClient connectB(String broker) throws MqttException {
    
    
        MemoryPersistence persistence = new MemoryPersistence();
        MqttConnectOptions connOpts = new MqttConnectOptions();
        connOpts.setCleanSession(false);
        connOpts.setConnectionTimeout(10);
        connOpts.setKeepAliveInterval(20);
        /*connOpts.setUserName(MqConfig.userName);
        connOpts.setPassword(MqConfig.passWord.toCharArray());*/
        MqttClient mqttClient = new MqttClient(broker, UUID.randomUUID().toString(), persistence);
        mqttClient.connect(connOpts);
        return mqttClient;
    }

    /**
     * 功能描述:连接MQ
     * @param clientId 客户端唯一标识
     */
    protected static MqttClient connect(String clientId) throws MqttException {
    
    
        MemoryPersistence persistence = new MemoryPersistence();
        MqttConnectOptions connOpts = new MqttConnectOptions();
        connOpts.setCleanSession(false);
        connOpts.setConnectionTimeout(10);
        connOpts.setKeepAliveInterval(20);
        /*connOpts.setUserName(MqConfig.userName);
        connOpts.setPassword(MqConfig.passWord.toCharArray());*/
        MqttClient mqttClient = new MqttClient(MqConfig.broker, clientId, persistence);
        mqttClient.connect(connOpts);
        return mqttClient;
    }
}

configuration class

package com.example.demo.smartMqttTest;


public class MqConfig {
    
    
    public static String broker = "tcp://192.186.11.163:11883";
    public static int qos = 1; //只有一次

    public static String topic = "test";


}


producer code

package com.example.demo.smartMqttTest;

import com.alibaba.fastjson.JSONObject;

import com.example.demo.mqtt.SubMessageListener;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;

import java.util.UUID;


public class Productor {
    
    

    public  static MqttClient mqttClient = null;




    public static void publish(String msg, String topic) throws MqttException {
    
    

        if (mqttClient != null)
        {
    
    
            MqttMessage message = new MqttMessage(msg.getBytes());
            message.setQos(MqConfig.qos);
            //重新连接MQTT服务时,不需要接收该主题最新消息,设置retained为false
            //重新连接MQTT服务时,需要接收该主题最新消息,设置retained为true;
            message.setRetained(false);
            mqttClient.publish(topic, message);
        }

    }

    private static void subMsg(String clientId, String topic) throws MqttException{
    
    
        if(mqttClient != null)
        {
    
    
            int[] Qos  = {
    
    MqConfig.qos};
            String[] topics = {
    
    topic};
            mqttClient.subscribe(topics, Qos);
        }
        mqttClient.subscribe(topic,MqConfig.qos,new SubMessageListener());
    }

    public static void main(String[] args) throws MqttException {
    
    
        String clientId="client-id-0";
        mqttClient = MqUtils.connect(MqConfig.broker, UUID.randomUUID().toString());


        if(mqttClient.isConnected()){
    
    
            System.out.println("连接成功");
            for(int i=1;i<100;i++){
    
    
                JSONObject jsonObject=new JSONObject();
                jsonObject.put("aa",+i);

                publish(jsonObject.toJSONString(),  MqConfig.topic);

                try {
    
    
                    Thread.sleep(4000);
                } catch (InterruptedException e) {
    
    
                    throw new RuntimeException(e);
                }
            }
        }else {
    
    
            System.out.println("连接失败");
        }
        if (mqttClient != null)
        {
    
    
            mqttClient.disconnect();//释放连接
        }


    }
}

consumer code

package com.example.demo.smartMqttTest;

import com.alibaba.fastjson.JSONObject;



import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;


public class Consumer1 {
    
    

    public  static MqttClient mqttClient = null;



    /**
     * 功能描述:发送消息
     * @author zhangpu
     * @date 2022/4/2
     * @param msg
     * @param clientId
     * @param topic
     */
    public static void publish(String msg, String topic) throws MqttException {
    
    

        if (mqttClient != null)
        {
    
    
            MqttMessage message = new MqttMessage(msg.getBytes());
            message.setQos(MqConfig.qos);
            //重新连接MQTT服务时,不需要接收该主题最新消息,设置retained为false
            //重新连接MQTT服务时,需要接收该主题最新消息,设置retained为true;
            message.setRetained(true);
            mqttClient.publish(topic, message);
        }

    }

    private static void subMsg(String clientId, String topic) throws MqttException{
    
    
        if(mqttClient != null)
        {
    
    
            int[] Qos  = {
    
    MqConfig.qos};
            String[] topics = {
    
    topic};
            mqttClient.subscribe(topics, Qos);
        }
        mqttClient.subscribe(topic,MqConfig.qos,new SubMessageListener());
    }

    public static void main(String[] args) throws MqttException {
    
    
        mqttClient = MqUtils.connect(MqConfig.broker, UUID.randomUUID().toString());

        if(mqttClient.isConnected()){
    
    
            new Thread(new Runnable() {
    
    
                @Override
                public void run() {
    
    
                    SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    System.out.println("启动监听成功!时间:"+simpleDateFormat.format(new Date()));
                    while (true){
    
    
                        if(!mqttClient.isConnected()){
    
    

                            System.out.println("连接断开时间:"+simpleDateFormat.format(new Date()));
                        }
                        try {
    
    
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
    
    
                            throw new RuntimeException(e);
                        }
                    }
                }
            }).start();

            System.out.println("连接成功");
            subMsg(UUID.randomUUID().toString(), MqConfig.topic);
        }else {
    
    
            System.out.println("连接失败");
        }
        /*if (mqttClient != null)
        {
    
    
            mqttClient.disconnect();//释放连接
        }*/


    }
}

Publish message event class

package com.example.demo.smartMqttTest;

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


public class PushCallback implements MqttCallback {
    
    
    private String threadId;

    public PushCallback(String threadId) {
    
    
        this.threadId = threadId;
    }

    public void connectionLost(Throwable cause) {
    
    
        // 连接丢失后,一般在这里面进行重连
        //System.out.println("连接断开,可以做重连");
    }

    public void deliveryComplete(IMqttDeliveryToken token) {
    
    
        //System.out.println("deliveryComplete---------" + token.isComplete());
    }

    public void messageArrived(String topic, MqttMessage message) throws Exception {
    
    
        String msg = new String(message.getPayload(),"utf-8");
        System.out.println("-------messageArrived-------"+threadId + " " + msg);
    }
}



Receive message monitoring class

package com.example.demo.smartMqttTest;


import com.alibaba.fastjson.JSONObject;
import com.example.demo.mqtt.MqConfig;
import org.apache.commons.codec.digest.DigestUtils;
import org.eclipse.paho.client.mqttv3.IMqttMessageListener;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Date;
import java.util.concurrent.atomic.AtomicInteger;


public class SubMessageListener implements IMqttMessageListener {
    
    
    private String id;
    private MqttClient mqttClient;
    private String topic;

    public SubMessageListener() {
    
    
    }

    public SubMessageListener(String id, MqttClient mqttClient, String topic) {
    
    
        this.id = id;
        this.mqttClient = mqttClient;
        this.topic = topic;
    }

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




}

Supongo que te gusta

Origin blog.csdn.net/qq_40351360/article/details/127678482
Recomendado
Clasificación