物联网消息队列后端网络/通信【免费下载链接】mosquittoEclipse Mosquitto - An open source MQTT broker项目地址https://gitcode.com/gh_mirrors/mo/mosquitto点击查看免费下载MQTT 5MQTT v5.0为物联网消息协议带来了属性Properties、请求/响应、消息过期、主题别名等全新能力。本文基于 Mosquitto 官方博客文章 mqtt5-progress梳理 MQTT 5 支持在 Mosquitto 中的落地进度并结合当前仓库源码给出mosquitto_pub/mosquitto_sub使用-D选项设置属性的完整命令与参数清单帮助读者立刻上手测试 MQTT 5 特性。读完本文你将掌握如何获取并编译 MQTT 5 支持分支、当前已实现的功能边界、-D command identifier value的完整语法与每个命令允许的属性白名单以及请求/响应、会话过期、主题别名等特性在源码与测试中的真实实现位置。MQTT 5 支持现状开发中的里程碑据 mqtt5-progress.md发布于 2018-11-29所述Mosquitto 对 MQTT 5 的支持开发进行中且进展良好Development of support for MQTT 5 is ongoing and making good progress但一度因其他非 Mosquitto 工作的优先级而显著延期。这是 Mosquitto 迈向 2.0 版本前的关键过渡阶段文档明确指出紧随 1.6 之后的 2.0 版本计划对 libmosquitto API 进行破坏性整合consolidate the libmosquitto API with breaking changes这是因为客户端库为同时提供 MQTT 5 新特性与向后兼容不得不增加大量新函数API 空间已趋于膨胀需要在 2.0 中收拢重构。从当前仓库已演进至更成熟状态回头看这份进度报告描述的功能点如今大多已在主干中稳定落地例如协议常量定义于 include/mosquitto/mqtt_protocol.hPROTOCOL_VERSION_v311 4、PROTOCOL_VERSION_v5 5属性枚举与属性库实现见 include/mosquitto/libcommon_properties.h 与 lib/property_mosq.c。当时已实现的特性清单原文档列出的当前特性包括所有入站/出站数据包的支持CONNECT/CONNACK、PUBLISH、PUBACK、PUBREC、PUBREL、PUBCOMP、SUBSCRIBE、SUBACK、UNSUBSCRIBE、UNSUBACK、PINGREQ/PINGRESP、DISCONNECT、AUTH 等报文均能收发但并非所有字段都被完整处理所有属性的收发属性Properties可以发送和接收但并非全部属性都会被处理客户端设置属性libmosquitto 提供mosquitto_property_add_*系列 API 与mosquitto_publish_v5、mosquitto_subscribe_v5等 v5 接口请求/响应支持支持携带response-topic发起请求但当时客户端尚不能处理收到的correlation-data当前仓库中已有03-request-response-correlation-1.c等测试见下文Retain 可用性retain-available属性的支持消息过期间隔支持message-expiry-interval服务端分配客户端标识符即assigned-client-identifier负载格式指示符支持payload-format-indicator内容类型支持content-type从客户端到 broker 的基础主题别名支持topic-alias大量新增测试。测试 MQTT 5使用 mqtt5 分支原文档建议通过仓库的mqtt5分支来测试当时的 MQTT 5 支持状态并强调这仍然是非常进行中的工作部分功能不完整接口可能还会变化very much a work in progress, so parts are incomplete and interfaces may yet change。这提醒开发者在特性开发期使用实验分支时应关注接口变更风险当前仓库主干已经把这些能力收敛为稳定的 v5 API直接基于主干构建即可使用。获取并切换分支的示意命令文档以 git 协作流程为前提git clone https://gitcode.com/gh_mirrors/mo/mosquitto cd mosquitto git checkout mqtt5注mqtt5分支是 2018 年前后的历史开发分支当前仓库主干已经包含完整的 MQTT 5 支持如需最新稳定功能直接使用主干master/main并参照 README-compiling.md 编译即可。mosquitto_pub / mosquitto_sub 的-D属性选项原文档给出三个命令行示例展示mosquitto_pub与mosquitto_sub通过-D即--property在命令行设置属性。该选项的三段式语法为-D command identifier value -D command identifier name value # user-property 需要 key/value 两项其中command属性所属的报文阶段可选connect、publish、subscribe、unsubscribe、disconnect、willidentifier属性名称使用连字符小写形式如session-expiry-interval、content-typevalue属性值对user-property而言还需要一个额外的name即 key。该解析逻辑实现在 client/client_props.c 的cfg_parse_property()中它先把命令名映射为报文类型mosquitto_string_to_command再把属性名映射为属性 ID 与数据类型mosquitto_string_to_property_info随后用mosquitto_property_check_command校验该属性是否允许出现在该命令中最后按数据类型调用mosquitto_property_add_byte/_int16/_int32/_varint/_binary/_string/_string_pair加入对应的属性链表cfg-connect_props、cfg-publish_props、cfg-subscribe_props、cfg-unsubscribe_props、cfg-disconnect_props、cfg-will_props。数值型属性还会做取值范围检查如 BYTE 型要求0 value UINT8_MAX越界会直接报错。原文档的三个示例示例 1订阅端设置 CONNECT 与 SUBSCRIBE 属性mosquitto_sub -t topic -v -D connect session-expiry-interval 60 \ -D connect user-property key value \ -D subscribe user-property sub-key sub-value该命令设置了CONNECT 报文的session-expiry-interval60 秒即断线后会话保留 60 秒、CONNECT 的用户属性keyvalue、SUBSCRIBE 报文的用户属性sub-keysub-value。示例 2发布端设置 PUBLISH 属性mosquitto_pub -t topic -m {key:value} -D publish content-type application/json该命令给发布的消息附加content-type: application/json让订阅方能识别负载为 JSON 数据是 MQTT 5 内容类型特性的典型用法。示例 3流水线发布 主题别名./sensor_read.sh | mosquitto_pub -t topic -l -D publish topic-alias 1-l--line表示逐行读取 stdin 并逐条发布topic-alias 1告诉 broker这条消息的主题可用别名 1 代替。从 client/pub_client.c 的my_publish()可以看到其实现细节当协议版本为 v5 且设置了topic-alias时从第二帧发布起调用mosquitto_publish_v5(mosq, mid, NULL, ...)即以 NULL 主题发送后续消息完全依赖已建立的别名显著压缩高频上报场景的报文体积。每个命令允许的属性白名单根据 man/mosquitto_pub.1.xml 与仓库中 client/pub_test_properties、client/sub_test_properties 等测试输入文件各命令可设置的属性如下ConnectCONNECT 报文属性类型authentication-data二进制数据mosquitto_pub 中按字符串处理authentication-methodUTF-8 字符串对maximum-packet-size32 位无符号整数receive-maximum16 位无符号整数request-problem-information8 位无符号整数request-response-information8 位无符号整数session-expiry-interval32 位无符号整数建议改用-xtopic-alias-maximum16 位无符号整数user-propertyUTF-8 字符串对PublishPUBLISH 报文属性类型content-typeUTF-8 字符串correlation-data二进制数据按字符串处理message-expiry-interval32 位无符号整数payload-format-indicator8 位无符号整数response-topicUTF-8 字符串topic-alias16 位无符号整数user-propertyUTF-8 字符串对DisconnectDISCONNECT 报文属性类型session-expiry-interval32 位无符号整数user-propertyUTF-8 字符串对Will遗嘱消息属性类型content-typeUTF-8 字符串correlation-data二进制数据按字符串处理message-expiry-interval32 位无符号整数payload-format-indicator8 位无符号整数response-topicUTF-8 字符串user-propertyUTF-8 字符串对will-delay-interval32 位无符号整数此外subscribe命令支持subscription-identifier与user-propertyunsubscribe命令支持user-property参见 client/sub_test_properties 中-D subscribe subscription-identifier 1、-D unsubscribe user-property unsubscribe up等用法。在cfg_parse_property()中auth命令与puback/pubrec/pubrel/pubcomp/suback/unsuback等命令明确被拒绝会返回MOSQ_ERR_NOT_SUPPORTED因为-D只面向客户端主动构造的报文。简化快捷选项-x与-V除-D外客户端还提供常用快捷选项-x session-expiry-interval直接设置 CONNECT 报文的session-expiry-interval属性见 client/pub_client.c 与 man/mosquitto_pub.1.xml。文档特别注明当会话被设置为永不过期-x 0之外的无限值或配合-c干净会话时必须提供客户端 ID-i。-V protocol-version选择协议版本MQTT 5 对应-V 5。从源码可见协议版本常量定义在 include/mosquitto/mqtt_protocol.hv5 报文名称为MQTT、版本号为 5。请求/响应模式源码与测试验证MQTT 5 的请求/响应模式由 PUBLISH 属性response-topic与correlation-data承载。原文档指出当时客户端无法处理收到的 correlation data但当前仓库已补齐这一能力。C 测试用例 test/lib/c/03-request-response-1.c 完整演示了该流程连接后订阅response/topic在on_subscribe回调中调用mosquitto_property_add_string(props, MQTT_PROP_RESPONSE_TOPIC, response/topic)构造属性用mosquitto_publish_v5(mosq, NULL, request/topic, 6, action, 0, 0, props)发布携带响应主题的请求在on_message回调中校验收到的响应负载是否为a response。对应的相关测试还包括03-request-response-2.c、03-request-response-correlation-1.c等它们共同验证了请求/响应与关联数据处理的端到端行为。客户端工具层面mosquitto_rrclient/rr_client.c也通过mosquitto_property_add_string(cfg.publish_props, MQTT_PROP_RESPONSE_TOPIC, cfg.response_topic)在内部使用响应主题属性。属性系统底层libmosquitto 的 v5 属性 API属性是 MQTT 5 的核心扩展其数据模型在 test/mqtt5_props.py 中有完整枚举1 到 42 号属性测试脚本还提供了gen_byte_prop、gen_uint16_prop、gen_uint32_prop、gen_string_prop、gen_string_pair_prop、gen_varint_prop等打包工具用于按 MQTT 5 规范生成属性字节流供各测试用例比对。在库层面lib/property_mosq.c 实现了属性的读取property__read_all与写入property__write_all并提供mosquitto_property_add_byte / _int16 / _int32 / _varint / _binary / _string / _string_pair按数据类型构造属性并追加到属性链表mosquitto_property_free_all释放属性链表mosquitto_string_to_property_info将命令行中的属性名映射为属性 ID 与类型供cfg_parse_property使用。这些 API 在-D命令行解析client/client_props.c、v5 发布/订阅调用mosquitto_publish_v5、mosquitto_subscribe_v5以及大量 v5 测试中反复使用是理解 Mosquitto MQTT 5 支持的关键入口。所有 v5 对外符号均通过 lib/linker.version 与 src/linker.syms 导出。结语从进度报告到稳定能力回顾 mqtt5-progress 这份 2018 年的进度报告可以清晰看到 Mosquitto MQTT 5 支持从部分未处理、接口可能变化的实验状态逐步收敛为今天主干中稳定、可测试的完整实现。文中列出的每一项特性——属性收发、请求/响应、消息过期、主题别名、服务端分配客户端 ID、负载格式指示符、内容类型——都能在当前仓库的源码lib/property_mosq.c、client/client_props.c、客户端工具client/pub_client.c、client/sub_client.c与测试用例test/lib/c 下大量*-v5.c文件中找到对应实现。对开发者而言最快上手路径是使用-V 5指定协议版本用-D为 connect / publish / subscribe / will / disconnect 各阶段附加属性再用mosquitto_pub与mosquitto_sub对跑验证。例如在 A 终端执行mosquitto_sub -t topic -V 5 -v -D connect session-expiry-interval 60在 B 终端执行mosquitto_pub -t topic -V 5 -m {key:value} -D publish content-type application/json即可直观观察到 MQTT 5 属性在命令行层级的完整工作流。赞分享物联网消息队列后端网络/通信【免费下载链接】mosquittoEclipse Mosquitto - An open source MQTT broker项目地址https://gitcode.com/gh_mirrors/mo/mosquitto点击查看免费下载相关推荐Eclipse Mosquitto 的 MQTT 5 支持演进从 2018 开发进展到 v2 完整落地Eclipse Mosquitto 的 MQTT 5 支持演进从 2018 开发进展到 v2 完整落地 Eclipse Mosquitto 在 2018 年后端消息队列消息路由Eclipse Mosquitto Roadmap 深度解析从 1.6 的 MQTT 5 支持到 2.0 的 API 重塑与持久化改进Eclipse Mosquitto Roadmap 深度解析从 1.6 的 MQTT 5 支持到 2.0 的 API 重塑与持久化改进 本文基于 Eclips后端消息队列消息路由Eclipse Mosquitto WebSocket支持浏览器端MQTT通信实现Eclipse Mosquitto WebSocket支持浏览器端MQTT通信实现 MQTTMessage Queuing Telemetry Transp物联网消息队列后端上一篇猫抓扩展 5 分钟上手浏览器资源嗅探完整指南下一篇Windows 资源管理器 HEIC 缩略图 5 分钟装好windows-heic-thumbnails 免费预览指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考