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客户端

相关推荐
qq_25183645738 分钟前
基于springboot vue在线学籍管理系统设计与实现
vue.js·spring boot·后端
it技术分享just_free1 小时前
基于Jenkins+K8S构建DevOps自动化运维管理平台
linux·运维·容器·kubernetes·k8s·jenkins·devops
CodeLinghu1 小时前
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
java·spring boot·后端
Slow菜鸟1 小时前
SpringBoot教程(二十四) | SpringBoot实现分布式定时任务之Quartz(动态新增、修改等操作)
spring boot·分布式·后端
夜色呦1 小时前
Spring Boot实现新闻个性化推荐
服务器·spring boot·php
0.0-03 小时前
k8s pod详解使用
云原生·容器·kubernetes
疯一样的码农4 小时前
Spring Boot Starter Parent介绍
java·spring boot·后端
iQM754 小时前
Spring Boot集成RBloomFilter快速入门Demo
java·spring boot·spring
爱上语文4 小时前
Springboot 阿里云对象存储OSS 工具类
java·开发语言·spring boot·后端·阿里云
《源码好优多》5 小时前
基于微信小程序的生鲜订购小程序系统(SpringBoot+Vue+Uniapp+MySQL)
spring boot·微信小程序·小程序