- 控制台连接端口号 18083
- 客户端连接端口号 1883
SpringBoot整合MQTT
- pom.xml文件,导入相关依赖包
<!-- 引入 mqtt 相关依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-integration</artifactId>
<version>2.3.12.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-stream</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-mqtt</artifactId>
</dependency>
- 修改properties / yaml 文件,增加mqtt相关的连接配置
spring.application.name=test
# MQTT服务地址,端口号默认1883,如果有多个,用逗号隔开
spring.mqtt.url=tcp://127.0.0.1:1883
# 用户名
spring.mqtt.username=admin
# 密码
spring.mqtt.password=lep-88888888
- mqtt连接
package com.example.springmaven.controller.conf;
import org.eclipse.paho.client.mqttv3.\*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
/\*\*
\* @Date 2023/11/21 18:31
\*/
@Configuration
public class MqttConfig {
@Value("${spring.mqtt.username}")
private String username;
@Value("${spring.mqtt.password}")
private String password;
@Value("${spring.mqtt.url}")
private String hostUrl;
@Value("${spring.application.name}")
private String applicationName;
/\*\*
\* 客户端对象
\*/
private MqttClient client;
/\*\*
\* 在bean初始化后连接到服务器
\*/
@PostConstruct
public void init() {
this.connect();
}
/\*\*
\* 断开连接
\*/
@PreDestroy
public void disConnect() {
try {
client.disconnect();
client.close();
} catch (MqttException e) {
e.printStackTrace();
}
}
/\*\*
\* 客户端连接服务端
\*/
public void connect() {
try {
// 创建MQTT客户端对象
client = new MqttClient(hostUrl, applicationName, new MemoryPersistence());
// 连接设置
MqttConnectOptions options = new MqttConnectOptions();
// 是否清空session,设置false表示服务器会保留客户端的连接记录(订阅主题,qos),客户端重连之后能获取到服务器在客户端断开连接期间推送的消息
// 设置为true表示每次连接服务器都是以新的身份
options.setCleanSession(true);
// 设置连接用户名
options.setUserName(username);
// 设置连接密码
options.setPassword(password.toCharArray());
// 设置超时时间,单位为秒
options.setConnectionTimeout(100);
// 设置心跳时间 单位为秒,表示服务器每隔 1.5\*20秒的时间向客户端发送心跳判断客户端是否在线
options.setKeepAliveInterval(20);
// 设置遗嘱消息的话题,若客户端和服务器之间的连接意外断开,服务器将发布客户端的遗嘱信息
options.setWill("willTopic", (applicationName + "与服务器断开连接").getBytes(), 0, false);
// 设置回调
client.setCallback(new MqttCallBack());
// 连接
client.connect(options);
// 订阅主题 (接受此主题的消息)
this.subscribe("warn\_topic", 2);
this.subscribe("warn\_topic2", 2);
} catch (MqttException e) {
e.printStackTrace();
}
}
/\*\*
\* 发布消息
\*
\* @param topic
\* @param message
\*/
public boolean publish(String topic, String message) {
MqttMessage mqttMessage = new MqttMessage();
// 0:最多交付一次,可能丢失消息
// 1:至少交付一次,可能消息重复
// 2:只交付一次,既不丢失也不重复
mqttMessage.setQos(2);
// 是否保留最后一条消息
mqttMessage.setRetained(false);
// 消息内容
mqttMessage.setPayload(message.getBytes());
// 主题的目的地,用于发布/订阅信息
MqttTopic mqttTopic = client.getTopic(topic);
// 提供一种机制来跟踪消息的传递进度
// 用于在以非阻塞方式(在后台运行)执行发布是跟踪消息的传递进度
MqttDeliveryToken token;
try {
// 将指定消息发布到主题,但不等待消息传递完成,返回的token可用于跟踪消息的传递状态
// 一旦此方法干净地返回,消息就已被客户端接受发布,当连接可用,将在后台完成消息传递。
token = mqttTopic.publish(mqttMessage);
token.waitForCompletion();
return true;
} catch (MqttException e) {
e.printStackTrace();
}
return false;
}
/\*\*
\* 订阅主题
\*/
public void subscribe(String topic, int qos) {
try {
client.subscribe(topic, qos);
} catch (MqttException e) {
e.printStackTrace();
}
}
}
- 消息回调
package com.example.springmaven.controller.conf;
import org.eclipse.paho.client.mqttv3.IMqttAsyncClient;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.springframework.context.annotation.Configuration;
/\*\*
\* @Date 2023/11/21 18:32
\*/
@Configuration
public class MqttCallBack implements MqttCallback {
/\*\*
\* 与服务器断开的回调
\*/
@Override
public void connectionLost(Throwable cause) {
System.out.println("与服务器断开连接");
}
/\*\*
\* 消息到达的回调
\*/
@Override
public void messageArrived(String topic, MqttMessage message) {
System.out.println(String.format("接收消息主题 : %s", topic));
System.out.println(String.format("接收消息Qos : %d", message.getQos()));
System.out.println(String.format("接收消息内容 : %s", new String(message.getPayload())));
System.out.println(String.format("接收消息retained : %b", message.isRetained()));
}
/\*\*
\* 消息发布成功的回调
\*/
@Override
public void deliveryComplete(IMqttDeliveryToken token) {
IMqttAsyncClient client = token.getClient();
System.out.println(client.getClientId() + "发布消息成功!");
}
}
- 发送消息
@RestController
@RequestMapping(value = "/test")
@Slf4j
public class TestController {
@Autowired
private MqttConfig mqttConfig;
@GetMapping("/sendMessage")
public String sendMessage(@RequestParam("topic") String topic,
@RequestParam("message") String message) {
boolean publish = mqttConfig.publish(topic, message);
if (publish) {
return "ok";
}
return "no";
}
}
- 启动项目
两个订阅方 , 两个主题方
- 模拟发送消息
- 查看消息是否消费
查看监控
查看控制台输出
. ____ _ __ _ _
/\\ / ___'\_ \_\_ \_ \_(\_)\_ \_\_ \_\_ \_ \ \ \ \
( ( )\\_\_\_ | '_ | '\_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |\_\_\_\_| .\_\_|\_| |\_|\_| |\_\\_\_, | / / / /
=========|\_|==============|\_\_\_/=/\_/\_/\_/
## 最后
**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**
**深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。**
**因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
![img](https://img-blog.csdnimg.cn/img_convert/8b15d671159bddb44c8e0e8e374a05df.png)
![img](https://img-blog.csdnimg.cn/img_convert/97806cdab55bb31326f8249303774ef1.jpeg)
![img](https://img-blog.csdnimg.cn/img_convert/175169860a1af4fed90183b9f6a81f4b.png)
![img](https://img-blog.csdnimg.cn/img_convert/89bdb344630abcb1a793350be36699f9.png)
![img](https://img-blog.csdnimg.cn/img_convert/a3dfcb69f4f354430d908de9f79c5da6.png)
![img](https://img-blog.csdnimg.cn/img_convert/a07495b0ee7399daf2f5ebf6cce3e679.png)
![](https://img-blog.csdnimg.cn/img_convert/cfde97e36723dbcaafc88f567640ffc2.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**
[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!
存中...(img-aUU2wCin-1715598288857)]
[外链图片转存中...(img-hh96y5ly-1715598288858)]
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**
[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!