清掉 MQTT 保留消息时,空负载、空字符串和 null 有什么区别
清除某主题的保留记录,MQTT 要求的是带 RETAIN 标志发布“零字节负载”。JSON 空字符串写成两个双引号仍占两个字节,JSON null 占四个字节,它们都会成为新的保留内容。先看原始字节长度,再看调试工具怎样展示文本,不能凭输入框看起来“空”就确认已清理。
环境和证据范围
适用于已批准清理状态主题的维护流程。文章附件只比较编码,不向代理发包;实机清理会改变代理状态,必须先确认精确主题与订阅者依赖。这里不建议在命令主题上保留可执行动作,更不能对宽泛主题批量删除。
核对顺序
-
把目标主题、当前保留负载、发布端工具版本单独记录。核对发布工具中空参数是否表示零字节,还是自动补成字符串、空对象或换行;不同工具界面相似,编码结果可能不同。
-
分别准备长度0的字节串、UTF-8编码的双引号文本和null文本,记录十六进制与retain值。把retain=0的零字节消息也列作反例,因为它不构成保留记录清除操作。
-
维护窗口内完成精确主题清理后,用全新的非共享订阅核对,不要用已经接收过旧值的界面当唯一证据。还要排除仍在运行的发布者立即把保留记录写回。
可复算的输入与预期
附件四条合成发布记录依次为retain=true且hex为空、retain=true且hex=2222、retain=true且hex=6e756c6c,以及retain=false且hex为空。脚本输出“清除”“保留2字节”“保留4字节”“普通发布”,字节数不依赖中文界面的显示方式。
普通发布与保留记录是两条不同观察线:retain=0的发布不会清除或替换已有保留消息,即使普通负载恰好是零字节。当前在线订阅者收到一条空消息,与未来新订阅者不再收到旧保留值,需要分别验证,不能只证明其中一项。
下载与现场记录
下载本题合成输入与预期JSON、离线只读核验脚本和现场空白记录CSV。放在同一目录,用 Python 3 运行 python verify.py,逐项计算或解析后与预期比较,失败会显示差异。
现场字段包括 topic、retain、payload_hex、payload_bytes、new_subscription_observation。合成样例保持原样,实测另存并填写型号、版本、证据路径,未采集处留空。本地核验不代表真实设备、代理、浏览器或长期稳定性已测。
失败分支与移交
清理后界面还显示旧值,不足以证明代理删除失败:订阅端可能保留自己的缓存。反过来,界面空了也不足以证明清理成功,可能只是解析null后隐藏了卡片。现场证据必须包含新订阅、实际topic、retain和原始payload长度。
交接时注明谁可以清除、如何备份原负载、清理后谁重新发布状态,以及缓存界面如何处理“主题目前没有保留记录”。恢复时要发布真实当前状态,不能直接恢复一份已过时的快照而不标时间。
基础背景可看MQTT 物联网控制协议在展厅的应用速查。清理之前先确认保留状态是否已失效,可参考看板重连就收到昨天的状态,怎样识别 MQTT 保留值的时效。更多资料在设备协议库。
需要接入中控时,可对照SoftControl设备联动需求核实适配范围;独立校验方法是否纳入交付需逐项约定。
一级资料
核对日期:2026-10-24。规范定义与本文应用约定分开,示例门限及脚本不自动代表产品原生能力。
相关阅读
留言讨论
评论发布后会被人工复核,违规内容将被删除。
如果发表没有反应,可以前往联系我们告诉我们。