java的mqtt生产者和消费者的代码

背景

物联网时代,项目中不免会用到mqtt,如果是在刚学习的时候,不免会用到生成者和消费者的代码去玩mqtt和自测。这些代码也很难记住,但是很有用,可以提高开发效率,特此记录。

依赖

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


使用java开源的mqtt broker端代码下载

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

工具类

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;
    }
}

配置类

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";


}


生产者代码

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();//释放连接
        }


    }
}

消费者代码

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();//释放连接
        }*/


    }
}

发布消息事件类

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);
    }
}



接受消息监听类

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()));
    }




}

猜你喜欢

转载自blog.csdn.net/qq_40351360/article/details/127678482
今日推荐