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

news2024/10/9 11:25:44

一、前言

本篇主要是围绕着两个点,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 容器初始化
## 下载镜像
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
<!-- 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
spring:
  # mqtt配置
  mqtt:
    server-uris: ["tcp://localhost:1883"]
    username: mqttx_user_001
    password: 123qwe,./
    clean-session: true
    default-topic: default/topic
2、MqttConfig.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
@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
@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客户端

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2198889.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为什么现在的大学生很难真正学好LabVIEW编程?

学习LabVIEW编程对大学生来说可能存在以下挑战&#xff1a; 学习曲线陡峭&#xff1a;尽管LabVIEW提供直观的图形化编程环境&#xff0c;便于初学者入门&#xff0c;但要深入掌握其高级功能和复杂应用&#xff0c;仍需要投入大量时间和精力。随着学习的深入&#xff0c;概念和应…

CAN与CANFD的区别

CAN概念&#xff1a; CAN&#xff0c;全称为Controller Area Network&#xff0c;即控制器局域网络&#xff0c;是一种用于汽车电子系统中的串行通信协议。它由德国电气工程师协会&#xff08;Bosch&#xff09;在1983年开发&#xff0c;并在1986年正式推出。CAN协议主要用于汽…

牛客:Holding Two,Inverse Pair,Counting Triangles

Holding Two 题目描述 登录—专业IT笔试面试备考平台_牛客网 ​​运行代码 #include<bits/stdc.h> using namespace std; const int N3e45; string s1,s2; int main(){int n,m;cin>>n>>m;for(int i0;i<m;i){if(i&1){s10;s21;} else{s11;s20;} }fo…

架构师:Spring Cloud Gateway 的技术指南

1、简述 Spring Cloud Gateway 是 Spring Cloud 生态系统中的一个重要组件,作为微服务架构的 API 网关,它为路由、限流、安全、监控等功能提供了全面支持。相比传统的 Zuul 网关,Spring Cloud Gateway 使用了非阻塞的 WebFlux 框架,性能上有了显著提升,并且提供了更现代化…

BLE MESH学习2——自定义MESH网络架构思考

BLE MESH学习2——自定义MESH网络架构思考 基于对WCH CH582这款单片机的了解&#xff0c;其可以实现mesh配网、朋友节点、低功耗节点和中继节点的角色&#xff0c;基本功能无问题。在此基础上&#xff0c;考虑满足IoT需求的MESH架构设计&#xff0c;作为后续设计的“白皮书”。…

构建流媒体管道:利用 Docker 部署 Nginx-RTMP 从 FFmpeg RTMP 推流到 HLS 播放的完整流程

最近要实现一个类似导播台的功能&#xff0c;于是我先用 FFmpeg 实现一个参考对照的 Demo&#xff0c;我将其整理为一篇文章&#xff0c;方便后续大家或者和自己参考&#xff01; 1、软件工具介绍 本次部署相关软件 / 工具如下&#xff1a; FFmpeg&#xff1a;全称是 Fast Fo…

java脚手架系列1--模块化、多环境

之所以想写这一系列&#xff0c;是因为之前工作过程中有几次项目是从零开始搭建的&#xff0c;而且项目涉及的内容还不少。在这过程中&#xff0c;遇到了很多棘手的非业务问题&#xff0c;在不断实践过程中慢慢积累出一些基本的实践经验&#xff0c;认为这些与业务无关的基本的…

kkFileView 4.4.0最新版本发行版安装包部署及使用文档

kkFileView为文件文档在线预览解决方案&#xff0c;该项目使用流行的spring boot搭建&#xff0c;易上手和部署&#xff0c;基本支持主流办公文档的在线预览&#xff0c;如doc,docx,xls,xlsx,ppt,pptx,pdf,txt,zip,rar,图片,视频,音频等等 一. 下载&部署 下载最新发行包&…

网络层协议 --- IP

序言 在这篇文章中我们将介绍 IP协议&#xff0c;经过这篇文章的学习&#xff0c;我们就会了解运营商到底是如何为我们提供服务的以及平时我们所说的内网&#xff0c;公网到底又是什么&#xff0c;区别是什么&#xff1f; IP 地址的基本概念 1. IP 地址的定义 每一个设备接入…

Java中String类的常见操作Api

目录 String类的常见操作 1).int indexOf (char 字符) 2).int lastIndexOf(char 字符) 3).int indexOf(String 字符串) 4).int lastIndexOf(String 字符串) 5).char charAt(int 索引) 6).Boolean endWith(String 字符串) 7).int length() 8).boolean equals(T 比较对象) 9).b…

【2024】作为前端开发,必须掌握的 Vue3 的 5 个组合式 API 方法

引言&#xff1a;2024 你还不知道 Vue3 的 defineProps、defineEmits、defineExpose、defineOptions 和 defineSlots 吗&#xff1f;这几个 Vue3 组合式 API 方法不仅开发常用&#xff08;涉及组件通信、组件复用等&#xff09;&#xff0c;在面试中也是不可或缺的一部分&#…

SpringBoot实现电子文件签字+合同系统!

一、前言 二、项目源码及部署 1、项目结构及使用框架 2、项目下载及部署 三、功能展示 一、前言 今天公司领导提出一个功能,说实现一个文件的签字+盖章功能,然后自己进行了简单的学习,对文档进行数字签名与签署纸质文档的原因大致相同,数字签名通过使用计算机加密来验证 (…

LabVIEW提高开发效率技巧----阻塞时钟

在LabVIEW开发中&#xff0c;阻塞时钟&#xff08;Blocking Timed Loops&#xff09;是一种常见且强大的技术&#xff0c;尤其适用于时间关键的应用。在这些应用中&#xff0c;精确控制循环的执行频率是关键任务。阻塞时钟通过等待循环的执行完成后再进入下一次迭代&#xff0c…

鸿蒙 Next 实战: 烟花模拟器

前言 通过上一篇文章可以看出&#xff0c;要在鸿蒙应用中实现特别炫的特效还是比较复杂。动画固然重要&#xff0c;但如果在赶工期的情况下&#xff0c;大家都会优先业务&#xff0c;那有没有简单快速的方法呢&#xff1f; 有的&#xff0c;也用像 Android 和 iOS 里 WebView …

.Net Core 接口或网站发布到IIS

将.Net Core 接口或网站发布到IIS上&#xff0c;需要遵循一系列步骤来确保正确配置和部署。下面将以.NET Core 3.1的api接口发布示范&#xff1a; 一、环境准备 安装.NET Core 3.1 SDK和运行时&#xff1a; 在服务器上安装.NET Core 3.1 SDK&#xff08;如果需要在服务器上编译…

宝兰德亮相2024国际信息通信展:数智创新,信创力量!

9月25日-27日&#xff0c;2024中国国际信息通信展览会在北京国家会议中心隆重召开。本届展会以“推动数实深度融合&#xff0c;共筑新质生产力”为主题&#xff0c;全面展示信息通信业发展最新成果。作为国内领先的基础软件供应商&#xff0c;宝兰德再度闪耀会场&#xff0c;在…

[ROS】rqt工具箱

作用&#xff1a; 可以方便的实现 ROS 可视化调试&#xff0c;并且在同一窗口中打开多个部件&#xff0c;提高开发效率&#xff0c;优化用户体验。 组成&#xff1a; rqt工具箱组成有三大部分 rqt 核心实现&#xff0c;开发人员无需关注 rqt_common_plugins rqt…

Gated Transformer Networks for Multivariate Time Series Classification

博客贡献人 徐宁 作者 Minghao Liu , Shengqi Ren , Siyuan Ma , Jiahui Jiao , Yizhou Chen , Zhiguang Wang(Facebook AI) and Wei Song∗ 标签 多元时间序列分类&#xff0c;Transformer&#xff0c;门控 摘要 用于时间序列分类的深度学习模型&#xff08;主要是卷积网…

GO网络编程(七):海量用户通信系统5:分层架构

P323开始&#xff08;尚硅谷GO教程&#xff09;老韩又改目录结构了&#xff0c;没办法&#xff0c;和之前一样&#xff0c;先说下目录结构&#xff0c;再给代码&#xff0c;部分代码在之前讲过&#xff0c;还有知识的话由于本人近期很忙&#xff0c;所以这些就不多赘述了&#…