SpringBoot整合MQTT:后端订阅设备数据、解析传感器报文

发布时间:2026/10/23 20:46:47

SpringBoot整合MQTT:后端订阅设备数据、解析传感器报文 SpringBoot整合MQTT后端订阅设备数据、解析传感器报文作者黒漂技术佬前面几篇文章都是在讲 MQTT 协议本身和硬件端的事情。现在该轮到后端程序员出场了——设备把数据发到了 MQTT Broker咱们的后端服务怎么把它接住这篇就手把手带你用 SpringBoot 整合 MQTT实现订阅传感器数据、解析报文、存入库的全流程。一、方案选型用哪个 MQTT 客户端库Java 生态里搞 MQTT 主要有两个选项方案说明推荐度org.eclipse.paho.client.mqttv3Eclipse Paho 原生客户端功能完整但偏底层⭐⭐⭐spring-integration-mqttSpring 官方集成方案基于 Paho 封装与 Spring 生态无缝对接⭐⭐⭐⭐⭐强烈推荐spring-integration-mqtt。理由很简单你已经在用 SpringBoot 了何必再从底层写一堆连接管理、线程池、异常处理的代码Spring Integration 把 MQTT 客户端包装成了 Spring 的MessageChannel和MessageHandler和你写 Controller 一个味儿。二、引入依赖和配置2.1 pom.xml!-- MQTT 核心依赖 --dependencygroupIdorg.springframework.integration/groupIdartifactIdspring-integration-mqtt/artifactId/dependency!-- JSON 处理 --dependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-databind/artifactId/dependencySpringBoot 的spring-boot-starter-integration会自动拉取 Integration 核心所以不需要额外引入。2.2 application.ymlmqtt:broker-url:tcp://192.168.1.100:1883client-id:${spring.application.name}-${random.value}username:adminpassword:admin123# 订阅的Topic列表topics:-agriculture///sensor/## QoS级别qos:1# 超时和心跳配置completion-timeout:3000keep-alive-interval:60# 是否异步发送async:trueclient-id里加了随机值是为了支持多实例部署——两个相同 client-id 的连接会互相踢下线你肯定不想这样。三、MQTT 配置类下面是一个可直接用于生产的 MQTT 配置类40行左右ConfigurationIntegrationComponentScanpublicclassMqttConfig{Value(${mqtt.broker-url})privateStringbrokerUrl;Value(${mqtt.client-id})privateStringclientId;Value(${mqtt.username})privateStringusername;Value(${mqtt.password})privateStringpassword;Value(${mqtt.completion-timeout})privateintcompletionTimeout;Value(${mqtt.keep-alive-interval})privateintkeepAliveInterval;Value(#{${mqtt.topics}.split(,)})privateListStringtopics;Value(${mqtt.qos})privateintqos;// ① 连接配置BeanpublicMqttConnectOptionsmqttConnectOptions(){MqttConnectOptionsoptionsnewMqttConnectOptions();options.setServerURIs(newString[]{brokerUrl});options.setUserName(username);options.setPassword(password.toCharArray());options.setCleanSession(false);// 持久会话options.setAutomaticReconnect(true);// 自动重连options.setKeepAliveInterval(keepAliveInterval);options.setConnectionTimeout(10);returnoptions;}// ② 客户端工厂BeanpublicMqttPahoClientFactorymqttClientFactory(){DefaultMqttPahoClientFactoryfactorynewDefaultMqttPahoClientFactory();factory.setConnectionOptions(mqttConnectOptions());returnfactory;}// ③ 入站通道MQTT Broker → 应用BeanpublicMessageChannelmqttInputChannel(){returnnewDirectChannel();}// ④ 入站适配器订阅TopicBeanpublicMessageProducerinbound(){MqttPahoMessageDrivenChannelAdapteradapternewMqttPahoMessageDrivenChannelAdapter(clientId,mqttClientFactory(),topics.toArray(newString[0]));adapter.setCompletionTimeout(completionTimeout);adapter.setConverter(newDefaultPahoMessageConverter());adapter.setQos(qos);adapter.setOutputChannel(mqttInputChannel());returnadapter;}}来逐段解读一下①MqttConnectOptions就像你上网时的连接设置。setAutomaticReconnect(true)告诉 Paho「断了就自己连回来别烦我」。②MqttPahoClientFactory工厂模式负责生产 MQTT 客户端实例。Spring Integration 内部会用它来创建连接。③DirectChannelSpring Integration 的消息通道简单理解就是一个「管道」消息从这里流进来。④MqttPahoMessageDrivenChannelAdapter入站适配器负责订阅 Topic把收到的消息灌入mqttInputChannel。topics.toArray(new String[0])支持多 Topic 订阅比如同时订阅温湿度 Topic 和光照 Topic。四、消息接收处理器配置写好了现在接收消息ComponentpublicclassSensorDataHandler{ServiceActivator(inputChannelmqttInputChannel)publicvoidhandleMessage(Message?message){// 获取 TopicStringtopic(String)message.getHeaders().get(MqttHeaders.RECEIVED_TOPIC);// 获取 Payload消息体Stringpayload(String)message.getPayload();System.out.printf([收到消息] Topic: %s%n,topic);System.out.printf([消息内容] %s%n,payload);// 解析JSONtry{SensorDatadataparseSensorData(topic,payload);processSensorData(data);}catch(Exceptione){System.err.println(消息解析失败: e.getMessage());}}/** * 根据Topic路由到不同的解析逻辑 */privateSensorDataparseSensorData(Stringtopic,Stringpayload)throwsException{ObjectMappermappernewObjectMapper();if(topic.contains(/temperature)){returnmapper.readValue(payload,TemperatureData.class);}elseif(topic.contains(/humidity)){returnmapper.readValue(payload,HumidityData.class);}elseif(topic.contains(/light)){returnmapper.readValue(payload,LightData.class);}thrownewIllegalArgumentException(Unknown topic: topic);}privatevoidprocessSensorData(SensorDatadata){// 1. 数据校验if(!data.isValid()){log.warn(数据异常已丢弃: {},data);return;}// 2. 业务处理存库、告警、转发等sensorDataService.save(data);// 3. 实时推送WebSocket通知前端大屏webSocketService.push(data);}}ServiceActivator(inputChannel mqttInputChannel)这行是核心。它告诉 Spring「MQTT 来的消息从mqttInputChannel这个管道流过来交给handleMessage方法处理」。Spring Integration 的Message?对象封装了消息的 Header元数据和 Payload消息体。从 Header 里可以拿到 Topic、QoS、是否 Retained 等信息。五、消息发布后端向设备发指令光收不发怎么行咱们还得给设备下发控制指令开风机、关水泵之类的ServicepublicclassMqttCommandService{AutowiredprivateMqttPahoClientFactorymqttClientFactory;Value(${mqtt.client-id}-outbound)privateStringoutboundClientId;/** * 发送控制指令到指定设备 */publicvoidsendCommand(StringdeviceId,Stringcommand,MapString,Objectparams){StringtopicString.format(agriculture/%s/command,deviceId);CommandMessagemsgnewCommandMessage();msg.setCommand(command);msg.setParams(params);msg.setTimestamp(System.currentTimeMillis());StringpayloadnewObjectMapper().writeValueAsString(msg);// 创建出站处理器MqttPahoMessageHandlerhandlernewMqttPahoMessageHandler(outboundClientId,mqttClientFactory);handler.setDefaultTopic(topic);handler.setDefaultQos(1);// 至少一次送达// 发送handler.handleMessage(MessageBuilder.withPayload(payload).build());}}注意出站适配器的clientId和入站的不能一样否则会冲突。这里加了-outbound后缀来区分。六、连接异常处理农业生产环境不如机房稳定MQTT 连接偶尔会断开。我们需要感知并处理这种状况BeanpublicMqttPahoClientFactorymqttClientFactory(){DefaultMqttPahoClientFactoryfactorynewDefaultMqttPahoClientFactory();MqttConnectOptionsoptionsmqttConnectOptions();// 方式一Paho 自带的自动重连推荐options.setAutomaticReconnect(true);// 重连间隔从 1 秒开始最大 30 秒options.setMaxReconnectDelay(30000);factory.setConnectionOptions(options);returnfactory;}/** * 方式二自定义回调监听连接状态更灵活 */ComponentpublicclassMqttConnectionListenerimplementsMqttCallbackExtended{OverridepublicvoidconnectComplete(booleanreconnect,StringserverURI){if(reconnect){// 重连成功处理离线期间积压的业务log.info(MQTT 重连成功: {},serverURI);sensorService.syncOfflineData();}else{log.info(MQTT 首次连接成功: {},serverURI);}}OverridepublicvoidconnectionLost(Throwablecause){log.error(MQTT 连接断开: {},cause.getMessage());// 可以在这里触发告警通知}OverridepublicvoidmessageArrived(Stringtopic,MqttMessagemessage){// 这个回调由 Paho 原生 API 触发// 用 Spring Integration 的话消息走 ServiceActivator这里不需要处理}}七、多 Topic 订阅与消息分发智慧农业场景下后端通常要同时订阅十几个 Topic。如果全堆在一个 Handler 里代码必然变成一锅粥。这时候策略模式就派上用场了// 定义处理器接口publicinterfaceTopicHandler{booleansupports(Stringtopic);voidhandle(Stringtopic,Stringpayload);}// 温度处理器ComponentpublicclassTemperatureHandlerimplementsTopicHandler{publicbooleansupports(Stringtopic){returntopic.contains(/temperature);}publicvoidhandle(Stringtopic,Stringpayload){// 温度相关处理}}// 湿度处理器ComponentpublicclassHumidityHandlerimplementsTopicHandler{publicbooleansupports(Stringtopic){returntopic.contains(/humidity);}publicvoidhandle(Stringtopic,Stringpayload){// 湿度相关处理}}// 统一分发器ComponentpublicclassMessageDispatcher{privatefinalListTopicHandlerhandlers;publicMessageDispatcher(ListTopicHandlerhandlers){this.handlershandlers;}publicvoiddispatch(Stringtopic,Stringpayload){for(TopicHandlerhandler:handlers){if(handler.supports(topic)){handler.handle(topic,payload);return;}}log.warn(未找到匹配的处理器: {},topic);}}Spring 会自动扫描所有实现了TopicHandler的 Bean注入到MessageDispatcher。后续新增传感器类型只需新增一个 Handler 类完全符合开闭原则——对扩展开放对修改关闭。总结SpringBoot 整合 MQTT 的关键步骤就三步配置连接参数 → 定义消息通道 → 绑定处理器。Spring Integration 帮你屏蔽了连接管理、线程调度、异常重试这些脏活累活你就可以专心写业务逻辑。记住几个容易踩的坑多实例部署时clientId必须唯一入站和出站不能用同一个clientIdsetCleanSession(false)配合setAutomaticReconnect(true)才是弱网环境的正确打开方式
延伸阅读

更多相关文章

2026/10/23 20:46:18

前端工程原型如何补齐稳定性边界

前端工程原型如何补齐稳定性边界将 Vue3 响应式系统接入大模型流式 SSE(Server-Sent Events)推送时,若更新频率过高,页面可能出现卡顿。 即使只是持续追加文本,也可能让输入和滚动变慢。是否由响应式更新引起&#xff…

2026/10/17 23:25:12

研发流程自动化

研发流程自动化先确认范围 流程自动化先从构建、测试和发布记录的衔接处开始,不急着把所有决策交给模型。 记录可复查的依据 每个步骤都应声明输入、产物、失败处理和负责人;版本变化时,旧记录只能参考,不能直接复用结论。 用小范…

2026/10/22 23:56:35

Django实战:开发停车场预约计费系统的完整指南

简介:本资源是一套基于Python Django框架开发的停车场预约与计费系统完整源码案例,面向Web开发初学者及Django进阶学习者,聚焦真实业务场景中的用户管理、车位调度、动态计费与在线支付等核心功能实现。压缩包共2000个文件,含1632…

2026/10/23 20:41:44

麦语言函数实战避坑指南:REF、#IMPORT与L2盘口的正确用法

简介:本资源是文华财经官方麦语言函数手册的完整整理版,面向量化交易初学者、程序化策略开发者及期货/证券技术分析人员,解决麦语言函数调用不熟、参数理解不清、高频数据引用困难等核心问题。手册系统涵盖历史价格引用(CLOSE/HIG…

2026/10/23 20:41:44

WPF+Socket六轴机器人通讯调试器:粘包拆包与心跳保活

简介:围绕机器人通信调试场景整理的WPF与Socket实战代码包,面向自动化、物联网及机器人上位机开发的初中级人员,用于理解TCP服务器如何监听端口、接受机器人客户端连接、异步收发数据并在桌面界面中实时呈现交互结果。压缩包共38个文件、约70…

2026/10/23 20:41:44

GROMACS蛋白-小分子模拟NPT崩溃排查与全流程闭环方案

简介:本资源是一份面向计算生物学初学者与进阶研究者的GROMACS分子动力学模拟系统性学习笔记,聚焦蛋白质-小分子复合物在溶剂化环境下的NPT平衡模拟全流程,涵盖力场选择(AMBER/OPLS-AA/GROMOS等)、结构预处理&#xff…

2026/10/23 20:41:44

Aspose.Cells for Java 8.9.0 环境搭建与无水印导出实战

简介:本资源为 Aspose.Cells for Java 8.9.0 的破解版本,面向需要在 Java 项目中处理 Excel 文件的开发者,尤其适合使用 JDK 6.0 环境、希望免除水印与使用时间限制的技术人员。压缩包共 11 个文件,约 5.9MB,包含核心 …

2026/10/23 20:36:42

C#图表控件EeceChart源码解析:GDI+自绘与实时曲线优化

简介:EeceChart.zip 是一份面向 C# 开发者与数据分析初学者的实战项目源码,聚焦 Excel 数据读取、曲线绘制与交互式图形操作。项目以 C# 为基础,结合 Microsoft Office Interop 操作工作表与单元格,完成数据遍历、随机抽样、曲线平…

2026/10/22 11:29:28

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

2026/10/23 0:02:26

Verilog实现FPGA密码锁:矩阵键盘与状态机设计实战

说实话,这几年接触了不少想入门FPGA的朋友,如果你问哪个项目能一口气把Verilog的核心基本功串起来,我通常会推荐电子密码锁。这个项目看着不起眼,却把矩阵键盘扫描、按键消抖、状态机设计、动态显示刷新、外设控制这些数字逻辑里的…

2026/10/23 0:02:26

数据服务监控运维实战:从指标体系到告警治理与故障排查

周末凌晨两点,手机震了。第一反应是“数据服务挂了”。打开电脑看了下,果然,某张核心报表的数据产出时间已经超过SLA两小时,下游三个业务方连着发来问询。这种场景,做过大数据运维的人都不会陌生。数据服务的监控与运维…

2026/10/23 0:02:26

FreeRTOS任务通知实战详解:内核原理、API与避坑指南

裸机编程切到RTOS之后,任务之间的通信和同步永远是躲不开的坎。前面聊过队列、信号量、互斥锁、事件组,这次把FreeRTOS任务通知(Task Notification)单独拎出来讲透。原因很简单:任务通知是FreeRTOS里最容易用错、也最容…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑