ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Mosquitto 1.6.8 发布解读:Broker、客户端库与命令行工具的关键修复

Mosquitto 1.6.8 发布解读:Broker、客户端库与命令行工具的关键修复 物联网消息队列后端网络/通信【免费下载链接】mosquittoEclipse Mosquitto - An open source MQTT broker项目地址https://gitcode.com/gh_mirrors/mo/mosquitto点击查看免费下载导读Mosquitto 1.6.8 是 Eclipse Mosquitto 在 2019 年 11 月 28 日发布的维护bugfix版本专注于修复 Broker、C 客户端库libmosquitto、命令行客户端以及 Windows 安装器中的一批缺陷。本文以官方发布公告 version-1-6-8-released.md 为主体逐条解读本次修复的技术背景并深入到本仓库源码中验证每项修复对应的实现逻辑——包括allow_zero_length_clientid、memory_limit、主题层级上限、CRL 证书吊销列表、会话过期、TLS WebSocket 会话接管、QoS 2 属性传递以及mosquitto_pub -l的 stdin 行为等。读完本文你将理解这些修复背后的工作原理并能判断升级到 1.6.8 对你的部署环境意味着什么。一、Broker 修复六类配置与行为缺陷1.allow_zero_length_clientid配置项设置不正确#1429官方说明对allow_zero_length_clientid配置进行了多项修复该选项此前未被正确设置。源码佐证该配置项在 Broker 全局配置与监听器级配置中均有出现。全局默认值在 src/conf.c 中被置为true其解析逻辑位于 src/conf.c通过conf__parse_bool()读取布尔值在per_listener_settings启用时监听器级副本在 src/listeners.c 被初始化为true。配置值在 CONNECT 报文处理时于 src/handle_connect.c 被读取if(db.config-per_listener_settings){ allow_zero_length_clientid context-listener-security_options-allow_zero_length_clientid; }else{ allow_zero_length_clientid db.config-security_options.allow_zero_length_clientid; }结合 src/mosquitto_broker_internal.h 中的字段声明可见修复涉及的是当全局与监听器配置共存时per_listener_settings的分支选择曾导致该选项无法被正确应用1.6.8 修正了配置在拷贝src/conf.c与使用链路中的偏差。配置示例mosquitto.confper_listener_settings true allow_zero_length_clientid true2. 内存跟踪错误影响memory_limit#1437官方说明修复了不正确的内存跟踪导致memory_limit选项失效的问题。源码佐证memory_limit是 Broker 的全局配置用于限制 MQTT 客户端消息等动态内存的总体占用。其解析位于 src/conf.c使用conf__parse_ssize_t()将配置值解析为有符号整型并直接存入 Broker 配置。修复前的内存跟踪统计在部分分配/释放路径上存在偏差例如消息队列与 retain 树相关路径导致实际内存用量被低估memory_limit无法按预期触发拒绝。1.6.8 校正了统计口径使限制恢复生效。配置示例memory_limit 10000003. 订阅主题长度限制200 字符误改为 200 个层级#1441官方说明修复订阅主题被限制为 200 字符而非 200 个层级的问题。源码佐证订阅主题的存储采用层级化哈希结构。在 src/subs.c 中每个层级节点通过HASH_ADD(hh, *sibling, topic, child-topic_len, child)挂入兄弟链表topic_len为单个层级片段的长度src/retain.c 的 retain 树同理。文件头部注释src/subs.c明确说明主题最长 32767 字符/为层级分隔符。修复前代码误将层级数量上限 200 套用到了总字符长度上导致合法长主题的订阅被拒绝1.6.8 恢复为正确的语义——限制 200 个层级而非 200 个字符。持久化写入时递归遍历层级src/persist_write.c因此该修复同样影响持久化订阅的读写一致性。4. CRL证书吊销列表仅能加载一份#1442官方说明此前同一时间只能加载一份 CRL本版本修复。源码佐证TLS 监听器的 CRL 文件在配置解析中按监听器保存src/conf.c字段声明于 src/mosquitto_broker_internal.h。加载逻辑位于 src/net.cX509_load_crl_file()将 CRL 装入X509_STORE的lookup中每次调用net__load_crl_file()都基于同一个X509_STORE上下文src/net.c 在 listener 配置了crlfile时调用。修复前的实现只保留最近一次加载的 CRL多监听器场景下其余监听器的 CRL 被覆盖1.6.8 修正为各监听器独立装载各自的 CRL确保证书吊销检查在多监听器/多 CA 场景下正确生效。listener 8883 crlfile /etc/mosquitto/crl/crl.pem require_certificate true5.per_listener_settings true时重载配置异常#1459官方说明修复per_listener_settings为 true 时重载配置SIGHUP出现的问题。源码佐证per_listener_settings决定监听器是否各自持有独立的security_options副本全局配置与监听器配置之间通过结构体拷贝同步src/conf.c 展示了allow_zero_length_clientid等字段的拷贝模式。1.6.8 之前重载配置时对监听器级选项的更新存在遗漏或错误覆盖导致热重载后权限与客户端 ID 相关行为与配置文件不一致本版本修正了重载路径上的配置传播逻辑。6. 保留消息过期与消息过期属性#1464官方说明两个相关修复① 从持久化恢复的带过期时间的保留消息未在到期后被清除② 即将过期的消息被发送时未附带过期时间属性。源码佐证保留消息的过期依赖消息的message_expiry_interval属性。修复①对应持久化恢复路径——保留消息从数据库还原后未正确重新注册过期调度导致其永久滞留1.6.8 确保恢复时重新计算并登记过期时间。修复②对应发布路径当消息在即将过期的时间窗内被派发给新订阅者时Broker 在转发前若剩余 TTL 极小可能因属性裁剪逻辑漏掉message-expiry-interval属性修复后保证即使即将过期转发消息仍携带正确的过期属性避免订阅端无法感知消息有效期的协议级偏差。二、客户端库libmosquitto修复1. QoS 2 消息的发布属性未传给on_message_v5()回调#1432官方说明修复 QoS 2 消息的发布属性如消息过期、内容类型等未传递给on_message_v5()回调的问题。技术背景在 MQTT 5 中发布属性随 PUBLISH 报文传输QoS 2 的完整流程为 PUBLISH → PUBREC → PUBREL → PUBCOMP。属性解析在 lib/read_handle.c 的handle_publish()中进行消息在 QoS 2 的 PUBREL 阶段才会最终投递给上层回调。修复前QoS 2 消息的属性在中间状态转换中被丢弃导致on_message_v5()拿不到属性1.6.8 修正了属性在 QoS 2 状态机中的保留与传递。2. mosquitto.h 文档问题与mosquitto_connect_srv()补文档#1478 / #1499官方说明修复 include/mosquitto.h对外头文件为 include/mosquitto/libmosquitto.h中的文档问题并为mosquitto_connect_srv()补充文档。源码佐证mosquitto_connect_srv()通过 DNS SRV 记录解析 MQTT 服务地址其实现位于 lib/srv_mosq.c。该函数此前在头文件中缺少注释说明开发者无法从 API 文档获知其行为1.6.8 补齐了相关文档明确其与mosquitto_connect()的差异。三、命令行客户端修复1.mosquitto_pub -lstdin 结束挂起与末行丢失#1448 / #1473 / #1474官方说明三个相关修复mosquitto_pub -l在 stdin 流结束时挂起#1448mosquitto_pub -l未发送 stdin 最后一行若该行不以换行符结尾#1473使mosquitto_pub -l的文档与实际行为一致——空行作为空消息发送#1474。源码佐证-l--stdin-line模式逐行读取 stdin 并逐行发布其主循环在 client/pub_client.c 的pub_stdin_line_loop()中实现while(status STATUS_CONNACK_RECVD fgets(line_buf[pos], read_len, stdin)){ buf_len_actual (int )strlen(line_buf); if(line_buf[buf_len_actual-1] \n){ line_buf[buf_len_actual-1] \0; rc my_publish(mosq, mid_sent, cfg.topic, buf_len_actual-1, line_buf, cfg.qos, cfg.retain); ... break; }else{ /* 行超过缓冲区扩容继续读取 */ line_buf_len 1024; pos read_len-1; ... } } if(pos ! 0){ /* EOF 前最后一段无换行的内容 */ rc my_publish(mosq, mid_sent, cfg.topic, buf_len_actual, line_buf, cfg.qos, cfg.retain); ... } if(feof(stdin)){ if(mid_sent -1){ /* 空文件直接断开 */ ... }else{ last_mid mid_sent; status STATUS_WAITING; } stdin_finished true; }结合这段代码可以还原三项修复的机理#1473末行丢失当 stdin 最后一行不以\n结尾时fgets()读到 EOF 返回非 NULL 但行末没有换行符循环退出后pos ! 0分支负责把残留内容发布出去。修复前该分支的条件/时机判断有误导致最后一段数据被丢弃1.6.8 确保 EOF 时的残留行被正确发布。#1448挂起stdin 结束时若从未成功发送任何消息mid_sent -1即空输入此前状态机未能正确退出循环持续空转修复后空文件场景会直接进入断开流程并正常退出。#1474文档从while循环可见fgets()读到的每一行包括空行都会触发my_publish()空行实际发布为长度为 0 的空消息client/pub_client.c 中的帮助文本已相应更新官方文档也改为与实际一致。2.mosquitto_rr重复的 cfg 定义#1453官方说明修复rr_client中重复的cfg定义。该问题属于编译期缺陷——重复定义在部分编译配置下导致链接或重复声明警告/错误client/rr_client.c 在 1.6.8 中移除重复定义保证各工具链可正常构建。3.mosquitto_sub未连接成功退出时的内存释放#1513官方说明mosquitto_sub在未成功建立连接即退出时存在内存泄漏本版本修复。技术背景mosquitto_sub在启动阶段可能因连接失败如 broker 不可达、认证失败直接退出修复前已分配的选项/上下文内存在退出路径上未释放1.6.8 补充了该场景的清理逻辑。四、构建与安装器修复1. Makefile 新增CLIENT_STATIC_LDADD构建官方说明为 Makefile 构建新增CLIENT_STATIC_LDADD允许静态链接 libmosquitto 编译客户端时追加链接库如部分系统上静态链接需要 openssl 依赖。源码佐证根目录 Makefile 与 config.mk 中维护构建变量。修复前静态编译mosquitto_pub/mosquitto_sub时无法附加额外的系统库依赖导致静态链接失败新增变量后构建者可向客户端可执行文件追加所需库。2. Windows 安装器缺失mosquitto_rr.exe#1463官方说明修复mosquitto_rr.exe未包含在 Windows 安装器中的问题。源码佐证Windows 安装脚本位于 installer/mosquitto.nsi以及 64 位变体 installer/mosquitto64.nsi。1.6.8 在 NSIS 脚本中补上了mosquitto_rrrequest-response 客户端的可执行文件条目使 Windows 用户安装后可直接使用该工具。五、升级建议与验证1.6.8 属于典型的 bugfix 维护版本没有破坏性 API 变更建议所有 1.6.x 用户升级。升级后可通过以下方式快速验证关键修复配置重载设置per_listener_settings true并修改配置文件后发送kill -HUP pid确认监听器级allow_zero_length_clientid等选项按预期生效长主题订阅使用超过 200 字符但层级小于 200 的主题进行订阅确认不再被拒绝见 src/subs.c 的层级树实现CRL 多监听器为两个 TLS 监听器分别配置不同crlfile验证各自独立加载mosquitto_pub -l行为printf a\n\nb | mosquitto_pub -l -t test观察空行发布为空消息、末行b无换行被正确发送且进程正常退出不再挂起。相关资源发布公告原文www/posts/2019/11/version-1-6-8-released.mdBroker 配置解析src/conf.callow_zero_length_clientid、memory_limit、crlfile、persistent_client_expiration的解析入口会话过期实现src/session_expiry.cCONNECT 处理与零长度 Client IDsrc/handle_connect.c客户端 stdin 行发布循环client/pub_client.cWindows 安装脚本installer/mosquitto.nsi客户端库发布属性处理lib/read_handle.c赞分享物联网消息队列后端网络/通信【免费下载链接】mosquittoEclipse Mosquitto - An open source MQTT broker项目地址https://gitcode.com/gh_mirrors/mo/mosquitto点击查看免费下载相关推荐Eclipse Mosquitto 1.6.3 发布详解Broker、客户端库与命令行工具的关键缺陷修复Eclipse Mosquitto 1.6.3 发布详解Broker、客户端库与命令行工具的关键缺陷修复 导读 Mosquitto 1.6.3 是 Eclip后端消息队列消息路由一条命令批量下载抖音视频封面从单链接到作者主页全档一条命令批量下载抖音视频封面从单链接到作者主页全档 做素材库时经常要批量收某位作者作品里的封面拿去做二次剪辑的封面底图。截图的方式带水印、分辨率低一条条点物联网消息队列后端网络/通信Eclipse Mosquitto 1.6.11 发布解读Broker 与客户端库的关键缺陷修复详解Eclipse Mosquitto 1.6.11 发布解读Broker 与客户端库的关键缺陷修复详解 导读 Eclipse Mosquitto 1.6.11后端消息队列消息路由上一篇SeleniumBase Boilerplate 样板代码实战基于 BaseCase 继承与 Page Object Model 搭建可维护的自动化测试框架下一篇如何在3分钟内掌握FancyZonesWindows窗口管理终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表