解密Spring Integration MQTT:从消息通道到动态代理的完整链路解析

Spring整合mqtt原理分析 Spring整合Mqtt原理分析 阅读详情

解密Spring Integration MQTT:从消息通道到动态代理的完整链路解析

在构建现代分布式系统,特别是物联网(IoT)和实时数据流处理应用时,消息中间件扮演着至关重要的角色。MQTT协议以其轻量级、低带宽消耗和发布/订阅模式,成为连接海量设备与后端服务的首选。对于Java开发者而言,Spring框架生态提供了强大的企业级集成能力,而Spring Integration模块则将这种能力延伸到了消息驱动架构的各个角落。

然而,仅仅在Spring Boot项目中引入spring-integration-mqtt依赖,配置几个@Bean,然后调用MqttGateway接口发送消息,这背后究竟发生了什么?一个简单的sendToMqtt方法调用,是如何穿越Spring的抽象层,最终变成一条通过网络传输的MQTT协议报文?对于追求技术深度和系统稳定性的中高级开发者来说,理解这条完整的调用链路,不仅是满足好奇心,更是进行高效问题排查、性能调优和定制化扩展的基石。

本文将带你深入Spring Integration for MQTT的内部世界,摒弃简单的API使用教程,聚焦于从接口声明、动态代理创建、消息通道路由,到最终消息分发的完整流程。我们将剖析GatewayProxyFactoryBean、MessageDispatcher、ServiceActivator等核心组件如何协同工作,揭示Spring如何将声明式的编程模型转化为高效的运行时行为。无论你是正在设计高并发的物联网平台,还是希望深入理解Spring Integration的设计哲学,这篇文章都将为你提供一幅清晰的内部架构图。

1. 入口:@MessagingGateway与动态代理的诞生

当我们定义一个看似简单的接口,并加上@MessagingGateway注解时,Spring Integration的魔法便开始了。这个注解是连接业务逻辑与消息基础设施的桥梁。

@Component
@MessagingGateway(defaultRequestChannel = "mqttOutboundChannel")
public interface MqttGateway {
    void sendToMqtt(String data, @Header(MqttHeaders.TOPIC) String topic);
}

关键在于@IntegrationComponentScan注解。它并不像普通的@ComponentScan那样仅仅寻找带有@Component的类。它的核心职责是扫描被@MessagingGateway标记的接口,并为其注册一个特殊的Bean定义。

扫描过程由IntegrationComponentScanRegistrar处理。这个类实现了ImportBeanDefinitionRegistrar接口,允许在Bean定义注册阶段进行编程式干预。它内部维护了一个映射表,将特定注解类型(如@MessagingGateway)与对应的注册器(MessagingGatewayRegistrar)关联起来。

当扫描器发现一个带有@MessagingGateway的接口(例如我们的MqttGateway)时,并不会直接将该接口实例化为一个普通的Bean。相反,MessagingGatewayRegistrar会为这个接口创建一个BeanDefinition,其Bean类被指定为GatewayProxyFactoryBean。

GatewayProxyFactoryBean是一个FactoryBean,这意味着从Spring容器中获取名为mqttGateway的Bean时,实际得到的是GatewayProxyFactoryBean.getObject()方法返回的对象。这个方法的核心逻辑在onInit()中:

protected void onInit() {
    synchronized (this.initializationMonitor) {
        // this.serviceInterface 就是我们定义的 MqttGateway 接口
        // this 本身作为 MethodInterceptor(方法拦截器)
        this.serviceProxy = new ProxyFactory(this.serviceInterface, this).getProxy(this.beanClassLoader);
    }
}

这里创建了一个JDK动态代理(如果接口有实现类,则可能使用CGLIB)。代理的目标接口是MqttGateway,而拦截器(InvocationHandler)就是GatewayProxyFactoryBean自身。因此,当我们调用mqttGateway.sendToMqtt(“hello”, “first_topic”)时,实际上调用的是代理对象的方法,这个调用会被拦截,并路由到GatewayProxyFactoryBean.invoke(MethodInvocation invocation)方法。

这个过程的意义在于:它将一个纯粹的Java接口调用,无缝地转换成了一个消息发送请求。开发者无需关心底层的连接管理、线程池或序列化细节,只需面向接口编程。这种设计是Spring非侵入式理念的完美体现,也是其集成框架强大扩展性的基础。

提示:GatewayProxyFactoryBean同时也是一个AbstractEndpoint(端点),这意味着它具备生命周期管理能力(如start(), stop()),可以优雅地集成到Spring的应用上下文生命周期中。

2. 消息的征途:从代理调用到消息通道

当代理拦截到方法调用后,旅程进入第二阶段:将方法调用转化为Spring消息(Message),并将其投递到正确的通道(MessageChannel)。

在GatewayProxyFactoryBean.invokeGatewayMethod方法中,框架会根据被调用的具体方法(本例中是sendToMqtt),找到对应的MethodInvocationGateway。这个对象封装了方法元数据以及通过注解(如@MessagingGateway(defaultRequestChannel = “mqttOutboundChannel”))配置的默认请求通道。

随后,调用进入其父类MessagingGatewaySupport的send(Object object)方法。这里的关键操作是获取请求通道:

protected void send(Object object) {
    MessageChannel channel = getRequestChannel(); // 获取名为"mqttOutboundChannel"的通道
    try {
        this.messagingTemplate.convertAndSend(channel, object, this.historyWritingPostProcessor);
    }
    // ... 异常处理
}

getRequestChannel()方法会从应用上下文中查找ID为mqttOutboundChannel的MessageChannel Bean。这个Bean通常在我们的配置类中定义:

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

DirectChannel是Spring Integration中最常用的通道实现之一。它的特点是点对点(Point-to-Point) 且在同一线程内完成发送与接收,适用于大多数需要进行方法调用的场景。消息通过MessagingTemplate发送到该通道。

MessagingTemplate.convertAndSend(…)方法会将要发送的对象(即我们方法中的String data参数)包装成一个Message对象。这个Message包含两部分:

  • Payload(负载):即data参数的值(“hello”)。
  • Headers(头信息):一个Map结构,包含了诸如消息ID、时间戳以及通过@Header注解指定的元数据(例如MqttHeaders.TOPIC对应的”first_topic”)。

至此,一个方法调用已经成功转变为一个标准的Spring Message对象,并准备进入通道进行传输。下表概括了此阶段的关键转换:

阶段输入输出关键组件
接口调用mqttGateway.sendToMqtt(“hello”, “first_topic”)动态代理方法调用GatewayProxyFactoryBean, JDK/CGLIB Proxy
消息转换方法参数、@Header注解Spring Message对象MessagingGatewaySupport, MessagingTemplate
通道寻址@MessagingGateway注解的defaultRequestChannel属性具体的MessageChannel Bean引用DirectChannel

3. 通道内的调度:MessageDispatcher与消息路由

消息进入DirectChannel后,并非直接到达最终的处理者。DirectChannel内部持有一个核心组件:MessageDispatcher(消息分发器)。对于DirectChannel,其默认使用的分发器是UnicastingDispatcher(单播分发器)。

UnicastingDispatcher的职责是,将接收到的一条消息,分发给一个合适的MessageHandler(消息处理器)。它的dispatch(Message<?> message)方法是路由逻辑的核心:

private boolean doDispatch(Message<?> message) {
    // 1. 尝试优化分发(例如,当只有一个处理器时直接调用)
    if (tryOptimizedDispatch(message)) {
        return true;
    }
    boolean success = false;
    // 2. 获取所有已订阅此通道的MessageHandler迭代器
    Iterator<MessageHandler> handlerIterator = getHandlerIterator(message);
    List<RuntimeException> exceptions = null;
    // 3. 遍历处理器,直到有一个成功处理
    while (!success && handlerIterator.hasNext()) {
        MessageHandler handler = handlerIterator.next();
        try {
            handler.handleMessage(message);
            success = true; // 有一个成功即退出循环
        } catch (Exception e) {
            // ... 异常收集与处理
        }
    }
    return success;
}

这里引出一个关键问题:这些MessageHandler是何时、如何注册到DirectChannel(或者说其内部的UnicastingDispatcher)的?

答案在于另一个核心注解:@ServiceActivator。回顾我们的配置:

@Bean
@ServiceActivator(inputChannel = “mqttOutboundChannel”)
public MessageHandler mqttOutbound() {
    MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler(...);
    // ... 设置QoS等参数
    return messageHandler;
}

@ServiceActivator注解的inputChannel属性明确指定了此处理器订阅的通道名为”mqttOutboundChannel”。在Spring容器启动时,@EnableIntegration注解导入的配置类会注册一个名为MessagingAnnotationPostProcessor的BeanPostProcessor。

这个后处理器会扫描所有Bean,寻找带有@ServiceActivator、@Router、@Transformer等注解的方法。对于@ServiceActivator,它会由ServiceActivatorAnnotationPostProcessor处理。处理的结果是创建一个EventDrivenConsumer实例。

EventDrivenConsumer是一个AbstractEndpoint,它封装了消息通道和消息处理器。在其启动方法doStart()中,会执行一个关键操作:this.inputChannel.subscribe(this.handler);。这行代码将处理器(我们的MqttPahoMessageHandler)订阅到了指定的输入通道(mqttOutboundChannel)。本质上,就是将处理器添加到了通道内部UnicastingDispatcher的处理器列表中。

因此,当UnicastingDispatcher调用getHandlerIterator(message)时,它获取到的正是之前通过@ServiceActivator注册到该通道的处理器列表。在我们的例子中,这个列表里只有一个处理器:MqttPahoMessageHandler。

4. 终局:协议转换与网络发送

消息经过分发,到达了最终的处理器——MqttPahoMessageHandler。这个类是Spring Integration MQTT模块中负责出站(Outbound) 通信的核心,即向MQTT Broker发布消息。

在它的handleMessageInternal(Message<?> message)方法中,主要完成两件事:

  1. 协议转换:将通用的Spring Message对象,转换为MQTT协议层的MqttMessage对象。这包括提取负载(Payload)和头信息中的主题(Topic)、QoS等级等。
  2. 网络发送:通过底层的Paho MQTT客户端库,将MqttMessage发布到指定的Broker。
@Override
protected void handleMessageInternal(Message<?> message) throws Exception {
    // 1. 转换消息:从Spring Message到MQTT消息对象
    Object mqttMessage = this.converter.fromMessage(message, Object.class);
    // 2. 处理或获取目标主题(可能从消息头或默认主题获取)
    String topic = this.topicProcessor.processMessage(message);
    // 3. 发布到MQTT Broker
    publish(topic == null ? this.defaultTopic : topic, mqttMessage, message);
}

@Override
protected void publish(String topic, Object mqttMessage, Message<?> message) throws Exception {
    // 获取或创建底层的Paho MQTT客户端 (MqttAsyncClient)
    // 并执行最终的publish操作
    IMqttDeliveryToken token = checkConnection().publish(topic, (MqttMessage) mqttMessage);
}

checkConnection()方法确保了与MQTT Broker的连接是活跃的,内部封装了连接管理、重连等逻辑。publish方法调用最终委托给Eclipse Paho库的MqttAsyncClient.publish(),这是一个异步方法,会立即返回一个IMqttDeliveryToken用于跟踪发送状态(特别是QoS 1和2级别)。

至此,从Java接口方法调用到MQTT网络报文发送的完整出站(发布)链路就清晰了:

  1. 接口调用 -> GatewayProxyFactoryBean动态代理拦截。
  2. 消息封装 -> MessagingGatewaySupport将调用参数转为Spring Message。
  3. 通道投递 -> MessagingTemplate将消息发送到指定的DirectChannel。
  4. 消息分发 -> UnicastingDispatcher将消息派发给已订阅的处理器。
  5. 协议处理 -> MqttPahoMessageHandler执行转换并调用Paho客户端。
  6. 网络传输 -> Paho客户端通过TCP/IP将MQTT协议报文发送给Broker。

5. 逆向之旅:入站消息的监听与处理

理解了出站链路,入站(订阅/消费)链路就更容易把握了。入站链路的起点是MqttPahoMessageDrivenChannelAdapter。

@Bean
public MessageProducer inbound() {
    String[] topics = {“first_topic”};
    MqttPahoMessageDrivenChannelAdapter adapter = new MqttPahoMessageDrivenChannelAdapter(
        createClientId(), mqttClientFactory(), topics);
    adapter.setOutputChannel(mqttInputChannel());
    return adapter;
}

这个适配器实现了MessageProducer接口,同时也是一个MqttCallback。它在启动后,会利用Paho客户端订阅配置的Topic。当Broker有消息到来时,Paho库会回调其messageArrived(String topic, MqttMessage mqttMessage)方法。

在这个回调方法中,适配器扮演了协议反向转换的角色:

@Override
public void messageArrived(String topic, MqttMessage mqttMessage) {
    // 将MQTT协议消息转换为Spring Message
    Message<?> message = this.getConverter().toMessage(topic, mqttMessage);
    try {
        // 发送到输出通道
        sendMessage(message);
    }
    // ... 异常处理
}

sendMessage(Message<?> message)方法内部,会通过另一个MessagingTemplate,将转换好的Spring Message发送到outputChannel(即配置中的mqttInputChannel)。此后,流程与出站链路的后半部分惊人地相似:

  1. 消息进入mqttInputChannel(一个DirectChannel)。
  2. 该通道的UnicastingDispatcher获取到消息。
  3. 分发给订阅了该通道的处理器,即我们通过@ServiceActivator(inputChannel = “mqttInputChannel”)定义的MessageHandler(那个打印消息的Lambda表达式)。

入站链路的核心在于MqttPahoMessageDrivenChannelAdapter,它作为一个事件驱动的消息生产者,将外部系统(MQTT Broker)的事件,转换并引入到Spring Integration的消息流中,从而触发后续的业务处理逻辑。

6. 核心模式与扩展思考

通过对完整链路的剖析,我们可以总结出Spring Integration处理MQTT(乃至其他协议)的核心架构模式:

  • 网关模式 (Gateway Pattern):通过@MessagingGateway和动态代理,将对接口的调用转换为消息发送,对业务代码隐藏了消息传递的复杂性。
  • 通道模式 (Channel Pattern):MessageChannel作为连接不同组件的管道,实现了生产者与消费者的解耦。DirectChannel、PublishSubscribeChannel、QueueChannel等提供了不同的通信语义。
  • 端点模式 (Endpoint Pattern):MessageProducer(如入站适配器)和MessageHandler(如出站处理器、服务激活器)是消息流的起点和终点,由MessageChannel连接。
  • 消息分发模式:MessageDispatcher是通道内部的路由引擎,决定了消息如何传递给一个或多个处理器。

基于这种清晰的分层架构,我们可以进行许多高级定制和扩展:

  • 自定义消息转换器:通过实现MessageConverter接口,可以控制Spring Message与MQTT协议消息之间的转换逻辑,例如处理复杂的二进制负载或自定义头信息。
  • 错误处理与重试:可以为通道配置ErrorMessagePublisher,或者使用RequestHandlerRetryAdvice等建议(Advice)来增强系统的容错性。
  • 流量控制与背压:对于高吞吐场景,可以使用QueueChannel配合Pollable消费者,或者集成Reactive Streams(如通过ReactiveStreamsConsumer)来实现背压。
  • 消息路由与过滤:在通道间插入Router或Filter,可以根据消息内容或头信息将消息导向不同的处理流水线。
  • 事务集成:可以将消息发送与数据库操作放在同一事务中,确保数据一致性。

理解从@MessagingGateway到MqttPahoMessageHandler的完整调用栈,最大的价值在于当问题出现时,你能清晰地知道该在哪里下断点、查看日志或增加监控。无论是消息丢失、发送延迟,还是线程阻塞,你都能沿着这条链路快速定位瓶颈所在。这种深度的理解,是将Spring Integration从“会用”提升到“精通”的关键一步。

一文读懂物联网 MQTT 协议之实战篇 那就把把 WITH_WEBSOCKETS 从 yes 改成 no 后,就可以成功编译了。改成如果你的应用不需要 websocket 协议,可以把这个参数给设置 no 关掉。如果终端出现的是这样:那么恭喜你,Mosquitto 安装成功了。 阅读详情

相关推荐

WebSocket与MQTT选型实战:工业IoT实时通信避坑指南

实时数据传输是物联网系统的核心能力,其本质是解决端到端低延迟、高可靠的消息投递问题。WebSocket提供全双工TCP隧道,适合人机交互场景,但缺乏内置可靠性机制;MQTT则是面向发布/订阅的消息中间件,具备QoS分级、遗嘱消息、会话保持等工业级保障。技术价值在于匹配不同终端能力(如ESP32-S3资源受限)、网络环境(Wi-Fi/NB-IoT)与业务SLA(≤200ms延迟、≤0.001%丢包)。典型应用场景包括工厂设备状态监控、嵌入式音频流传输、Web前端实时看板。当需求中出现'esp32s3 max9

weixin_30740581的博客 462

@MessagingGateway 无法注入--初次使用Spring integration集成mqtt填坑记录

一、背景 首次使用Spring integration集成mqtt,按照网上的各种指导文档,写完后无法启动,一直报错: Parameter 0 of constructor in com.xxxx.xxxx required a bean of type 'com.xxxx.xxxx' that could not be found. Action: Consider defining a bean of type 'com.xxxx.xxxx' in your configuration. 无法

kumubajie的博客 5408

SpringBoot实现MQTT消息发送和接收

SpringBoot实现MQTT消息发送和接收。

大猩猩的博客 1万+

springboot集成mqtt收发消息

在 Spring Boot 中使用 MQTT 可以通过集成 Eclipse Paho 或 HiveMQ 等客户端库实现。以下是完整的整合步骤,包括配置、发布和订阅消息的示例。2.1 配置文件(application.yml)3.1 创建 MQTT 消息网关。5. 测试 MQTT 功能。2.2 MQTT 配置类。4.1 配置入站通道。5.1 测试发布消息。5.2 查看订阅日志。

专注echarts开发20年 649

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

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

qq_41018959的博客 3万+

【信息科学与工程学】【数据中心】第三十五篇 云计算数据中心的学科知识04

编号学科(课程)核心知识点在云计算/云存储/云网络/云安全/云MaaS中的作用代表教材/资料/论文 + 数学方程式列表工业界应用D1421​云原生数据库:TiDB​HTAP(混合事务/分析处理)、分布式SQL、水平扩展、强一致(Raft)、自动故障恢复、与MySQL兼容、TiFlash列式引擎提供弹性扩展的分布式数据库;支撑高并发在线交易与实时分析教材:《TiDB in Action》PingCAP(2020) 论文:《TiDB: A Raft-based HTAP Database》(2017)

weixin_49199313的博客 399

maven引入mqtt

mqtt

weixin_45626078的博客 2046

【信息科学与工程学】计算机科学与自动化 第二百三十三篇 凤凰架构01

编号类型领域系统软件/硬件或系统集成方案及系统架构模块子模块函数名称/算法名称算法的数学分析及计算机体系架构及数据结构与算法详细设计及参数列表及数值范围设计关联知识1共识算法分布式基石状态机复制架构:Proposer/Acceptor/Learner 多节点角色模型,基于操作转移(Operation Transfer)分布式共识PaxosPaxos 协议(Prepare/Promise/Accept/Accepted 两阶段)数学基础:多数派(Quorum)投票,基于鸽巢原理保证 W+R>N 时读写集合必有

weixin_49199313的博客 263

智能门锁核心技术解析:掌静脉识别与物联网系统架构实战

生物识别技术通过采集人体独特的生理或行为特征进行身份认证,其核心原理在于将特征信息转化为可存储、比对的数字模板。这项技术因其安全性与便捷性,在身份验证领域展现出巨大价值,广泛应用于金融支付、门禁安防等场景。在智能家居安防领域,物联网系统架构将设备端、云端与客户端紧密连接,实现了远程管理与智能控制。本文聚焦于智能门锁这一典型应用,深入剖析其如何集成掌静脉识别这一高安全性生物识别技术,并构建稳定可靠的多功能物联网系统,涵盖从嵌入式驱动到云端服务的关键实现细节。

weixin_34372728的博客 356

最全中文停用词表(可直接复制)

最全的停用此表整理 词表名 词表文件 中文停用词表 cn_stopwords.txt 哈工大停用词表 hit_stopwords.txt 百度停用词表 baidu_stopwords.txt 机器智能实验室停用词库 scu_stopwords.txt 以上停用词表链接:https://github.com/goto456/stopwords 以下是我常用的1893个停用词,可直接复制 ! " # $ % & ' ( ) * + , - -- . .. ... ....

dilifish的博客 12万+

深入解析EXI协议在ISO15118-2命令测试中的编解码实践

本文深入探讨了EXI协议在ISO15118-2车桩通信标准中的关键作用与实践方法。EXI编解码测试是确保通信准确性与效率的核心环节,文章详细介绍了从搭建测试环境、选择工具库到编写完整测试代码的全过程,并分析了结果差异的常见原因与调试技巧,为电动汽车充电系统的开发者提供了实用的技术指南。

potato的博客 1048

Spring Integration + MQTT

Spring Integration是一个开源的Java库,用于构建基于消息的应用程序。它提供了一套丰富的组件和工具,使得开发者可以轻松地开发出可靠、灵活和可扩展的集成解决方案。Spring Integration可以用来构建企业服务总线,它支持各种协议和消息格式,使得不同系统间的数据和事件可以轻松交换。

weixin_44929475的博客 3569

Windows 10/11 零基础配置 SillyTavern 连接 Claude API 完整指南(含 Node.js 环境搭建)

本文提供Windows 10/11系统下零基础配置SillyTavern连接Claude API的完整教程,涵盖Node.js环境搭建、SillyTavern初始化及API连接配置等关键步骤。通过详细的操作指南和实用技巧,帮助用户快速搭建AI聊天界面并优化对话体验,实现与Claude AI的高效交互。

weixin_30642561的博客 134

RabbitMQ实现即时通讯居然如此简单!连后端代码都省得写了?

做任何事情都要用心,要非常关注细节。看起来不起眼的、繁琐的工作做透了会有意想不到的价值。当然要想成为一个技术大牛也需要一定的思想格局,思想决定未来你要往哪个方向去走, 建议多看一些人生规划方面的书籍,多学习名人的思想格局,未来你的路会走的更远。更多的技术点思维导图我已经做了一个整理,涵盖了当下互联网最流行99%的技术点,在这里我将这份导图分享出来,以及为金九银十准备的一整套面试体系,上到集合,下到分布式微服务《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》

Y1567409的博客 799

智能驾驶小白必看:MEB低速紧急制动系统的工作原理与传感器配置详解

本文深入解析了MEB低速紧急制动系统的工作原理与传感器配置。该系统作为智能驾驶的关键安全冗余,专为应对停车场、拥堵路段等复杂低速场景设计。文章详细拆解了其如何通过超声波雷达、环视摄像头等传感器融合感知环境,并基于碰撞时间(TTC)等模型进行风险评估与分级制动,最终实现主动防碰撞,是智能驾驶技术实用化的重要体现。

c2d3e4f的博客 1130

【图文步骤】EC-Engineer部分操作详细步骤

EC-Engineer部分功能详细使用手册

weixin_42212468的博客 6164

SpringBoot集成Mqtt发送消息

MQTT是一种物联网消息协议,为Message Queuing Telemetry Transport的缩写,即,协议基于发布订阅模式进行通信,有开销低、带宽小、轻量的特点,通常应用在物联网数据采集、移动应用、智能硬件、电力、能源等领域。

zhangyifang_009的博客 2206

82、yolov11检测模型迁移瑞芯微rk3588和使用昇腾设备300i DUO卡推理 batch=1/3,支持昇腾NMS迁移npu推理

本文介绍了使用昇腾设备进行分割推理的测试流程,包括两种测试方式(cann+onnx和om)。首先验证300iDUO卡的可用性,随后创建Docker镜像和容器以搭建独立环境。通过从指定仓库拉取Ubuntu 20.04镜像,创建容器并映射目录。进入容器后安装必要组件(Python3、GCC等)和系统工具(pciutils、net-tools等),为后续模型转换和迁移做准备。整个流程旨在构建可交付给第三方的标准化测试环境。

sxj731533730 1198

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

也是一个定义好的 Spring Boot 配置类,用于设置和管理 MQTT 客户端的发送功能,它定义了如何创建 MQTT 客户端连接、配置连接参数,并将消息发送到指定的 MQTT 主题,建立一个mqttOutBoundChannelIOT 的消息通道,用于发送消息到mqtt主题。2、在application.yml中配置好相关属性,便与后续连接地址或者是账号密码发生变化,不需要去改代码直接修改配置文件即可,由于我这边使用的是购买的mqtt服务,不是自己本地配置mqtt服务所以连接地址不一定一个模样。

PerfectOpening的博客 1778

一步步教你使用 NVIDIA 推出的全新GPU加速求解器 cuOpt:解锁超高效率的求解体验

未完成

Linshaodan520的博客 868

PCL 点云配准-ICP算法(精配准)

ICP(Iterative Closest Point)算法是一种常用的点云精细配准算法。它通过迭代计算将一组点云变换到另一组点云的最佳位置,最终实现精确的对齐。ICP算法在每次迭代中选择与目标点云最接近的点作为对应点,通过计算最小化源点云和目标点云之间的均方误差(MSE)来进行刚性变换(包括平移和旋转)。

纵马踏花向自由 1724

SpringBoot实践之---集成MQTT消息推送和消息订阅功能

       MQTT是一个轻量级的消息发布/订阅协议,它是实现基于手机客户端的消息推送服务器的理想解决方案。         实现MQTT协议的中间件有很多,我用的是Apollo服务器,如何搭建MQTT服务器,请查阅其他资料。这里,主要介绍SpringBoot2.0集成MQTT实现消息推送的功能。好,正式开始:         本文采用Gateway绑定的方式,网上也有介绍但不全面,还有其他...

luckykapok918的专栏 2万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

springboot中使用spring integeration连接MQTT

订阅消息的工具类 import cn.ac.iie.securer.bean.properties.SubscriberConfiguration; import cn.ac.iie.securer.util.AESUtil; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttConnectO...

stSahana的博客 1356

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

springboot整合mqtt

mqtt是一个轻量级的消息服务器 pom配置: &lt;dependency&gt; &lt;groupId&gt;org.springframework.integration&lt;/groupId&gt; &lt;artifactId&gt;spring-integration-mqtt&lt;/artifactId&gt; ...

龚艺洋的博客 8080

注塑机数据采集网关 ZK-D1/D3 对接 IoT 物联网平台架构与数据实践

注塑机数据采集面临设备异构、协议多样难题,ZK-D1/D3网关作为边缘层核心,实现多协议兼容与统一数据上行。通过MQTT/TLS协议将设备状态、工艺参数等数据标准化上传至IoT平台,经解析、校验后存入时序库,支撑OEE分析、工艺追溯与预测性维护等应用。关键在于设备点位规划、网关配置与平台数据建模的协同,确保数据准确、完整、可追溯,助力车间数字化转型。

专业采集注塑机数据,为mes系统提供数据服务! 415

009基于物联网的智能厨房安全监测系统

本文讲解物联网毕业设计选题《基于物联网的智能厨房安全监测系统》的实现:ESP32 搭配 MQ-2 燃气传感器采集可燃气体浓度、DHT11 采集温湿度,按浓度区分预警与危险两级做分级声光报警;危险时自动驱动常闭电磁阀切断气源,并通过 WiFi 推送告警到微信,数据上传云平台留存,隐患排除后可按键复位。内容含硬件清单与接线、传感器预热与阈值标定、分级报警与危险锁存设计、.h/.c 分离的多模块代码,并附测试验收、开题表述与答辩问答。照着做即可。

x1649545783的博客 354
上一篇: YOLOv11在边缘设备部署全攻略:Jetson Nano实测性能对比
下一篇: Airflow启停脚本优化:如何用Bash脚本一键管理WebServer与Scheduler
java5
博客等级 码龄22年 85粉丝 2103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值