SpringBoot 集成mqtt

SpringBoot 整合MQTT 消息推送 springboot整合mqtt, 消息推送 阅读详情

在Spring Boot中集成MQTT(Message Queuing Telemetry Transport)是一个常见的需求,尤其是在需要实现物联网(IoT)通信时。MQTT是一种轻量级的、基于发布/订阅模式的消息传输协议,广泛用于低带宽、不可靠或高延迟的网络环境中。

以下是一个基本的步骤指南,介绍如何在Spring Boot项目中集成MQTT:

1. 添加依赖

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-integration</artifactId>
        </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>

2. 配置MQTT客户端

参数配置

@Data
@Component("mqttConfigProp")
@ConfigurationProperties(prefix = "mqtt")
public class MqttConfigProp {
    private String[] serverURIs;
    private String clientId;
    private String userName;
    private char[] password;
    private String topic;
    private int timeout;
    private int keepAlive;
    private boolean cleanSession;
}

接收配置

@Slf4j
@Configuration
@EnableIntegration
public class MqttConfigurationInbound {

    @Autowired
    private MqttConfigProp mqttConfigProp;

    @Bean
    public MqttConnectOptions mqttConnectOptionInbound() {
        MqttConnectOptions options = new MqttConnectOptions();
        options.setServerURIs(mqttConfigProp.getServerURIs());
        options.setUserName(mqttConfigProp.getUserName());
        options.setPassword(mqttConfigProp.getPassword());
        options.setKeepAliveInterval(mqttConfigProp.getKeepAlive());
        options.setCleanSession(mqttConfigProp.isCleanSession());
        return options;
    }
    @Bean
    public MqttPahoClientFactory mqttClientFactoryInbound() {
        DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
        factory.setConnectionOptions(mqttConnectOptionInbound());
        return factory;
    }

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

    @Bean
    public MessageProducer brokerMqttInbound() {
        MqttPahoMessageDrivenChannelAdapter adapter = new MqttPahoMessageDrivenChannelAdapter(
                mqttConfigProp.getClientId()+ UUID.randomUUID().toString() + "_inbound",
                mqttConnectOptionInbound(), mqttConfigProp.getTopic());
        adapter.setConverter(new DefaultPahoMessageConverter());
        adapter.setOutputChannel(mqttInputChannel());
        adapter.setCompletionTimeout(mqttConfigProp.getTimeout());
        adapter.setQos(1);
        return adapter;
    }

    /**
     * mqtt连接失败或者订阅失败事件
     * @param event
     */
    @EventListener(MqttConnectionFailedEvent.class)
    public void mqttConnectionFailedEvent(MqttConnectionFailedEvent event) {
        log.error("mqttConnectionFailedEvent连接mqtt失败: " +
                        "date={}, error={}",
                new Date(), event.getCause().getMessage());
    }

    /**
     * 当async和async事件(async-events)都为true时,将发出MqttMessageSentEvent
     * 它包含消息、主题、客户端库生成的消息id、clientId和clientInstance(每次连接客户端时递增)
     * @param event
     */
    @EventListener(MqttMessageSentEvent.class)
    public void mqttMessageSentEvent(MqttMessageSentEvent event) {
        log.info("mqttMessageSentEvent发送信息: date={}, info={}", new Date(), event.toString());
    }

    /**
     * 当async和async事件(async-events)都为true时,将发出MqttMessageDeliveredEvent
     * 当客户端库确认传递时,将发出MqttMessageDeliveredEvent。它包含messageId、clientId和clientInstance,使传递与发送相关。
     * @param event
     */
    @EventListener(MqttMessageDeliveredEvent.class)
    public void mqttMessageDeliveredEvent(MqttMessageDeliveredEvent event) {
        log.info("mqttMessageDeliveredEvent发送成功信息: date={}, info={}", new Date(), event.toString());
    }

    /**
     * 成功订阅到主题,MqttSubscribedEvent事件就会被触发(多个主题,多次触发)
     * @param event
     */
    @EventListener(MqttSubscribedEvent.class)
    public void mqttSubscribedEvent(MqttSubscribedEvent event) {
        log.info("mqttSubscribedEvent订阅成功信息: date={}, info={}", new Date(), event.toString());
    }


}

输出配置

@Slf4j
@Configuration
@EnableIntegration
public class MqttConfigurationOutBound {

    @Autowired
    private MqttConfigProp mqttConfigProp;

    @Bean
    public MqttConnectOptions mqttConnectOptionsOutBound() {
        MqttConnectOptions options = new MqttConnectOptions();
        options.setServerURIs(mqttConfigProp.getServerURIs());
        options.setUserName(mqttConfigProp.getUserName());
        options.setPassword(mqttConfigProp.getPassword());
        options.setKeepAliveInterval(mqttConfigProp.getKeepAlive());
        options.setCleanSession(mqttConfigProp.isCleanSession());
        return options;
    }
    @Bean
    public MqttPahoClientFactory mqttClientFactoryOutBound() {
        DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
        factory.setConnectionOptions(mqttConnectOptionsOutBound());
        return factory;
    }

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

    @Bean
    public MessageHandler mqttOutbound() {
        MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler(
                mqttConfigProp.getClientId()+ UUID.randomUUID().toString() + "_outbound", mqttClientFactoryOutBound());
        messageHandler.setAsync(true);
        messageHandler.setCompletionTimeout(mqttConfigProp.getTimeout());
        return messageHandler;
    }

    @Bean
    public IntegrationFlow mqttOutboundFlow() {
        return IntegrationFlows.from(mqttOutputChannel())
                .handle(mqttOutbound())
                .get();
    }


}

消息处理

@Service
@Slf4j
public class MqttHandler implements MessageHandler {

   
    @ServiceActivator(inputChannel = "mqttInputChannel")
    @Override
    public void handleMessage(Message<?> message) throws MessagingException {
        String topic = message.getHeaders().get(MqttHeaders.RECEIVED_TOPIC, String.class);
        log.info("topic:{}",topic);
        Object payload = message.getPayload();
        log.info("message info:{}",payload );       
    }
   
}

发送消息

@Component
@MessagingGateway(defaultRequestChannel = "mqttOutputChannel")
public interface MqttGateway {

    /**
     * 发送信息到MQTT服务器
     *
     * @param topic 主题
     * @param message 消息主体
     */
    @Gateway(replyTimeout = 2, requestTimeout = 200)
    void publishMqttMessageWithTopic(String message, @Header(MqttHeaders.TOPIC) String topic);

    /**
     * 发送信息到MQTT服务器
     *
     * @param topic 主题
     * @param qos 对消息处理的几种机制。
     * 0 表示的是订阅者没收到消息不会再次发送,消息会丢失。
     * 1 表示的是会尝试重试,一直到接收到消息,但这种情况可能导致订阅者收到多次重复消息。
     * 2 多了一次去重的动作,确保订阅者收到的消息有一次。
     * @param message 消息主体
     */
    @Gateway(replyTimeout = 2, requestTimeout = 200)
    void publishMqttMessageWithTopic(String message, @Header(MqttHeaders.TOPIC) String topic,@Header(MqttHeaders.QOS) int qos);
}

SpringBoot整合MQTT(MqttClient) 阅读详情

相关推荐

SpringBoot整合MQTT总结

这几天在准备面试的过程中做的一个小demo,主要是用通过SpringBoot实现一个与MQTT服务交互通信,也是看着别人的项目改的,这两个技术之前都没有接触过,希望记录一下可以分享给大家,也好久没更新了,借此机会更新一波blog。在正式的开始这个项目前还是学了一下SSM和SpringBoot的基础,上手起来不会这么的无力。期间也是查阅了很多的资料和询问了诸多大佬。!!!好了话不多说,一步步的搭建项目和原理详解就在下面了一、什么是mqtt。...

m0_54849873的博客 2155

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

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

WXY的博客 5万+

【springboot集成mqtt开发】

springboot集成mqtt

一路向北jxw 1839

物联网MQTT+SpringBoot2+Emqx万物互联消息引擎整合教程

适用人群物联网,消息,即时通讯等所有的IT从业者,快速增长工作经验人群,对教育公平,教育公益,教育爱心公益人士课程概述【物理网理论】AIoTMQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分。该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当做传感器和致动器(比如通过Twitter让房屋联网)的通信协议。【技术栈】SpringBoot2(发稿前最新版)Emqx:Mqtt3.x~Mqtt5.x均支持EMQ X BrokerEMQ X EnterpriseEMQX Dashboard【课程定位】    本课程定位是物联网的消息引擎和后端技术整合的课程,课程针对的物联网消息需求人群的小白,初,中级别,大神勿扰。

springboot集成MQTT [emqx]

1、引入相关maven依赖 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <depend

weixin_41221717的博客 3641

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

文章目录一、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】SpringBoot集成接入MQTT中间件组件的详细教程

【SpringBoot集成MQTT】SpringBoot集成接入MQTT中间件组件的详细教程

funfan的博客 2486

SpringBoot集成MQTT客户端

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

及丫丫 7686

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

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

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

CCS导入工程报错?手把手教你安装C2000编译器(附最新下载链接)

本文详细解析CCS导入工程报错的常见原因,并提供三种安装C2000编译器的解决方案(TI官网离线安装、CCS内置更新和App Center渠道)。通过版本匹配技巧和路径配置要点,帮助开发者快速解决编译器缺失问题,确保项目顺利导入和编译。

weixin_30374009的博客 660

SpringBoot 集成MQTT

MQTT 配置# 用户名# 密码# 推送信息的连接地址,如果有多个,用逗号隔开,如:tcp://127.0.0.1:61613,tcp://192.168.1.61:61613# MQTT 生产者# 连接服务器默认客户端ID# 默认的推送主题,实际可在调用接口时指定# MQTT 消费者# 连接服务器默认客户端ID# 默认的接收主题,可以订阅多个Topic,逗号分隔公司的IOT平台主要采用MQTT(消息队列遥测传输)对底层的驱动做命令下发和数据采集。

AlbenXie的博客 390

Palabos User Guide中文解读 | 第五章 | Palabos编程 (跳过了第四章Palabos-Java接口)

作者的话:本人在学习palabos时,发现国内中文资料甚少,恰好网上可以直接搜到palabos user guide这种英文资料,加之时间充裕,便打算开始翻译,翻了一节后发现这可能算侵权,就比较伤脑筋,突然想到自己写中文解读即可,便有了下面的博客。 Palabos User Guide Release 1.0 r1 Copyright © 2019 University of Geneva Jul...

Yulan Fang's notes. 2297

mqtt详细介绍及集成到springboot

mqtt详细介绍及集成到springboot

weixin_47874230的博客 1351

银河麒麟v10-arm版离线安装Portainer

银河麒麟v10-arm版离线安装Portainer

q_hsolucky的博客 3050

Vivado实战:如何用BUFGMUX_CTRL实现FPGA双时钟热切换(附时序约束模板)

本文详细介绍了如何使用Xilinx FPGA中的BUFGMUX_CTRL原语实现双时钟热切换的工业级解决方案。通过分析BUFGMUX_CTRL的核心机制、PCB布局约束和电源噪声抑制方法,提供Vivado实现全流程和时序约束模板,帮助工程师在工业自动化、车载电子等场景中提升系统可靠性。

weixin_29186249的博客 571

在Spring Boot项目中集成MQTT协议

在Spring Boot项目中集成MQTT协议,可以方便地实现与物联网设备或其他支持MQTT的系统进行通信。以下是详细的步骤和代码示例,帮助您快速完成Spring Boot与MQTT的集成。在pom.xml文件中添加必要的依赖项。我们使用作为MQTT客户端库。</</</</</</</</在或中配置MQTT相关参数,例如Broker地址、客户端ID等。

getapi的博客 3199

ST-LINK调试STM32H743必看:CubeMX工程中缺失的这行代码导致程序跑飞

本文深入剖析了使用ST-LINK调试STM32H743时,因CubeMX工程中缺失电源电压档位配置代码而导致程序跑飞或出现“Can not access memory”错误的问题。文章解释了H7系列电源与时钟耦合的核心原理,提供了具体的代码修复方案和系统化的调试排查思路,帮助开发者从根本上解决这一常见调试困境。

weixin_29191669的博客 280

SpringBoot集成MQTT

SpringBoot集成MQTT MQTT MQTT(消息队列遥测传输)是ISO标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议。国内很多企业都广泛使用MQTT作为Android手机客户端与服务器端推送消...

weixin_33884611的博客 884

【spark源码修改】hive3.1.3 spark3.5.4编译,需要修改源码,最终编译成功

【spark源码修改】hive3.1.3 spark3.5.4编译,需要修改源码,最终编译成功,附带问题分析详细过程

spark_dev的博客 1911

手把手教你学Simulink--基于电能质量与无功补偿的场景实例:统一电能质量调节器(UPQC)的联合控制仿真

在现代电力系统中,电能质量问题有源电力滤波器(APF)→ 治理谐波与无功动态电压恢复器(DVR)→ 补偿电压暂降/暂升静止无功发生器(SVG)→ 无功补偿与电压支撑而统一电能质量调节器(Unified Power Quality Conditioner, UPQC)是一种集串联补偿与并联补偿于一体的全能型电能质量治理装置✅ 电压类问题:暂降、暂升、不平衡、闪变✅ 电流类问题:谐波、无功、三相不平衡✅ 实现双向有功交换(储能型)串联单元(DVR功能):串联于线路,控制电源侧电压质量并联单元。

MHD0815的博客 236

消息通讯——springboot集成MQTT

目录springboot集成MQTT设计springboot集成MQTT步骤1. 引入pom依赖2. application.properties3. MqttConfiguration.java4. MyMQTTClient.java5. MyMQTTCallback.java6. MqttMsg.java7. MqttController.java8. mqttws31.js9. test.html集成后效果demo源代码 MQTT基本使用查看上一篇文章:消息通讯——MQTT的入门和使用 springb

不愿意做鱼的小鲸鱼の博客 925

R语言基于机器学习三分类结果、计算三分类混淆矩阵、计算每一个类别对应的特异度(specificity)、灵敏度(sensitivity)、PPV、NPV

R语言基于机器学习三分类结果、计算三分类混淆矩阵、计算每一个类别对应的特异度(specificity)、灵敏度(sensitivity)、PPV、NPV

data+scenario+science+insight 644

【MQTT】SpringBoot集成MQTT

计划梳理MQTT集成至Java、Vue的系列文档,详见收录专栏。该示例文章,已将相关方法封装至工具类,已实现断线重连,已将相关参数提取至配置文件。

qq_41306795的博客 2770

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

上一篇: js的 var let const 的区别
下一篇: mysql UNION 和 UNION ALL 区别
一直到老到直一
博客等级 码龄10年 386粉丝 119原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值