前言:安装mqtt服务请参考文章:Docker安装EMQX
Spring Boot整合MQTT
1、在pom文件中引入依赖
<dependency>
<groupId>org.eclipse.paho</groupId>
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
<version>1.2.5</version>
</dependency>
2、在yml文件中添加配置信息
# Spring配置
spring:
#MQTT配置信息
mqtt:
#MQTT服务端地址,端口默认为1883,如果有多个,用逗号隔开,如tcp://127.0.0.1:1883,tcp://192.168.60.133:1883
url: tcp://10.10.3.190:1883
#用户名
username: admin
#密码
password: admin
#发布客户端id(不能重复)
clientIdPub: mqttx_fchsoft_pub
#订阅客户端id(不能重复)
clientIdSub: mqttx_fchsoft_sub
3、创建配置类
MqttConfig.java
package com.fch.guideScreen.MqttConfig;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.IMqttToken;
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 org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.annotation.Resource;
/**
* @className: MqttConfig
* @description: mqtt配置类
* @author: pxm
* @createTime: 2024/1/17 9:19
* @version: 1.0.0
*/
@Configuration
@Slf4j
public class MqttConfig {
/**
* MQTT服务端地址
*/
@Value("${spring.mqtt.url}")
private String serverURI;
/**
* 订阅客户端id(不能重复)
*/
@Value("${spring.mqtt.clientIdSub}")
private String clientIdSub;
/**
* 发布客户端id(不能重复)
*/
@Value("${spring.mqtt.clientIdPub}")
private String clientIdPub;
/**
* 用户名
*/
@Value("${spring.mqtt.username}")
private String username;
/**
* 密码
*/
@Value("${spring.mqtt.password}")
private String password;
/**
* 推送的主题
*/
@Value("${spring.mqtt.topic}")
private String topic;
/**
* mqtt客户端
*/
private static MqttClient mqttClient;
/**
* mqtt发送消息客户端
*/
private static MqttClient sendMqttClient;
static String serverURI2;
@Resource
private MqttMessageListenerImpl mqttMessageListenerImpl;
public static MqttClient getSendClient() {
return sendMqttClient;
}
static MqttConnectOptions opts;
@Bean
MqttConnectOptions mqttConnectOptions() {
try {
opts = new MqttConnectOptions();
opts.setMqttVersion(MqttConnectOptions.MQTT_VERSION_3_1_1);
opts.setMaxReconnectDelay(5 * 1000);
opts.setConnectionTimeout(2 * 1000);
opts.setHttpsHostnameVerificationEnabled(false);
opts.setCleanSession(false);
opts.setKeepAliveInterval(5);
opts.setAutomaticReconnect(true);
opts.setUserName(username);
opts.setPassword(password.toCharArray());
} catch (Exception e) {
e.printStackTrace();
}
serverURI2 = serverURI;
return opts;
}
@Bean
MqttClient sendMqttClient() {
MqttClient sendClient = null;
try {
MemoryPersistence persistence = new MemoryPersistence();
sendClient = new MqttClient(serverURI, clientIdPub + "send", persistence);
IMqttToken token = sendClient.connectWithResult(opts);
token.waitForCompletion();
sendMqttClient = sendClient;
} catch (MqttException e) {
log.error(e.getMessage());
}
return sendMqttClient;
}
@Bean
MqttClient mqttClient() {
MqttClient client = null;
try {
MemoryPersistence persistence = new MemoryPersistence();
client = new MqttClient(serverURI, clientIdSub, persistence);
IMqttToken token = client.connectWithResult(opts);
token.waitForCompletion();
log.info("=====================订阅所有mqtt服务端下发信息====================");
IMqttToken iMqttToken = client.subscribeWithResponse(topic, 0, mqttMessageListenerImpl);
iMqttToken.waitForCompletion();
String str = new String(token.getResponse().getPayload());
System.out.println("============================" + str);
mqttClient = client;
} catch (MqttException e) {
log.error(e.getMessage());
}
return client;
}
}
4、订阅消息回调类
MqttMessageListenerImpl.java
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.IMqttMessageListener;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.springframework.stereotype.Component;
/**
* @ClassName: MqttMessageListenerImpl
*/
@Component
@Slf4j
public class MqttMessageListenerImpl implements IMqttMessageListener {
@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
log.info("开始");
System.out.println("订阅主题名称:"+topic);
String payload = new String(message.getPayload());
System.out.println("发送数据:"+payload);
return;
}
}
5、实现类
/**
* 电箱订阅topic
*/
@Value("${spring.mqtt.mqttmessage.topic}")
private String mqttTopic;
try {
//发布消息
MqttConfig.getSendClient().publish(mqttTopic, "pubMessage".getBytes(),0,false);
} catch (MqttException e) {
throw new RuntimeException(e);
}