数据平台对接实战)
物联网消息队列后端【免费下载链接】mosquittoEclipse Mosquitto - An open source MQTT broker项目地址https://gitcode.com/gh_mirrors/mosquit/mosquitto点击查看免费下载导读本文以 Mosquitto 官方博客 2012 年发布的《Quick start guide for MQTT with Pachube/Cosm/Xively》为骨架结合当前仓库源码系统讲解如何用mosquitto_pub与mosquitto_sub这两条命令行工具完成 MQTT 消息的发布、订阅与连接状态监控。你将掌握向远程 MQTT 服务发布传感器数据的完整命令写法、从标准输入逐行推送数据的管道用法、通过 MQTT Last Will遗嘱机制实现断线告警以及如何基于 Mosquitto 客户端库编写自有 MQTT 客户端。文中的所有命令均可对照当前仓库的 client 目录源码与 mosquitto_pub.1、mosquitto_sub.1 手册页逐一验证。背景为什么用 MQTT 对接 Pachube / XivelyPachube后更名为 Cosm再更名为 Xively曾是一家物联网数据托管平台用户在平台上创建feed数据源与datastream数据流通过 HTTP API 上传和读取数据。2012 年该平台宣布开放 MQTT 协议的 beta 支持允许用户用 MQTT 直接向 feed 发布数据、订阅 feed 中的数据更新。相比轮询 HTTP 接口MQTT 的发布/订阅模型让设备侧的数据上报和对端的数据获取都更加轻量、实时。需要说明的是这是一篇 2012 年发布的史料性快速上手指南Pachube/Xively 平台本身已成为历史但其中的命令行用法、Will 遗嘱机制与客户端编程思路完全适用于今天任何一个标准 MQTT broker包括本仓库自带的 mosquitto broker因此仍有很高的参考价值。原文指向 Xively 官方 MQTT 文档的链接片段为mqtts可见该平台的 MQTT 接口运行在 TLS 加密之上这也解释了为什么连接时要按需配置用户名API key与 TLS 参数。官方提供的命令行客户端包含在 Mosquitto 发行包中即mosquitto_pub发布与mosquitto_sub订阅两个可执行程序其源码分别位于 pub_client.c 与 sub_client.c。命令行示例发布数据方式一一条命令更新整个 feed原文给出的第一个示例是同时更新 feed 中多个 datastreammosquitto_pub -h api.xively.com -u your xively api-key -t /v2/feeds/504.csv -m 0,29这里各参数的含义是-h api.xively.com指定要连接的 MQTT 服务器主机名-u your xively api-key用 Xively 的 API key 作为 MQTT 连接用户名完成认证-t /v2/feeds/504.csv发布目标 topic。Xively 把 REST API 的路径映射成了 MQTT topic/v2/feeds/504.csv表示以 CSV 格式更新 feed 504-m 0,29消息负载其中0是 datastream 编号29是要写入的新数值。方式二只更新单个 datastream如果只更新某一个 datastream可以改用更细粒度的 topicmosquitto_pub -h api.xively.com -u your xively api-key -t /v2/feeds/504/datastreams/0.csv -m 29此时负载就是一个单纯的数值29对应写入 feed 504 的 datastream 0。对照当前仓库源码mosquitto_pub连接成功后即调用my_publish()把-m指定的消息发布到-t指定的 topic见 pub_client.c 中MSGMODE_CMD分支。此外 pub_client.c 的使用说明还给出了几个常用配套参数可让上述命令更健壮-p端口号明文 MQTT 默认1883MQTT over TLS 默认8883-qQoS 等级取值范围 0/1/2默认 0-r设置 retained 标志让 broker 保留最后一条消息给后来的订阅者-VMQTT 协议版本可选mqttv5、mqttv311、mqttv31默认mqttv311--cafileTLS 场景下指定受信任的 CA 证书路径配合-p 8883使用-i客户端 ID默认是mosquitto_pub_加进程号。方式三从标准输入逐行发布管道数据流mosquitto_pub支持从 stdin 读取数据因此可以与其他程序组成管道实现传感器读数 → MQTT 发布的一体化数据流sensor_read | mosquitto_pub -h api.xively.com -u api-key -t /v2/feeds/504/datastreams/0.csv -l其中-l即--stdin-line选项表示从标准输入逐行读取把每一行作为一个独立的 MQTT 消息发送。这意味着示例中虚构的sensor_read程序每次测量都必须输出一行文本。从源码看这一行为由 pub_client.c 中的pub_stdin_line_loop()实现它通过fgets逐行读取 stdin去掉行尾换行符后立即调用my_publish()发送该行若某行超过缓冲长度初始 1024 字节会以 1024 字节为步长动态扩容缓冲区。值得注意的是-l模式依赖线程支持WITH_THREADING未编译线程支持时程序会直接报错退出见 pub_client.c。命令行示例订阅数据在 MQTT 世界里读取数据通过**订阅subscription**完成。客户端向 broker 声明自己关心某个 topic之后该 topic 上每出现一条新消息broker 就会推送给订阅者。订阅 Xively 某个 datastream 只需一条命令mosquitto_sub -h api.xively.com -u api-key -t /v2/feeds/504/datastreams/0.csv执行后mosquitto_sub会持续保持连接每当 feed 504 的 datastream 0 有更新就把 CSV 数据作为一行文本打印到标准输出对应 sub_client.c 中收到消息后调用print_message()的逻辑。用户可以用 Ctrl-C 退出。mosquitto_sub还有几个便于日常监控的选项见 sub_client.c 的用法说明-t可重复使用一次订阅多个 topic-v冗余输出打印消息时同时显示 topic 与负载-F自定义输出格式-C n收到 n 条消息后自动断开退出-R不打印 retained陈旧消息-q订阅 QoS默认 0。Last Will and Testament遗嘱机制Last Will and Testament常简称 Will是 MQTT 最具特色的机制之一用于实现极简的连接状态监控客户端在连接CONNECT阶段向 broker 登记一个遗嘱一个 topic 加一条消息如果客户端之后非正常断开——即没有发送 DISCONNECT 报文就断线掉电、断网、进程崩溃等——broker 会立刻代它向遗嘱 topic 发布这条消息而正常退出发送了 DISCONNECT则不会触发遗嘱。基于此可以设计一个经典的在线指示灯客户端连接成功后向某个 topic 发布1同时把遗嘱设为向同一 topic 发布0。那么任何订阅者只要盯着这个 topic就能判断该客户端是否在线看到0即说明客户端异常掉线。原文还提到在 Xively 的语境下可以配合平台的 trigger触发器在收到遗嘱消息时发出告警通知。mosquitto_sub和mosquitto_pub都支持遗嘱参数原文示例mosquitto_sub -h api.xively.com -u api-key -t /v2/feeds/504/datastreams/0.csv --will-topic /v2/feeds/12345/datastreams/0.csv --will-payload 0含义如果这个mosquitto_sub进程意外断开Xively broker 会把值0发布到 feed 12345 的 datastream 0。原文也坦承由于mosquitto_sub只提供有限的遗嘱参数组合这个示例并非最实用的用法——完整能力的遗嘱通常要在自有客户端里配置。与遗嘱相关的完整命令行参数如下见 client_shared.c 的参数解析与 mosquitto_pub.1.xml 手册参数作用--will-topic topic遗嘱消息要发布的 topic必填其余遗嘱参数依赖它--will-payload payload遗嘱消息内容若只给 topic 不给 payload则发送零长度消息--will-qos 0|1|2遗嘱消息的 QoS 等级--will-retain遗嘱消息是否设置 retained 标志参数解析器还做了严格的合法性校验--will-payload或--will-retain出现但未提供--will-topic时程序会直接报错退出见 client_shared.c。遗嘱机制的源码级原理从当前仓库源码可以完整还原一条遗嘱的一生登记客户端把遗嘱参数通过mosquitto_will_set_v5()写入客户端对象见 client_shared.c 的调用。底层实现是 will_mosq.c 的will__set()它校验 topic 合法性不能含通配符/#、payload 长度上限MQTT_MAX_PAYLOAD与 UTF-8 编码然后把遗嘱以struct mosquitto_message_all形式保存在客户端对象的will字段中发送客户端发起 CONNECT 时send_connect.c 会把 CONNECT 报文的遗嘱标志位置位并把遗嘱 topic、payload、QoS、retain 标志MQTT v5 下还包括遗嘱属性逐字段写入报文触发broker 侧当检测到连接异常断开时调用context__send_will()见 context.c如果客户端处于非正常断开状态且登记了遗嘱broker 就以该遗嘱的 topic/QoS/payload 代为发布这条消息然后清除遗嘱。这正是broker 替客户端发送最后一条消息的机制本体。编写你自己的客户端原文指出要充分发挥 MQTT 的优势最终往往需要为你的特定应用编写自己的 MQTT 客户端而不是停留在命令行工具层面。Mosquitto 项目为此提供了官方客户端库libmosquittoC 语言源码位于 lib/ 目录与 C 封装mosquittopplib/cpp/mosquittopp.cpp。C 客户端库的核心 API 包括mosquitto_new()创建客户端、mosquitto_connect()连接、mosquitto_publish()发布、mosquitto_subscribe()订阅、mosquitto_will_set()设置遗嘱以及配套的回调注册函数连接回调、消息回调、发布完成回调等。仓库中的 examples 目录提供了可以直接对照学习的完整可编译示例examples/publish/basic-1.c最简发布客户端examples/subscribe/basic-1.c最简订阅客户端examples/subscribe_simple/含单订阅与多订阅两种写法并演示回调方式。此外当年 mqtt.org 软件页还列出了 Java、Python 以及 Arduino 等低功耗设备上的多种语言客户端实现这意味着同一套 MQTT 协议可以打通从云端服务器到单片机的整条链路。MQTT Beyond Xively完整的 MQTT 能做什么原文特别指出Xively 的 MQTT 服务是一种受限的 MQTT 实现它的 topic 必须严格映射到 feed/datastream 路径因此那些在完整 MQTT 里才真正发挥威力的功能在 Xively 上没有意义最典型的就是主题通配符。标准 MQTT 的订阅 topic 支持两级通配符匹配单个层级例如订阅sensors//temperature可接收sensors/room1/temperature与sensors/room2/temperature#匹配任意多层例如订阅sensors/#可接收sensors下所有层级的全部消息。配合通配符、retained 消息、QoS 分级与遗嘱机制完整 MQTT 足以支撑发布/订阅解耦、断线重连、状态保留与在线监控等丰富的物联网场景。对 MQTT 协议本身更完整的说明可阅读仓库内随项目维护的 mqtt.7 手册。如果你想在本地起一个标准 MQTT broker 亲自试验这些特性本仓库的 src/ 目录就是 Mosquitto broker 的完整实现仓库根目录的 mosquitto.conf 提供了可直接参考的 broker 配置示例构建方法见 README-compiling.md。搭建完成后你既可以用本仓库的 mosquitto_pub / mosquitto_sub 与自己编写的客户端在同一 broker 上互发消息也可以用它验证通配符订阅与遗嘱触发等全部 MQTT 特性。赞分享物联网消息队列后端【免费下载链接】mosquittoEclipse Mosquitto - An open source MQTT broker项目地址https://gitcode.com/gh_mirrors/mosquit/mosquitto点击查看免费下载相关推荐Mosquitto 快速入门用 MQTT 命令行客户端对接 Xively原 Pachube/Cosm数据平台Mosquitto 快速入门用 MQTT 命令行客户端对接 Xively原 Pachube/Cosm数据平台 本文整理自本仓库历史博客《Quick sta后端消息队列消息路由Eclipse Mosquitto 快速上手与源码构建指南MQTT Broker、客户端库与 mosquitto_pub / mosquitto_sub 实战Eclipse Mosquitto 快速上手与源码构建指南MQTT Broker、客户端库与 mosquitto_pub / mosquitto_sub 实战物联网消息队列后端Mosquitto 快速上手指南用 mosquitto_pub 与 mosquitto_sub 发布、订阅消息并实现客户端连接监控Mosquitto 快速上手指南用 mosquitto_pub 与 mosquitto_sub 发布、订阅消息并实现客户端连接监控 本文基于 Mosquitt物联网消息队列后端网络/通信上一篇告别数据追踪7款FitBit替代方案保护你的健康隐私下一篇gorush中的内存碎片优化减少内存碎片提升性能创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考