MQTT之重复消息(6、在项目中遇到的问题)
项目背景:
在 Spring Boot + MQTT 5.0 环境中,RTU设备向SpringBoot平台发送心跳数据、业务监控数据。同时SpringBoot平台可以向RTU设备下发指令,RTU在执行完指令之后向平台发送响应数据。
问题一、SpingBoot平台发送指令给RTU设备,RTU设备能够收到指令也能回复信息到相应的主题。SpringBoot平台也订阅该主题,但是没有收到信息。
在遇到这个问题的时候,我发现控制台的打印出了一个ERROR日志:
2025-03-06 11:11:31.652 [MQTT Rec: TerminalB] ERROR o.s.i.m.i.MqttPahoMessageDrivenChannelAdapter:362 - Lost connection: 已断开连接; retrying...
排查思路:
1.首先需要明确哪些因素会导致出现断开连接。因为收不到消息同时伴随着ERROR日志的打印。
-
检查网络连接
确保你的设备与MQTT服务器之间的网络连接是稳定的。你可以尝试ping服务器地址或使用网络工具检查连接质量。
-
检查MQTT服务器状态
确认MQTT服务器正在运行且没有遇到任何问题。如果可能,尝试连接到服务器的其他客户端(例如另一个设备或应用程序)以验证服务器是否可用。
-
检查MQTT客户端配置
-
主机名和端口:确保客户端配置中的MQTT服务器地址和端口号是正确的。
-
客户端ID:每个客户端都应该有一个唯一的ID。确保没有两个客户端使用相同的ID连接至同一服务器。
-
用户名和密码:如果服务器启用了认证,确保提供了正确的用户名和密码。
-
清洁会话:根据你的需求设置
cleanSession
。如果是true,它将删除之前的会话信息;如果是false,它将保留会话信息。 -
检查防火墙和安全组设置
确保没有防火墙或安全组规则阻止客户端与MQTT服务器之间通信。这包括入站和出站规则。
2、SpringBoot平台订阅了很多主题的消息,比如心跳主题,业务监控主题等,之前是不会出现信息订阅不到。说明主机名和端口、用户名密码,是正确的。
3、现在还剩下三项没有排除,客户端ID、清洁会话、防火墙。因为心跳是正常的,所以说清洁会话和防火墙是没问题的,如果这两个有问题那心跳主题的信息我们平台也是收不到的。
4、目前只剩下客户端ID这个因素。现在已经大致明确了是因为这个因素导致,接下来我们需要分析一下为什么出现这个问题,之前是正常的。通过回忆实际操作,我发现SpingBoot平台订阅不到消息之前,我通过SpringBoot平台向某一台RTU设备发送了一个修改频率的指令。然后我又分析日志信息,发现当我发送消息之后,控制台出现了断开连接的错误。好,现在我把所有的操作和具体的报错信息联系在一起,问题就比较清晰了。我发送了一个指令,控制台报错:断开连接,然后RTU执行指令,然后RTU向响应主题发送消息,我们SpingBoot平台收不到了。
再把上述的问题精简一下对于SprintBoot平台其实就是两个操作,一个是平台利用MQTT发送消息,另一个就是平台利用MQTT订阅消息。当我发送完消息,平台订阅不到消息,同时出现断开连接。这个时候我就明确了错误所在,发布是一个客户端行为,订阅也是一个客户端行为,但是我们在代码里面把订阅ID和发送ID设置成了相同的,如下:
subClientId: adminpubClientId: admin
也就是平台发送指令的时候把订阅的连接顶掉了,这个时候出现了订阅断开连接的错误日志。然后RTU发送响应消息到订阅主题,但是这个时候平台的订阅已经断开链接,所以说平台一直收不到响应消息。以上就是我分析这个问题的具体思路,在此仅作个人记录,如有分析错误的地方,欢迎大家留言指导。
问题二、SpingBoot平台在启动之后,一直在重复打印一条消息,而且RTU设备并没有发送任何消息到MQTT的服务器,通过观察该消息是间隔固定的时间重复打印。
排查思路:
1、我先排查这一条消息的出处到底在哪里来的。通过对比发现,这一条是昨天RTU的消息,并不是今天的,所以说很奇怪。
2、MQTT通讯中我的平台也是一个客户端,客户端本身不存储消息,只有可能是服务器端存储。
3、前边几篇文章分析的有消息重复接受的原因,主要是消息质量为1的时候,MQTT协议本身重发导致。还有就是tcp的重发,但是在这里不存在tcp重复的因素。那只能是消息质量为1的时候,协议本身导致。
4、现在分析出主要是消息质量为1的时候导致,那就说明broker给平台发送消息的时候可能存在两种情况,第一就是broker收到多次重复消息,导致broker也给平台发送多次消息。第二、就是平台收到broker消息,但是平台没有给broker发送回复消息。
5、如果是第一种情况,那我平台正常启动,就能消费订阅的信息,就不会出现我现在这种不断重复打印的情况,所以说第一种情况排除。
6、那现在肯定是第二种情况,平台没有给broker发送响应消息。现在开始回顾代码,为什么没有发送响应消息。仔细观察代码发现,我订阅的时候使用通配符订阅了所有消息,恰好没有对RTU执行代码之后发送消息的主题进行代码处理,导致broker一直收不到我的平台反馈,所以说broker一直不断地给平台发送信息。
7、综上所述这就是我重复消息不停输出的原因。
相关文章:
MQTT之重复消息(6、在项目中遇到的问题)
项目背景: 在 Spring Boot MQTT 5.0 环境中,RTU设备向SpringBoot平台发送心跳数据、业务监控数据。同时SpringBoot平台可以向RTU设备下发指令,RTU在执行完指令之后向平台发送响应数据。 问题一、SpingBoot平台发送指令给RTU设备,RTU设备能够…...
8、linux c 信号机制
一、信号概述 1. 信号概念 信号是一种在软件层次上对中断机制的模拟,是一种异步通信方式。信号的产生和处理都由操作系统内核完成,用于在进程之间传递信息或通知某些事件的发生。 2. 信号的产生 信号可以通过以下方式产生: 按键产生&…...
Set,Map,WakeSet,WakeMap
简介 Set、Map、WeakMap 和 WeakSet 是 ES6 引入的高级数据结构,它们的底层实现和特性与传统的对象和数组有显著差异 强弱引用了解: link Set Set对象 是一种用于存储 唯一值 的可迭代集合,可存储任意类型的值(原始值、对象引用等&…...
NSSCTF(MISC)—[HITCTF 2021]PNG
相应的做题地址:https://www.nssctf.cn/problem/819 import zlib from Crypto.Cipher import AES import base64 def decode(data, key, iv): cipher AES.new(key, AES.MODE_CBC, iv) decryptByts base64.b64decode(data) msg cipher.decrypt(decryptByts) msgs…...
只出现一次的数字
这个题目动了点脑筋,由于它们时无序的,所以我们如果去找的话比较费劲,可能要循环嵌套再嵌套,所以我们先利用库中自带的sort函数进行排序,把这些数从小到大以此排列,然后我们进行判断哪个数出现了一次即可。…...
【编程中的框架】
编码中常用的框架及其使用方法和好处 框架(Framework)是一种为解决特定问题而设计的软件架构,它提供了一组预定义的组件、模式和工具,帮助开发者更高效地构建应用程序。框架通常不仅仅是方法库,它们提供了一种结构化的…...
Python-常用关键字
基础值 1. False - 意义:布尔类型假值(首字母大写) - 用法示例: if condition is False: print("条件为假") 2. True - 意义:布尔类型真值(首字母大写) - 用法示例&…...
【计算机网络】DHCP工作原理
DHCP(动态主机配置协议) Dynamic Host Configuration Protocol 基于UDP协议传输 DHCP分配IP地址的过程 (1)DHCP DISCOVER客户机请求 IP 地址: 当一个 DHCP 客户机启动时,客户机还没有 IP 地址,所以客户机要通过 DHC…...
python 原型链污染学习
复现SU的时候遇到一道python原型链污染的题,借此机会学一下参考: 【原型链污染】Python与Jshttps://blog.abdulrah33m.com/prototype-pollution-in-python/pydash原型链污染 文章目录 基础知识对父类的污染命令执行对子类的污染pydash原型链污染打污染的…...
量子计算:未来计算技术的革命性突破
在当今科技飞速发展的时代,量子计算正逐渐从理论走向实践,成为计算技术领域最具潜力的革命性突破之一。与传统计算机基于二进制的计算方式不同,量子计算利用量子比特(qubit)的叠加和纠缠特性,能够在处理复杂…...
Maven:Java项目构建与依赖管理工具
Maven 是什么 Maven 将项目开发过程和管理过程抽象成一个项目对象模型(POM),本质上是一个项目管理工具。Maven 主要用于Java项目的依赖管理、编译、测试、打包和部署等操作。 Maven的核心设计围绕标准化和自动化,通过一系列约定和…...
内积相似系数——内积度量相似系数
内积与相似系数 内积(Inner Product) 内积(Inner Product),也称为点积(Dot Product)或标量积,两个向量点积的结果是一个标量(通常是实数或复数)。 内积&…...
问题:md文档转换word,html,图片,excel,csv
文章目录 问题:md文档转换word,html,图片,excel,csv,ppt**主要职责****技能要求****发展方向****学习建议****薪资水平** 方案一:AI Markdown内容转换工具打开网站md文档转换wordmd文档转换pdfm…...
GET 和 POST 有什么区别
GET 和 POST 是 HTTP 协议中两种最常见的请求方法,它们在用途、安全性、数据传递方式等方面有显著的区别。以下是它们的主要区别: 1. 用途 • GET: • 用于从服务器获取资源(数据)。 • 是一种无状态的操作…...
AI Agent 人工智能相关公开比赛汇总
参与 AI 相关比赛是提升技术能力、接触前沿算法、积累项目经验的绝佳方式。以下是全球知名的比赛,以及适合不同水平选手的竞赛分类。 1. 全球知名 AI & 计算机竞赛 (1) Kaggle 竞赛(Kaggle Competitions) 简介:全球最知名的…...
Java 多线程编程之 Object.wait 方法(工作原理、高级特性、notify 方法与 notifyAll 方法)
一、wait 方法 1、基本介绍 wait 方法是 Java 中每个对象都拥有的方法,它继承自 Object 类 wait 方法使当前线程进入等待状态,直到其他线程调用该对象的 notify 方法或 notifyAll 方法 wait 方法必须在同步代码块中使用,否则抛出 Interrup…...
python下载m3u8格式视频
一、安装 m3u8库 pip install requests pip install requests m3u8 二、编码实现 import os import re import requests import subprocess# 下载ts文件 def down_ts_file(base_url, m3u8_url, download_dir):# 从m3u8文件中获取所有ts的分片名称信息response requests.get…...
3.30 代码随想录第三十天打卡
准备:01背包理论基础(二维) 1.有n个物品每个物品只有一个 2.完全背包是有n个物品每个物品有无限多个 3.多重背包是有n个物品每种物品个数各不相同 (1)题目描述: (2)解题思路; 1…...
01 相机标定与相机模型介绍
学完本文,您将了解不同相机模型分类、内参意义,及对应的应用代码模型 标定的意义 建模三维世界点投影到二维图像平面的过程。标定输出的是相机模型。 相机模型 相机模型可以解理解为投影模型 +...
鸿蒙学习手册(HarmonyOSNext_API16)_应用开发UI设计:相对布局
概述 RelativeContainer 就像个「智能拼图板」,帮你把界面组件像拼图一样自由组合,不用一层套一层地堆叠。每个组件可以直接「贴」到其他组件旁边或容器边缘,省去多层嵌套的麻烦,让复杂界面更高效。 举个接地气的例子 dz…...
关于为什么使用redis锁,不使用zk锁的原因
实际项目中,redis一直是最为稳定、可靠的部分,你根本不用担心redis本身的问题。至于ap模型的问题,绝大多数分布式锁只是用于避免一些极端情况的,若单一数据会有那么高的并发量你还加锁,那就要考虑这个业务场景设置的合…...
string的基本使用
C基础格式 C语言语法STL。蓝桥杯选用C11的版本。 #include <bits/stdc.h> #include <iostream> using namespace std; int main() {cout<<"Hello World!"<<endl;printf("Hello World!");return 0; } 基本数据类型 #include &l…...
论文阅读笔记——PointVLA: Injecting the 3D World into Vision-Language-Action Models
PointVLA 论文 现有的 VLA 基于 2D 视觉-语言数据表现良好但缺乏 3D 几何先验导致空间推理缺陷。传统方案:1)3D->2D 投影,造成几何信息损失;2)3D 数据集少。PointVLA 保留原有 VLA,提取点云特征…...
MySQL数据库精研之旅第四期:解锁库操作高阶技能
专栏:MySQL数据库成长记 个人主页:手握风云 目录 一、查看所有表 1.1. 语法 二、创建表 2.1. 语法 2.2. 示例 2.3. 表在磁盘上对应的⽂件 三、查看表结构 3.1. 语法 3.2. 示例 四、修改表 4.1. 语法 4.2. 示例 五、删除表 5.1. 语法 5.2.…...
自定义一个C语言字符串取整函数
一、字符串取整的主要思路 1、遍历每个字符; 2、获得0到9的字符对应的整数值; 3、把对应位置的十进制权重相乘; 4、把所有的相乘结果相加; 5、返回相加结果; 二、主要代码 // 主要是把十进制的整数字符转成十进制变量值…...
Ruby 命令行选项
Ruby 命令行选项 概述 Ruby 是一种广泛使用的编程语言,它拥有强大的命令行工具,可以帮助开发者进行各种任务。了解 Ruby 的命令行选项对于提高开发效率至关重要。本文将详细介绍 Ruby 的常用命令行选项,帮助开发者更好地利用 Ruby 的命令行功能。 Ruby 命令行选项概述 R…...
3.29:数据结构-绪论线性表-上
一、时间复杂度 1、ADT 2、定义法计算时间复杂度:统计核心语句的总执行次数 (1)例题1,与2022年的真题对比着写 此题关键在于求和公式的转化,类型为:线性循环嵌套非线性循环 2022年那道题如果考场上实在脑…...
【百日精通 JAVA | SQL篇 | 第一篇】初识数据库
一、数据库是什么? 数据库是一类软件,数据库的作用用于管理系统(这是一款成品软件,内部应用了很多数据结构)。 二、数据库分为两大类 1.关系型数据库 对于数据的要求比较严格 通常是以表格的方式来组织数据的。(和Excel差不多) 典型代表…...
yum repolist all全部禁用了 怎么办
文章目录 步骤思考解决yum仓库全部被禁用的问题步骤思考: 检查仓库状态:运行yum repolist all,查看所有仓库的启用状态。 被禁用的仓库会显示为disabled。 启用所有仓库:可以逐一启用,或者使用命令批量启用。 例如使用yum-config-manager --enable ‘*’,但需要注意是否有…...
gnvm切换node版本号
1. gnvm下载官网 GNVM - Node.js version manager on Windows by Go 2. 安装 2.1 不存在 Node.js 环境 下载并解压缩 gnvm.exe 保存到任意文件夹,并将此文件夹加入到环境变量 Path。 2.2 存在 Node.js 环境 下载并解压缩 gnvm.exe 保存到 Node.js 所在的文件夹。 2.…...
maven高级
1.分模块开发与设计 理解并实现分模块开发 能够使用聚合工程快速构建项目 能够使用继承简化项目配置 能够根据需求配置生成、开发、测试环境,并在各个环境间切换运行 了解Maven的私服 1.1分模块开发:将别人写好的功能或是包直接使用, 引入依赖…...
MyBatis-Plus 多数据源配置与读写分离实战
一、引言 在实际的项目开发中,我们常常会遇到需要操作多个数据库的情况,比如纯粹多库、读写分离、一主多从、混合模式等。本文将详细介绍如何使用 MyBatis-Plus 实现纯粹多库的场景,并探讨读写分离的实现思路。 二、环境准备 开发工具&…...
pip install cryptacular卡住,卡在downloading阶段
笔者安装pip install cryptacular卡在downloading阶段,但不知道为何 Collecting cryptacularCreated temporary directory: /tmp/pip-unpack-qfbl8f08http://10.170.22.41:8082 "GET http://repo.huaweicloud.com/repository/pypi/packages/42/69/34d478310d6…...
Baklib解析企业内容管理与内容中台核心差异
企业内容管理技术架构解析 在企业数字化进程中,企业内容管理系统(ECM)以结构化技术框架为核心,通过文档全生命周期管理与元数据控制实现内容资产的高效治理。其架构通常包含分布式存储引擎、多层级权限体系及标准化工作流模块&am…...
力扣每日一题:2716——最小化字符串长度
2716——最小化字符串长度 题目示例示例 1示例 2示例 3 题解理解 题目 给你一个下标从 0 开始的字符串 s ,重复执行下述操作任意次: 在字符串中选出一个下标i ,并使 c 为字符串下标i处的字符。并在 i 左侧(如果有)和…...
掌握正则表达式:从基础到实用示例
目录 一、简单谈谈正则 二、基础知识学习 (一)正则元字符 1.特殊单字符 2.空白符 3.量词 4.范围备和选项 综合练习 (二)贪婪、非贪婪与独占模式 1.贪婪模式 2.非贪婪模式(懒惰模式) 3.独占模式…...
Python 中列表(List)、元组(Tuple)、集合(Set)和字典(Dict)四大数据结构的完整对比
以下是 Python 中列表(List)、元组(Tuple)、集合(Set)和字典(Dict)四大数据结构的完整对比分析,结合了核心特性、操作方式和应用场景的深度总结: 一、核心特性…...
LK光流和特征点的关系
uv方程 光流有两个假设: 1.亮度恒定,即图像相同位置的灰度短时不变。两帧中对应像素灰度/亮度相同 2.时间持续性(微小移动),这意味着时间的变化不会引起像素位置的剧烈变化,这样像素的灰度值才能对位置求…...
Rocky Linux 9.5中完美迁移mysql5.6.17到mysql5.7.11
首先Rocky Linux 9.5中,默认官方建议使用的是mysql8.0,项目要兼容以往数据,经过测试跟mysql5.7.11能做兼容。 一:工具准备以及安装步骤 1、官网下载地址:https://downloads.mysql.com/archives/community/ 下载版本…...
练习题:113
目录 Python题目 题目 题目分析 需求理解 关键知识点 实现思路分析 代码实现 代码解释 定义列表: for 循环遍历列表: 输出元素: 运行思路 结束语 Python题目 题目 使用for循环遍历一个列表并输出每个元素。 题目分析 需求理…...
文件上传存储安全OSS 对象分站解析安全解码还原目录执行
# 文件 - 解析方案 - 执行权限 & 解码还原 1 、执行权限 文件上传后存储目录不给执行权限 2 、解码还原 数据做存储,解析固定(固定协议)(文件后缀名无关) 文件上传后利用编码传输解码还原 # 文件 - 存储方案 - 分站存储…...
NUUO摄像头debugging_center_utils命令执行漏洞
免责声明:本号提供的网络安全信息仅供参考,不构成专业建议。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我联系,我将尽快处理并删除相关内容。 漏洞描述 NUUO NVR是中国台湾省NUUO公司旗…...
华为OD机试2025A卷 - 正则表达式替换(Java Python JS C++ C )
最新华为OD机试 真题目录:点击查看目录 华为OD面试真题精选:点击立即查看 题目描述 为了便于业务互交,约定一个对输入的字符串中的下划线做统一替换。 具体要求如下: 输入字符串,将其中包含的每一个下划线“_”,使用特殊字符串(^|$|[,+])替换,并输出替换后的结果…...
2025-3-30算法打卡
一,小明的彩灯 1.题目描述: 题目描述 小明拥有 NN 个彩灯,第 ii 个彩灯的初始亮度为 aiai。 小明将进行 QQ 次操作,每次操作可选择一段区间,并使区间内彩灯的亮度 xx(xx 可能为负数)。 求…...
【今日半导体行业分析】2025年3月30日
今日探针卡行业分析:把握机遇,应对挑战 一、引言 在半导体产业的精密制造流程中,探针卡作为晶圆测试环节的核心设备,犹如一颗精密的 “心脏”,承担着芯片封装前电学性能测试与筛选的重任。其性能的优劣直接关系到芯片…...
深度学习Note.5(机器学习2)
多项式回归 1.与线性回归联系: 与线性回归大体相似,代码部分复用性高,不同点:公式中为x的次方,可能要规范化处理。 2.paddle的API paddle.sin(x, nameNone) 功能:计算输入的正弦值。 输入:输入…...
三、分类模块,通用组件顶部导航栏Navbar
1.封装通用组件顶部导航栏Navbar 不同效果 Component export struct MkNavbar {Prop title: string Prop leftIcon: ResourceStr $r("app.media.ic_public_left")ProprightIcon: ResourceStr $r("app.media.ic_public_more")PropshowLeftIcon: boolean…...
PipeWire 音频设计与实现分析三——日志子系统
日志子系统 PipeWire 的日志子系统的设计分为多个层次。PipeWire 用 struct spa_log 对象描述日志组件,用 struct spa_log_methods 对象描述日志组件打印各层级日志的多个方法。PipeWire 为日志子系统添加了 topic 机制,不同文件中的日志按功能以不同的…...
playwright解决重复登录问题,通过pytest夹具自动读取storage_state用户状态信息
playwright解决重复登录问题,通过pytest夹具自动读取storage_state用户状态信息 conftest.py文件下封装两个夹具夹具一:将storage_state登录状态导出为json文件夹具二:重写夹具browser_context_args,添加storage_state登录状态登录…...
Codeforces Round 1014 (Div. 2)(A-D)
题目链接:Dashboard - Codeforces Round 1014 (Div. 2) - Codeforces A. Kamilka and the Sheep 思路 最大值-最小值 代码 void solve(){int n;cin>>n;vi a(n10);int mx0;int miinf;for(int i1;i<n;i){cin>>a[i];mimin(mi,a[i]);mxmax(mx,a[i])…...