springboot3集成MQTT 发送信息和接收信息

【MQTT】【实战】---- Spring boot3 整合MQTT详细教程 基于spring boot3 + lombok 1.18.30 + mybatis plus 3.5.5 +jdk17 + nacos3 , 阅读详情
AI摘要

本文介绍Spring Boot 3集成MQTT发送和接收信息的操作。先阐述了MQTT协议,它是轻量级通讯协议,适用于物联网等领域。接着说明集成步骤,包括导入依赖、配置属性、使用注解绑定数据、定义相关类和配置类,还创建控制层实现不同格式数据发送。

介绍:本文章主要是针对springboot3集成MQTT发送信息和接收信息的简单操作

一、什么是MQTT

  1. MQTT(Message Queuing Telemetry Transport, 消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上。
  2. MQTT最大优点在于,可以以极少的代码和有限的带宽,为远程连接设备提过实时可靠的消息服务,作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用
  3. MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛,列如:水位传感器,无人机,医疗设备、智能家居等都在使用MQTT。

 二、那如何使用springboot集成MQTT实时接收发送信息。

 1、我们先导入mqtt版本相关依赖。

<!-- MQTT  spring-integration-mqtt  包含了 org.eclipse.paho.client.mqttv3  -->
<dependency>
    <groupId>org.springframework.integration</groupId>
    <artifactId>spring-integration-mqtt</artifactId>
    <version>5.5.14</version>
</dependency>

2、在application.yml中配置好相关属性,便与后续连接地址或者是账号密码发生变化,不需要去改代码直接修改配置文件即可,由于我这边使用的是购买的mqtt服务,不是自己本地配置mqtt服务所以连接地址不一定一个模样。

# mqtt 配置
com:
  mqtt:
    url: ssl://xxxxx.xxxx.xxx-xxxxx.emqxsl.cn  // 连接地址
    clientId: mqttx_7f91ba0d // 用户id(可以随机)
    topics: test/# // 订阅的主题
    username: serverManager // 账号
    password: robsense2015 // 密码
    timeout: 10 // 连接超时时长
    keepalive: 20 // 心跳间隔 (每20秒对服务发送消息)

3.通过使用 @Configuration 和 @ConfigurationProperties 注解,Spring Boot 会自动将配置文件中的相关属性和数据就会绑定到这个类的字段上。

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

/**
 * MQTT 客户端连接的基本配置,配置信息见 application.yml
 */

@Configuration
@ConfigurationProperties(prefix = "com.mqtt")
public class MqttConfiguration {
    private String url;
    private String clientId;
    private String topics;
    private String username;
    private String password;
    private String timeout;
    private String keepalive;

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getClientId() {
        return clientId;
    }

    public void setClientId(String clientId) {
        this.clientId = clientId;
    }

    public String getTopics() {
        return topics;
    }

    public void setTopics(String topics) {
        this.topics = topics;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getTimeout() {
        return timeout;
    }

    public void setTimeout(String timeout) {
        this.timeout = timeout;
    }

    public String getKeepalive() {
        return keepalive;
    }

    public void setKeepalive(String keepalive) {
        this.keepalive = keepalive;
    }
}

4.定义一个MqttGateWay 的类,然后使用 Spring Integration 的 @MessagingGateway 注解定义的接口用于简化与 MQTT 消息代理的交互,通过访问接口的方式发送消息到 MQTT 主题,而不需要直接与 MQTT 客户端库交互。

import org.springframework.integration.annotation.MessagingGateway;
import org.springframework.integration.mqtt.support.MqttHeaders;
import org.springframework.messaging.handler.annotation.Header;

/**
 * mqtt 网关服务
 */

@MessagingGateway(defaultRequestChannel = "mqttOutBoundChannelIOT")
public interface MqttGateWay {

    /**
     * 给指定主题发信息
     * @param data
     */
    void sendMessageToMqtt(String data);

    /**
     * 通过主题名称发信息
     * @param data
     * @param topic
     */
    void sendMessageToMqtt(String data, @Header(MqttHeaders.TOPIC)String topic);

    /**
     * 通过主题名称发文件
     * @param fileContent
     * @param topic
     */
    void sendFileToMqtt(byte[] fileContent, @Header(MqttHeaders.TOPIC)String topic);

    /**
     * 通过主题名称和qos类型发送消息
     * @param data
     * @param topic
     * @param qos
     */
    void sendMessageToMqTT(String data, @Header(MqttHeaders.TOPIC)String topic, @Header(MqttHeaders.QOS)int qos);
}

5.MqttInBoundConfiguration是SpringBoot配置类,用于设置和管理 MQTT 客户端的连接,以便监听特定的 MQTT 主题并处理接收到的消息。

import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.annotation.IntegrationComponentScan;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.integration.core.MessageProducer;
import org.springframework.integration.mqtt.core.DefaultMqttPahoClientFactory;
import org.springframework.integration.mqtt.inbound.MqttPahoMessageDrivenChannelAdapter;
import org.springframework.integration.mqtt.support.DefaultPahoMessageConverter;
import org.springframework.integration.mqtt.support.MqttHeaders;
import org.springframework.messaging.*;
import org.springframework.integration.mqtt.core.MqttPahoClientFactory;

/**
 * 实现了对 inboundtopic 中的主题监听,当有消息推送到 inboundtopic 主题上时可以接受
 * MQTT 消费端
 */

@Configuration
@IntegrationComponentScan
public class MqttInBoundConfiguration {

    @Bean
    public MessageChannel mqttInputChannel() {
        return new DirectChannel();
    }

    /**
     * 自动注入
     */
    @Autowired
    private MqttConfiguration mqttProperties;

    /**
     * 创建MQTT客户端连接
     */
    @Bean
    public MqttPahoClientFactory mqttInClient(){
        DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
        // 如果配置中有多个连接地址,就可以使用split来分割进行存储
        String[] mqttServerUrls = mqttProperties.getUrl().split(",");
        MqttConnectOptions options = new MqttConnectOptions();
        options.setServerURIs(mqttServerUrls);

        options.setUserName(mqttProperties.getUsername());
        options.setPassword(mqttProperties.getPassword().toCharArray());
        options.setKeepAliveInterval(2);

        //接受离线消息
        options.setCleanSession(false);
        factory.setConnectionOptions(options);
        return factory;
    }

    /**
     * 配置Client,监听Topic
     * 监听MQTT主题并将消息发送到指定通道
     * 如果要配置多个client,应该怎么处理呢?这个也简单, 模仿此方法,多写几个client
     */
    @Bean
    public MessageProducer inBound(){
        // 如果配置中有多个主题订阅,就可以使用split来分割进行存储
        String[] inBoundTopics = mqttProperties.getTopics().split(",");
        // 用于监听mqtt主题客户端,并接收到的消息传为Spring Integration消息,然后发送到指定的消息通道中,
        // 使用mqttInClient方法创建MQTT客户端,并指定要订阅的主题
        MqttPahoMessageDrivenChannelAdapter adapter = new MqttPahoMessageDrivenChannelAdapter(
                mqttProperties.getClientId()+"_inbound",
                mqttInClient(),
                inBoundTopics);
        // 适配器还设置了完成超时、QoS等级、消息转换器以及输出通道
        adapter.setCompletionTimeout(1000*5);
        adapter.setQos(0);
        adapter.setConverter(new DefaultPahoMessageConverter());
        // 当MQTT客户端接收到来自指定主题的消息时,适配器会将消息发送到mqttInputChannel()指定的通道中
        adapter.setOutputChannel(mqttInputChannel());
        return adapter;
    }

    /**
     * 通过通道获取数据,即处理MQTT发过来的消息,可以通过 MQTTX 工具发送数据测试
     */
    @Bean
    @ServiceActivator(inputChannel = "mqttInputChannel") // 异步处理
    public MessageHandler handler(){
        return new MessageHandler() {
            // 处理消息
            @Override
            public void handleMessage(Message<?> message) throws MessagingException {
                // 获取负载
                Object payload = message.getPayload();
                // 获取消息头
                MessageHeaders messageHeaders = message.getHeaders();
                // 获取消息id
                UUID packetId = messageHeaders.getId();
                // 获取qos等级
                Object qos = messageHeaders.get(MqttHeaders.RECEIVED_QOS);
                // 获取接收的主题
                Object topic = messageHeaders.get(MqttHeaders.RECEIVED_TOPIC);
                String handMessage = "MQTT Client " + " packetId:" + packetId
                        + "\nReceive payLoad:" + payload
                        + "\tQOS:" + qos
                        + "\nTopics:" + topic;
                System.out.println("返回的数据打印:"+handMessage);
          }
    }

}

6.MqttOutBoundConfiguration 也是一个定义好的 Spring Boot 配置类,用于设置和管理 MQTT 客户端的发送功能,它定义了如何创建 MQTT 客户端连接、配置连接参数,并将消息发送到指定的 MQTT 主题,建立一个mqttOutBoundChannelIOT 的消息通道,用于发送消息到mqtt主题。

import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.integration.mqtt.core.DefaultMqttPahoClientFactory;
import org.springframework.integration.mqtt.core.MqttPahoClientFactory;
import org.springframework.integration.mqtt.outbound.MqttPahoMessageHandler;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.MessageHandler;

/**
 * MQTT 生产端
 *
 */

@Configuration
public class MqttOutBoundConfiguration {

    @Autowired
    MqttConfiguration mqttConfiguration;

    /**
     * 指定某一个主题发送信息
     * @return
     */
    @Bean
    public MessageChannel mqttOutBoundChannelIOT(){
        return new DirectChannel();
    }

    /**
     * 创建MQTT客户端连接,配置连接的参数选项
     */
    @Bean
    public MqttPahoClientFactory mqttOutClient(){
        DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
        // 如果配置中有多个连接地址,就可以使用split来分割进行存储
        String[] mqttServerUrls = mqttConfiguration.getUrl().split(",");
        MqttConnectOptions options = new MqttConnectOptions();
        options.setServerURIs(mqttServerUrls);
        options.setUserName(mqttConfiguration.getUsername());
        options.setPassword(mqttConfiguration.getPassword().toCharArray());
        //接受离线消息,告诉代理客户端是否要建立持久会话 false为建立持久
        options.setCleanSession(false);
        factory.setConnectionOptions(options);
        return factory;
    }

    /**
     * 指定某一个通过发送mqtt信息
     * @return
     */
    @Bean
    @ServiceActivator(inputChannel = "mqttOutBoundChannelIOT")
    public MessageHandler mqttOutBoundIOT(){
        MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler(mqttConfiguration.getClientId()+"_outbound",
                mqttOutClient());
        // 如果没有传入主题就会给默认主题发送信息
        messageHandler.setDefaultTopic("iots");
        messageHandler.setAsync(true);
        return messageHandler;
    }
}

7、我们在创建一个MqttGateWayController的控制层,用于给用户调用接口进行消息发送,在控制层中写了两种,第一种发送是可以虽然发送String,Int,json格式的数据,第二种是文件上传将文件中的数据读取出来在进行发送数据,在目前已知情况下mqtt是不应许直接发送文件的。

import com.robsense.droneinspectionplatfom.mqtt.MqttGateWay;
import com.robsense.droneinspectionplatfom.utils.Result;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;


@Controller
@RequestMapping(value = "/mqtt")
@Tag(name = "MqttController", description = "MQTT 访问控制")
public class MqttGateWayController {

    // 用于精准依赖注入
    @Qualifier("mqttGateWay")
    @Autowired
    private MqttGateWay mqttGateWayService;

    /**
     * 向主题发送消息
     * @return
     */
    @PostMapping(value = "/sendMqtt")
    @Operation(summary = "向指定主题中,发送消息")
    @ResponseBody
    @Parameters({
            @Parameter(name = "topic",description = "主题",required = true),
            @Parameter(name = "data",description = "数据结构",required = true)
    })
    public Result SendMqtt(String topic, String data){
        try {
            mqttGateWayService.sendMessageToMqtt(data,topic);
            return Result.success(data);
        }catch (Exception e){
            e.printStackTrace();
        }
        return Result.error("操作失败",500);
    }

    /**
     * 向主题发送文件
     * @return
     */
    @PostMapping(value = "/sendFileMqtt")
    @Operation(summary = "向指定主题中,发送文件")
    @ResponseBody
    @Parameters({
            @Parameter(name = "topic",description = "主题",required = true),
            @Parameter(name = "file",description = "文件",required = true)
    })
    public Result SendFileMqtt(String topic, MultipartFile file){
        byte[] fileContent = new byte[(int) file.getSize()];
        try (InputStream inputStream = file.getInputStream()) {
            inputStream.read(fileContent);
            String fileName = file.getOriginalFilename();
            mqttGateWayService.sendFileToMqtt(fileContent, topic);
            return Result.success(fileName,"操作成功");
        } catch (IOException e) {
            // 处理异常
            e.printStackTrace();
        }
        return Result.error("操作失败",500);
    }

谢谢大家收看,如果对您有很大帮助那自然更好。

SpringBoot实现MQTT消息发送和接收 SpringBoot实现MQTT消息发送和接收。 阅读详情

相关推荐

springboot + MQTTv3

文章目录springboot + MQTTv3引入相关依赖期待效果以下相关代码,全部贴出MqttAutoConfigurationMqttTemplateMqttClientSubscribeManagerMqttSubscriberresolver相关类工具类注解类集合辅助类集合 springboot + MQTTv3 ​ 最近项目使用到 MQTT,在引入 mica-mqtt 尝试并发发送消息出现消息丢失的情况,QoS =0,1,2 存在消息丢失情况,QoS=2最严重,所以只好切换到 org.ec

msksk的博客 1444

spring-integration连接MQTT

MQTT一种物联网数据传输协议,构建在TCP之上,采用发布与订阅的模式进行数据交互,发布与订阅是两个独立的连接通道,这里采用spring-integration-mqt来实现发布与订阅MQTT,与直接采用MQTT的SDK相对要简单许多,服务端采用ActiveMQ来支持MQTT的消息服务并实现消息转发。 首先需要引入spring-integration-mqt的包,这里只需要引入这一个包即可。 <dependency> <groupId>org.s...

xiefangjian的专栏 1万+

Springboot实现MQTT通信

目录一、MQTT简介1、MQTT协议2、MQTT协议特点二、MQTT服务器搭建三、使用Springboot整合MQTT协议1、在父工程下创建一个Springboot项目作为消息的提供者1.1 导入依赖包1.2 修改配置文件1.3 消息发布者客户端配置1.4 消息发布客户端回调1.5 创建控制器测试发布信息2、在父工程下创建一个Springboot项目作为消息的接受者2.1 导入依赖包2.2 修改配置文件2.3 接收者客户端配置2.4 消息接收者客户端回调2.5 控制器控制手动建立和断开连接方法3、测试3.1

weixin_46822367的博客 2万+

spring-integration-mqtt

1. mqtt服务器, org.smartboot.mqtt.broker.Bootstrap, 直接启动2. mqtt发消息工具。

xsjCoding的博客 2481

springboot集成MQTT实现消息收发,断线重连

springboot集成MQTT实现消息收发,断线重连 springboot中集成netty。我在代码里用到了lombok的@Slf4j注解输出日志日志。我们先加入mqtt的依赖 mqtt配置 配置 host 里的ip换成自己服务器的公网ip mqtt服务器如果设置了用户名和密码需要填写,没设置就不需要 spring: application: name: mqtt profiles: active: local #local:配置的是本地或测试环境 dev:配置的是生产环境

weixin_42906256的博客 1万+

【springboot集成mqtt开发】

springboot集成mqtt

一路向北jxw 1839

springboot集成mqtt

文章目录一、MQTT说明1.1、mqtt文档1.2、MQTT消息服务质量1.1.1、归纳二、MQTT环境搭建三、boot集成原生mqtt1.1、项目结构1.2、依赖1.3、application.properties配置1.4、实体类1.5、mqtt配置类1.6、mqtt发布接口1.7、mqtt接收消息1.8、集成Swagger2配置1.9、mqtt测试类1.10、测试效果 一、MQTT说明 1.1、mqtt文档 官网:https://mqtt.org/ 仅供参考:https://www.emqx.com

suqinyi的博客 1万+

SpringBoot整合Mqtt

序言 Mqtt就是个Jms的服务协议(我的偏见)。订阅发布,服务器可以使用Emq,官方网址是https://www.emqx.io/ (实在不想在搭建Emq服务器了太求没意思了。故此通过springboot整合Mqtt来倒推Emq的功能cuiyaonan2000@163.com。) 参考资料: https://blog.youkuaiyun.com/qq_23536449/article/details/89876008 Emq的问题 808协议是tcp场链接,车载终端根服务器实在一个tcp...

难得糊涂 1万+

SpringBoot2.0集成MQTT消息推送功能

        这几天在弄后端管理系统向指定的Android客户端推送消息的功能模块,查阅了网上很多博客介绍的许多方式,最终选择基于MQTT协议来实现,MQTT是一个轻量级的消息发布/订阅协议,它是实现基于手机客户端的消息推送服务器的理想解决方案。         实现MQTT协议的中间件有很多,我用的是Apollo服务器,如何搭建MQTT服务器,请查阅其他资料。这里,主要介绍SpringBoo...

qq_41018959的博客 3万+

初学者springboot集成mqtt实例

最近开发一款物联网相关设备,接触到了mqtt协议,网上找了很多资料,但基本都是“犹抱琵琶半遮面”,总有些内容缺失。可能是作者们认为那些太基础的内容不需要说,但对于我这种初学者来说,就很不善了。 所幸,历经坎坷,总算调通了一个,记录在这里,给像我一样的小白提供一些参考。 首先,基于mqqt协议的通信,你得有一个服务器,这个我都不知道。。。。。。(坑1) mqtt服务的基本原理是,大家同服务器连接后,...

foxbamboo的博客 5814

SpringBoot集成MQTT实现交互服务通信

SpringBoot集成MQTT实现交互服务通信

卓越之识论道,平常之识论事,狭隘之识论人 2918

Spring Boot:集成Mqtt实现消息的发送和接收

使用<<Docker案例:Mac系统中构建MQTT容器及使用>>文章中创建的Mqtt Docker容器结合SpringBoot模拟实现消息的发送和接收。在实际应用场景中,Mqtt模块可集成在任何硬件设备,如手持终端、车载模块以及一些定制的电路板中,即有通信功能的“物”中。下面主要记录SpringBoot项目中集成Mqtt的步骤。 Springboot版本:2.2.6.RELEASE 。。。。。。

Crane的博客 1万+

S7-200 Smart 控制运动轴(脉冲电机/伺服)教程

S7-200 Smart 控制运动轴(脉冲电机/伺服) 结合本人刚接触触摸屏时候的踩坑经验,编写S7-200 Smart 控制运动轴(脉冲电机/伺服)的详细流程,给刚接触PLC的朋友提供一些经验指导。 本文详细介绍了S7-200 Smart 控制脉冲步进/伺服电机流程,包含接线方法及梯形图。希望对初学者有所帮助

xjbsw0的博客 5万+

springboot集成mqtt(超级无敌详细)

手把手教springboot集成mqtt 接收消息和发送消息

WXY的博客 5万+

UsualToolCMS-验证码绕过漏洞复现

本文以UsualToolCMS为靶场,复现了验证码绕过漏洞

小小小屿屿屿的博客 918

从VLM到VLA概论

智驾视觉大模型

xiaomu_347的博客 1707

SpringBoot2.0集成MQTT功能之消息订阅处理

       距离上一篇【SpringBoot2.0集成MQTT消息推送功能】https://blog.youkuaiyun.com/qq_41018959/article/details/80592444博客已经过去有一段时间了,最近比较忙,也没时间整理【SpringBoot2.0集成MQTT消息之消息订阅处理】篇章,刚好早上闲下来,就趁这个机会整理一下。        网上资料还是蛮多的,但也不是很全面...

qq_41018959的博客 5万+

开源的预测气象大模型与数据获取/可视化

「开源气象大模型与数据获取指南」摘要: 当前主流AI气象模型(如ECMWF的AIFS、DeepMind的GraphCast、华为Pangu等)主要基于ERA5/HRES数据训练。开源资源可通过ECMWF OpenData、GitHub仓库及Google Cloud获取,其中AIFS数据采用CCBY-4.0许可可商用,其他模型多有限制性许可。典型应用流程包括:1)通过Python包获取实时预报数据;2)加载预训练权重进行推理;3)使用xarray/cartopy或Zarr进行可视化。训练数据可从CDS下载ER

专注AI大模型,软件混淆,授权 793

SpringBoot集成MQTT客户端

本文展示将EMQX服务接入到windows中,并用springboot集成mqtt客户端,实现消息的收发

及丫丫 7686

《企业AI能力地图构建:AI应用架构师的关键秘籍》

构建企业AI能力地图是企业在AI时代实现战略转型和创新发展的关键举措,它需要从评估企业当前AI能力出发,全面了解技术储备、数据资产和人才队伍的现状。将企业业务战略转化为具体的AI应用场景,并进行优先级排序,是确保AI应用能够为企业带来实际价值的重要步骤。通过深入理解业务战略和挖掘应用场景,企业可以找准AI应用的切入点,提高投资回报率。

AI架构全栈开发实战笔记 631

全覆盖路径规划开源项目Clean-robot-turtlebot3关键函数解析(上)

本系列文章主要介绍全覆盖路径规划开源项目Clean-robot-turtlebot3的相关内容,包含如下四篇文章,分别介绍了开源项目Clean-robot-turtlebot3流程的概括总结、ROS坐标系常用坐标及其变换、Clean-robot-turtlebot3关键函数解析等内容。

慕羽★的博客 2778
上一篇: uniapp 打包 IOS
PerfectOpening
博客等级 码龄5年 42粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值