3、Docker搭建MQTT及Spring Boot 3.x集成MQTT

一、前言

复制代码
本篇主要是围绕着两个点,1、Docker 搭建单机版本 MQTT(EMQX),2、Spring Boot 3.x 集成 MQTT(EMQX);
而且这里的 MQTT(EMQX)的搭建也只是一个简单的过程,主要 Spring Boot 的集成 MQTT 部分

二、Docker 搭建 MQTT(EMQX)

复制代码
在这里暂时就不说 Docker 的安装了,如果没有安装可以去 [Docker官网](https://www.docker.com/) 看一下文档即可;
1、emqx 容器初始化
powershell 复制代码
## 下载镜像
docker pull emqx/emqx:latest

## 启动容器
docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8081:8081 -p 18083:18083 --network local-net emqx/emqx:latest

docker ps

docker logs -f emqx

## http://<你的服务器IP>:18083
## 默认用户名:username
## 默认密码:public
2、emqx 配置

2.1、emqx 默认密码登陆之后会有一个重置登录密码页面,可以自己选择是否跳过,之后就进去主界面

2.2 访问控制-客户端认证

客户端认证创建一个认证方式,这里使用的是内置数据库的方式,

下一步之后,有多种选择数据源可以选择,每一种数据源的基础新增命令都是有的,可以参考官方提供的命令进行新增即可

因为已经选择了内置数据库,这里就通过redis给举例一下 参考命令 的地方

这开始就进行客户端用的创建


到此为止,EMQX的配置基本上结束;至于其他方面配置,各位大神自己摸索吧 哈哈哈哈

三、Spring Boot 3.x 集成 MQTT(EMQX)

1、pom.xml
xml 复制代码
<!-- MQTT 连接版本 -->
<mqtt.version>6.3.4</mqtt.version>

<!-- EMQX -->
<!-- MQTT Client (Paho) -->
<dependency>
    <groupId>org.springframework.integration</groupId>
    <artifactId>spring-integration-mqtt</artifactId>
    <version>${mqtt.version}</version>
</dependency>
2、application.yml
yml 复制代码
spring:
  # mqtt配置
  mqtt:
    server-uris: ["tcp://localhost:1883"]
    username: mqttx_user_001
    password: 123qwe,./
    clean-session: true
    default-topic: default/topic
2、MqttConfig.java
java 复制代码
@Configuration
public class MqttConfig {

    // 配置MQTT连接选项,serverURIs、userName、password、cleanSession,这几个配置可以配置在application.yml文件中
    @Bean
    public MqttConnectOptions mqttConnectOptions() {
        MqttConnectOptions options = new MqttConnectOptions();
        options.setServerURIs(new String[]{"tcp://localhost:1883"}); 	// EMQX服务器地址、可以集成到application.yml中
        options.setUserName("mqttx_user_001");  						// 如果需要身份验证、可以集成到application.yml中
        options.setPassword("123456".toCharArray());  					// 如果需要密码、可以集成到application.yml中
        options.setCleanSession(true);  								// 是否清除会话、可以集成到application.yml中
        return options;
    }

    // 创建客户端工厂
    @Bean
    public MqttPahoClientFactory mqttClientFactory() {
        DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
        factory.setConnectionOptions(mqttConnectOptions());
        return factory;
    }

    // 配置消息接收通道
    @Bean
    public MessageChannel mqttInputChannel() {
        return new DirectChannel();
    }

    // 配置MQTT入站通道适配器(订阅消息)
    // default-topic:默认订阅消息主题
    @Bean
    public MqttPahoMessageDrivenChannelAdapter inbound() {
        MqttPahoMessageDrivenChannelAdapter adapter =
                new MqttPahoMessageDrivenChannelAdapter("client-id", mqttClientFactory(),
                        "default-topic");  										// 指定订阅的主题、可以集成到application.yml中
        adapter.setCompletionTimeout(5000);
        adapter.setConverter(new DefaultPahoMessageConverter());
        adapter.setQos(1);  													// 设置QoS级别、可以集成到application.yml中
        adapter.setOutputChannel(mqttInputChannel());							// 指定消息通道
        return adapter;
    }

    // 配置处理收到的消息
    // 接收默认订阅消息主题
    @Bean
    @ServiceActivator(inputChannel = "mqttInputChannel")
    public MessageHandler handler() {
        return message -> {
            System.out.println("Received message: " + message.getPayload());
        };
    }

    // 配置MQTT出站通道适配器(发布消息)
    // default-topic:默认发布消息主题
    @Bean
    @ServiceActivator(inputChannel = "mqttOutboundChannel")
    public MessageHandler mqttOutbound() {
        MqttPahoMessageHandler messageHandler =
                new MqttPahoMessageHandler("client-id", mqttClientFactory());
        messageHandler.setAsync(true);  										// 异步发送、可以集成到application.yml中
        messageHandler.setDefaultTopic("default-topic");  						// 默认发送的主题、可以集成到application.yml中
        return messageHandler;
    }

    // 用于发送消息的通道
    @Bean
    public MessageChannel mqttOutboundChannel() {
        return new DirectChannel();
    }
}
4、MqttPublisherService.java
java 复制代码
@Slf4j
@Service
public class MqttPublisherService {

    /**
     * 发送消息的通道
     */
    @Resource
    private MessageChannel mqttOutboundChannel;

    /**
     * 默认主题发送消息
     *
     * @param payload 消息内容
     */
    public void defaultTopicSendMessage(String payload) {
        log.info("default topic, with payload: {}", payload);
        mqttOutboundChannel.send(MessageBuilder.withPayload(payload).build());
    }

    /**
     * 发送消息到指定主题
     *
     * @param topic   主题
     * @param payload 消息内容
     */
    public void withTopicSendMessage(String topic, String payload) {
        log.info("topic: {}, with payload: {}", topic, payload);
        mqttOutboundChannel.send(MessageBuilder.withPayload(payload)
                .setHeader("mqtt_topic", topic)
                .build());
    }
}
5、MqttPublisherController.java
java 复制代码
@RestController
@RequestMapping("/mqtt/publisher")
public class MqttPublisherController {

    /**
     * MQTT 发布消息服务组件
     */
    @Resource
    private MqttPublisherService mqttPublisherService;

    /**
     * 发送消息到默认主题
     *
     * @param payload 消息内容
     */
    @PostMapping("/default/topic")
    public void defaultTopicSendMessage(@RequestParam String payload) {
        mqttPublisherService.defaultTopicSendMessage(payload);
    }

    /**
     * 发送消息到指定主题
     *
     * @param topic   主题
     * @param payload 消息内容
     */
    @PostMapping("/with/topic")
    public void withTopicSendMessage(@RequestParam String topic, @RequestParam String payload) {
        mqttPublisherService.withTopicSendMessage(topic, payload);
    }
}

到此为止,MQTT(EMQX)的基本集成就完成了

四、验证

如果想要验证是否集成成功,可以通过MQTT客户端

相关推荐
网宿安全演武实验室2 小时前
当AI跑进容器:全链路容器安全检测与智能运营实
人工智能·安全·容器·k8s
苏渡苇6 小时前
服务容错的必要性与Spring Cloud Alibaba Sentinel 限流配置实战
spring boot·spring cloud·sentinel
一点事6 小时前
docker:安装oracle 19c
docker·oracle·容器
bug菌6 小时前
【SpringBoot 3.x 第254节】夯爆了,数据库访问性能优化实战详解!
数据库·spring boot·后端
不肯过江东丶7 小时前
大聪明教你学Java | Spring AI Lab:一个让你 3 分钟接入 AI 对话能力的 Spring Boot 工具箱
spring boot·后端
安当加密7 小时前
Kubernetes Secret不安全?External Secrets Operator接入凭据管理服务实战,自动轮转零停机
安全·容器·kubernetes
lulu12165440787 小时前
Claude Code SpringBoot技能体系架构设计与演进
java·人工智能·spring boot·后端·ai编程
callJJ8 小时前
Nacos 详解——从概念到实战
java·spring boot·spring·spring cloud·微服务·nacos
Simon523148 小时前
反射------5.26学习小计
java·开发语言·spring boot