SpringBoot集成MQTT协议

简介

MQTT 可以被解释为一种低开销,低带宽占用的即时通讯协议,可以用较少的代码和带宽为远程设备连接提供实时可靠的消息服务,它适用于硬件性能低下的远程设备以及网络状况糟糕的环境下,因此 MQTT 协议在 IoT(Internet of things,物联网),小型设备应用,移动应用等方面有较广泛的应用。

优点:代码量少,开销低,带宽占用小,即时通讯协议。

MQTT原理

实现mqtt协议需要客户端和服务器端通讯完成,在通讯中,mqtt协议中有三种身份:发布者(publish),代理(broker)(服务器),订阅者(subscribe)。其中,消息的发布者和订阅者都是客户端。消息代理是服务器,消息发布者可以同时是订阅者,传输过程如下如所示。

image.png

有别于传统的客户端/服务器通讯协议,MQTT协议并不是端到端的,消息传递通过代理,包括会话(session)也不是建立在发布者和订阅者之间,而是建立在端和代理之间。代理解除了发布者和订阅者之间的耦合。

除了发布者和订阅者之间传递普通消息,代理还可以为发布者处理保留消息和遗愿消息,并可以更改服务质量(QoS)等级。

MQTT主题

1、主题层级分隔符“/”

用于分割主题的每个层级,为主题名提供一个分层结构。如主题:

china/anhui
china/anhui/hefei

2、多层通配符“#”

用于匹配主题中任意层级的通配符。如主题:china/#

china/anhui
china/anhui/hefei
china/anhui/hefei/shushan

3、单层通配符“+”

加号是只能用于单个主题层级匹配的通配符。如主题:

china/+      只能匹配 china/anhui
china/+/+/shushan     能匹配china/anhui/hefei/shushan

4、通配符“$”

通配符“$”表示匹配一个字符,只要不是放在主题的最开头,即:

$xx
/$xx
/xx$

实战应用

对接协议部分内容

image.png

SpringBoot集成Mqtt协议

本篇文章就不重点介绍MQTT相关的内容了,主要学会怎么运用到实际开发工作中。

  1. 添加依赖
<dependency><groupId>org.springframework.integration</groupId><artifactId>spring-integration-mqtt</artifactId>
</dependency>
  1. 添加配置类
@Configuration
@ConfigurationProperties(prefix="spring.mqtt")
public class MqttProperties {private String url;private String username;private String password;private String clientId;public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}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 getClientId() {return clientId;}public void setClientId(String clientId) {this.clientId = clientId;}
}
@Configuration
@ConditionalOnBean(MqttProperties.class)
public class MqttConfiguration {@Autowiredprivate MqttProperties mqttProperties;@Autowiredprivate MqttMessageHandler mqttMessageHandler;/*** 创建MqttPahoClientFactory,设置MQTT Broker连接属性,如果使用SSL验证,也在这里设置。** @return factory*/@Beanpublic MqttPahoClientFactory mqttClientFactory() {DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();MqttConnectOptions options = new MqttConnectOptions();// 设置代理端的URL地址,可以是多个options.setServerURIs(new String[]{mqttProperties.getUrl()});options.setUserName(mqttProperties.getUsername());options.setPassword(mqttProperties.getPassword().toCharArray());options.setKeepAliveInterval(120);factory.setConnectionOptions(options);return factory;}/*** 入站通道*/@Beanpublic MessageChannel mqttInputChannel() {return new DirectChannel();}/*** 入站*/@Beanpublic MessageProducer inbound() {// Paho客户端消息驱动通道适配器,主要用来订阅主题MqttPahoMessageDrivenChannelAdapter adapter = new MqttPahoMessageDrivenChannelAdapter(mqttProperties.getClientId() + "-consumer",mqttClientFactory(),MqttConstants.UP_DEVICE_STATE,MqttConstants.UP_DEVICE_STATUS,MqttConstants.UP_DEVICE_EVENT,MqttConstants.UP_DEVICE_SET_ACK,MqttConstants.UP_DEVICE_GET_ACK,MqttConstants.UP_DEVICE_CAPTURE_REPORT,MqttConstants.UP_DEVICE_CONTROL_QUERY_ACK,MqttConstants.UP_DEVICE_CONTROL_ACK);// Paho消息转换器DefaultPahoMessageConverter defaultPahoMessageConverter = new DefaultPahoMessageConverter();adapter.setConverter(defaultPahoMessageConverter);adapter.setCompletionTimeout(5000);// 设置QoSadapter.setQos(1);adapter.setOutputChannel(mqttInputChannel());return adapter;}/*** ServiceActivator注解表明:当前方法用于处理MQTT消息,inputChannel参数指定了用于消费消息的channel。** @return*/@Bean@ServiceActivator(inputChannel = "mqttInputChannel")public MessageHandler handler() {return mqttMessageHandler;}/*** 出站通道*/@Beanpublic MessageChannel mqttOutboundChannel() {return new DirectChannel();}/*** 出站*/@Bean@ServiceActivator(inputChannel = "mqttOutboundChannel")public MessageHandler outbound() {// 发送消息和消费消息Channel可以使用相同MqttPahoClientFactoryMqttPahoMessageHandler mqttPahoMessageHandler = new MqttPahoMessageHandler(mqttProperties.getClientId() + "-producer", mqttClientFactory());// 如果设置成true,即异步,发送消息时将不会阻塞。mqttPahoMessageHandler.setAsync(true);// 设置默认QoSmqttPahoMessageHandler.setDefaultQos(1);// Paho消息转换器DefaultPahoMessageConverter defaultPahoMessageConverter = new DefaultPahoMessageConverter();mqttPahoMessageHandler.setConverter(defaultPahoMessageConverter);return mqttPahoMessageHandler;}
}
  1. 消息处理类
@Service
public class MqttMessageHandler implements MessageHandler {private final Logger logger = LoggerFactory.getLogger(MqttMessageHandler.class);@Overridepublic void handleMessage(Message<?> message) throws MessagingException {try {String payload = message.getPayload().toString();String topic = message.getHeaders().get("mqtt_receivedTopic").toString();logger.info("接受来自mqtt的订阅信息,topic:{}", topic);//离线上报if (topic.matches(".+/offline")) {statusReport(payload);}//状态上报else if (topic.matches(".+/status")) {deviceInfoReport(payload);} //事件上报else if (topic.matches(".+/eventReport")) {eventReport(payload);} else {logger.info("主题topic:{},负载payload:{}", topic, payload);}} catch (Exception e) {logger.error("handleMessage 接受mqtt订阅消息异常:", e);}}/*** 设备状态上报** @param payload*/private void statusReport(String payload) {OfflineReport offlineReport = JSONUtil.toBean(payload, OfflineReport.class);logger.info("收到设备状态信息上报:{}", offlineReport);//...省略}//...省略}
/*** 消息发送*/
@MessagingGateway(defaultRequestChannel = "mqttOutboundChannel")
public interface MqttGateway {/*** 定义重载方法,用于消息发送** @param payload*/void sendToMqtt(String payload);/*** 指定topic进行消息发送** @param topic* @param payload*/void sendToMqtt(@Header(MqttHeaders.TOPIC) String topic, String payload);void sendToMqtt(@Header(MqttHeaders.TOPIC) String topic, @Header(MqttHeaders.QOS) int qos, String payload);void sendToMqtt(@Header(MqttHeaders.TOPIC) String topic, @Header(MqttHeaders.QOS) int qos, byte[] payload);
}

源码地址:https://gitee.com/jiangwang001/springboot/tree/master/cy-cabinet-adapter

小结

本文简单介绍了一下MQTT协议的基本知识,在实际工作中,MQTT通常应用于物联网、智能家居等设备和应用程序之间的通信。在嵌入式领域,MQTT已经占据着无法替代的分量,因为大多数的嵌入式设备,都需要这样的协议进行数据交互。

2024一起加油~

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

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

相关文章

1月3日代码随想录反转二叉树

226翻转二叉树 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a;root [2,1,3] 输出&#xff1a;[2,3,…

原生JS做别踩白块游戏

思路 创建初始一个按钮并为他添加点击监听开始创建随机方块&#xff0c;并样式_box.offsetTop speed px结合setInterval使得方块不断下移创建和删除方块的原则&#xff1a;box.offsetTop>0&#xff08;可视区上部没有方块了&#xff09;时候需要创建一行方块&#xff0c;…

江西速欣商务咨询有限公司:深度解析停息挂账,助您财务重启

停息挂账问题可能对个人或企业财务产生严重影响&#xff0c;但江西速欣商务咨询有限公司以其深度解析停息挂账的专业能力&#xff0c;致力于助您重新启动财务&#xff0c;实现财务的良性发展。 专业团队&#xff0c;深度解析挂账难题 速欣商务咨询拥有一支专业团队&#xff0c…

域名授权验证系统PHP源码,盗版追踪、双重授权和在线加密功能,附带安装教程

源码介绍 PHP域名授权验证系统是一个功能强大的系统&#xff0c;提供了多项功能来保护你的域名和软件的合法性。它包括盗版追踪、域名IP双重授权、在线加密等功能&#xff0c;同时还提供了PHP授权验证更新系统的完整版&#xff0c;方便你进行一键更新和生成自助授权。 盗版追…

【谷歌云】注册谷歌云 创建Compute Engine

文章目录 一、Google Cloud注册1.1 账号信息1.2 付款信息验证1.3 验证成功 二、Compute Engine创建2.1 启动Compute Engine API2.2 创建实例2.3 新建虚拟机实例2.4 等待实例创建完成2.5 查看虚拟机配置信息2.6 创建防火墙规则2.7 SSH远程连接虚拟机 三、参考链接 一、Google Cl…

ChatGPT 4.0真的值得花钱买入吗?

性能提升&#xff1a; ChatGPT 4.0的推出不仅意味着更先进的技术&#xff0c;还代表着更强大的性能。相较于3.5&#xff0c;4.0在处理任务时更为高效&#xff0c;响应更迅速。 更智能的理解&#xff1a; 随着版本的升级&#xff0c;ChatGPT 4.0对语境的理解能力得到了进一步的…

集群部署篇--Redis 集群动态伸缩

文章目录 前言一、redis 节点的添加1.1 redis 的实例部署&#xff1a;1.2 redis 节点添加&#xff1a;1.3 槽位分配&#xff1a;1.4 添加从节点&#xff1a; 二、redis 节点的减少2.1 移除主节点2.1.1 迁移槽位2.1.1 删除节点&#xff1a; 三、redis 删除节点的重新加入3.1 加入…

odoo17 | 用户界面的基本交互

前言 现在我们已经创建了我们的新模型及其 相应的访问权限&#xff0c;是时候了 与用户界面交互。 在本章结束时&#xff0c;我们将创建几个菜单以访问默认列表 和窗体视图。 数据文件 &#xff08;XML&#xff09; Odoo在很大程度上是数据驱动的&#xff0c;因此模块定义的…

深度学习MLP_实战演练使用感知机用于感情识别_keras

目录 &#xff08;1&#xff09;why deep learning is game changing?&#xff08;2&#xff09;it all started with a neuron&#xff08;3&#xff09;Perceptron&#xff08;4&#xff09;Perceptron for Binary Classification&#xff08;5&#xff09;put it all toget…

跨年烟花-Html5实现_附完整源码【可直接运行】

文章目录 &#x1f37b;前言&#x1f538;目录结构⚫完整源码&#x1f535;源码分析&#x1f4ae;注意事项 &#x1f488;总结 &#x1f37b;前言 随着科技的进步和互联网的普及&#xff0c;人们对于跨年庆祝的方式也在不断变化。传统的烟花燃放虽然美丽&#xff0c;但存在环境…

【华为机试】2023年真题B卷(python)-金字塔-微商的收入

一、题目 题目描述&#xff1a; 微商模式比较典型&#xff0c;下级每赚 100 元就要上交 15 元&#xff0c;给出每个级别的收入&#xff0c;求出金字塔尖上的人收入。 二、输入输出 输入描述; 第一行输入N&#xff0c;表示有N个代理商上下级关系。 接下来输入N行&#xff0c;每行…

Windows—常用DOS命令

解释&#xff1a;DOS命令即面向磁盘的操作命令 进入DOS页面&#xff1a;快捷键“winR”&#xff0c;输入cmd help命令 help 【命令名】可查看其他命令的解释&#xff0c;直接输入help也可以查看部分命令 另外&#xff0c;如果输入help显示help不是内部或外部命令&#xff0c;…

帮企10合一万能分销商城源码系统:全开源可二开,全端覆盖+完整的代码包以及搭建教程

电商市场的竞争日益激烈&#xff0c;越来越多的企业开始意识到分销商城的重要性。然而&#xff0c;市面上的分销商城系统往往存在着功能单一、扩展性差等问题&#xff0c;无法满足企业的多样化需求。今天来给大家分享一款10合一万能分销商城源码系统。 以下是部分代码示例&…

多技术融合在生态系统服务功能社会价值评估中的应用及论文写作、拓展分析

生态系统服务是人类从自然界中获得的直接或间接惠益&#xff0c;可分为供给服务、文化服务、调节服务和支持服务4类&#xff0c;对提升人类福祉具有重大意义&#xff0c;且被视为连接社会与生态系统的桥梁。自从启动千年生态系统评估项目&#xff08;Millennium Ecosystem Asse…

three.js: gltf模型设置发光描边

效果&#xff1a; 代码 &#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div><div style"padding: 10px…

TPS5430正负电源模块

TPS5430正负电源模块 Chapter1 TPS5430正负电源模块一、芯片重要参数二、tps5430参考电路讲解以及PCB布局1.正压降压&#xff08;15V转12V&#xff09;2.正压降负压&#xff08;15V转-12V&#xff09; Chapter2 使用tps5430制作正负DC-DC降压电源&#xff0c;tps7a47和tps7a33制…

vue3按钮点击频率控制

现有一个按钮&#xff0c;如下图 点击时 再次点击 刷新窗口再次点击 刷新窗口依然可以实现点击频率控制。 代码实现&#xff1a; <template><!--<el-config-provider :locale"locale"><router-view/></el-config-provider>--><el…

7-验证码识别

文章目录 验证码识别1、验证码的用途和分类验证码的作用验证身份验证行为 验证码的类型静态验证码&#xff1a;图片验证码问答式验证码问答式验证码行为式验证码&#xff1a;点击行为式验证码&#xff1a;拖动间接式验证码&#xff1a;短信、邮件、语音电话无感验证码 2、验证码…

Django 分页(表单)

目录 一、手动分页二、分页器分页 一、手动分页 1、概念 页码&#xff1a;很容易理解&#xff0c;就是一本书的页码每页数量&#xff1a;就是一本书中某一页中的内容&#xff08;数据量&#xff0c;比如第二页有15行内容&#xff09;&#xff0c;这 15 就是该页的数据量 每一…

报表生成器FastReport .Net用户指南:带图表的报告(图表编辑器)

FastReport .Net是一款全功能的Windows Forms、ASP.NET和MVC报表分析解决方案&#xff0c;使用FastReport .NET可以创建独立于应用程序的.NET报表&#xff0c;同时FastReport .Net支持中文、英语等14种语言&#xff0c;可以让你的产品保证真正的国际性。 FastReport.NET官方版…