背景
物联网时代,项目中不免会用到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()));
}
}