拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Serial Studio MQTT 实战:发布/订阅双向配置与 Sparkplug B 边节点集成

Serial Studio MQTT 实战发布/订阅双向配置与 Sparkplug B 边节点集成【免费下载链接】Serial-StudioOpen-source telemetry dashboard. Supports UART, BLE, MQTT, Modbus, CAN Bus and more.项目地址: https://gitcode.com/GitHub_Trending/se/Serial-Studio本文基于 Serial Studio 仓库中的 MQTT 技能文档 app/rcc/ai/skills/mqtt.md 展开系统讲解该项目 Pro 版 MQTT 功能的两条主线作为订阅端subscriber把 Broker 上的遥测当设备帧解析上屏以及作为发布端publisher把仪表板数据推送到 Broker并深入 Sparkplug B v1.0 边节点协议在两侧的落地方式。读完本文你将掌握project.mqtt.publisher.*与project.mqtt.subscriber.*两套 API 的完整配置流程、凭据与 TLS 安全机制、帧解析器在 MQTT 场景下的行为边界以及通过源码定位连接故障的排查路径。双向定位先决定用哪一侧Serial Studio 的 MQTT 能力由两个相互独立的模块承载配置面完全分离订阅端project.mqtt.subscriber.*仪表板订阅一个主题过滤器每个到达的 payload 都会被当作来自串口设备的帧解析上屏。这是更常见的场景——当 IoT 传感器或网关已经在向 Broker 发布数据、你只想可视化它时。订阅端本质是一个 I/O 驱动配置完成后需要通过io.setBusType把设备总线切到mqtt不确定取值时先用io.listBuses发现再调用io.connect建立连接。这两个调用都受设备门控device-gated。发布端project.mqtt.publisher.*仪表板把数据发布到指定主题典型场景是 Serial Studio 充当本地设备与车队/云端之间的网关。发布端有四种载荷模式mode字段0 RawRxData原始字节按接收到的样子发布1 ScriptDrivenJavaScript 脚本逐条塑形消息2 DashboardCsv3 DashboardJson设置enabled: true即开始发布全程不涉及io.connect。从源码可以印证这一定位。发布端门面类 core/Storage/MQTT/Publisher.h 中定义了enum Mode { RawRxData 0, ScriptDriven 1, DashboardDataCsv 2, DashboardDataJson 3 }并且该类同时实现了FrameConsumer、IRawByteTap、IRawFrameTap三个接口——即它既是数据块的消费者又旁挂了原始字节流与原始帧流两条通路。订阅端则是一个标准的 HAL 驱动 core/Devices/IO/Drivers/MQTT.h头文件注释写明它订阅单个 MQTT 主题过滤器并把接收到的 payload 馈入帧读取器管线。两套代码都编译在BUILD_COMMERCIAL宏之后属于 Pro 功能集。配置工作流getConfig → setConfig → 连接 → 校验两侧的 API 都采用补丁式命令只传你要改的键未传的字段保持原值。完整流程是五步读取当前状态调用project.mqtt.subscriber.getConfig{}或project.mqtt.publisher.getConfig{}。响应中带有规范枚举表mqttVersions、sslProtocols、peerVerifyModes发布端还有modes用来解释和选择整型字段而不是靠猜。这一点在 core/Api/API/Handlers/MqttHandler.cpp 的六个命令注册中可以看到getConfig的说明明确提示password is NEVER returned。打补丁project.mqtt.subscriber.setConfig{hostname, port, ...}或project.mqtt.publisher.setConfig{...}。常见 Broker 默认端口1883明文或 8883TLS。源码中两侧构造函数都把默认端口初始化为 1883见 core/Devices/IO/Drivers/MQTT.cpp 与 core/Storage/MQTT/Publisher.cppcore/Storage/MQTT/Publisher.cpp 中项目配置应用时也回落到 1883。主题语义订阅端topicFilter支持恰好一级和#多级、仅能放在末尾发布端主题根是topicBasenotificationTopicpublishNotifications则负责转发应用内通知。建立连接订阅端走io.setBusType切到 mqtt 总线后io.connect发布端只需setConfig{enabled: true}。校验project.mqtt.subscriber.getStatus{}返回isOpen与 endpointproject.mqtt.publisher.getStatus{}返回connected与messagesSent。core/Api/API/Handlers/MqttHandler.cpp 中messagesSent直接读取发布端原子计数器。一个值得注意的实现细节发布端主线程持有配置而所有 Broker 交互都在独立线程的PublisherWorker中完成见 core/Storage/MQTT/Publisher.h 的类注释。主线程与管线线程之间通过一组alignas(64)的原子镜像m_hotEnabled、m_workerMode等core/Storage/MQTT/Publisher.h做无锁同步避免逐帧读取 GUI 配置时产生数据竞争。凭据与 TLS技能文档对凭据与 TLS 有一系列硬约束源码逐一可印证每次setConfig都需要用户在聊天中显式点击确认alwaysConfirm因为凭据和 TLS 设置都挂在同一调用上。原则是把字段尽量聚合到少数几次调用里。password必须与username在同一次调用中提交。凭据对落入凭据保险库发布端或驱动设置订阅端在本机设置中是混淆obfuscation存储而非加密且永不写入项目文件。getConfig永不返回密码——发布端改用hasCredentials判断core/Api/API/Handlers/MqttHandler.cpp 中即通过vault.hasCredentials(hostname, port)生成该字段订阅端侧同样在 core/Api/API/Handlers/MqttHandler.cpp 计算。要清除发布端凭据对两个字段都传空字符串。实现上发布端持有CredentialVault成员并在配置变更时持久化/重载core/Storage/MQTT/Publisher.h 的reloadCredentialsFromVault/persistCredentialsToVault。TLS先置sslEnabled: true再从枚举表中选择sslProtocol与peerVerifyMode。生产 Broker 通常要求启用对端验证而不是 0/None。两侧驱动都携带完整的 TLS 面clientCertificatePath、privateKeyPath、keyPassphrase以及 ALPNalpnEnabled/alpnProtocol见 core/Devices/IO/Drivers/MQTT.h。订阅模式帧解析器依然生效即使处于订阅模式帧解析器也会对每个到达的 MQTT payload 执行——payload 就是帧体形状与你 UART 解析器看到的一致。Broker 发布 JSON 就用支持 JSON 的帧解析器发布 CSV 则默认的分隔符解析器开箱即用。这意味着 MQTT 订阅端完全复用了串口数据管线而不是另起一套解析逻辑这也是把 Broker 上的 payload 当设备帧这句话的具体含义。Sparkplug消费边节点订阅端Sparkplug 是叠加在 MQTT 上的约定边节点先用出生证书birth certificate声明自己的指标之后只发布发生变化的量。Serial Studio 两侧都实现了 Sparkplug B v1.0且都通过驱动/发布器的属性面配置而不是走setConfig。属性而非配置字段订阅端的sparkplugEnabled布尔与sparkplugGroupId字符串是 MQTT 订阅驱动的驱动属性不是project.mqtt.subscriber.setConfig的字段。用project.source.setProperty{sourceId, key, propertyValue}触达或让用户指向 MQTT 设置面板上的 Sparkplug 复选框。在 core/Devices/IO/Drivers/MQTT.h 中这两个属性以mqttConfigurationChanged通知且驱动内部有applySparkplugProperty专门处理core/Devices/IO/Drivers/MQTT.h。主题覆盖与组 ID 校验启用 Sparkplug 会覆盖topicFilter驱动改为订阅spBv1.0/#设置了组 ID 时则为spBv1.0/groupId/#。组 ID 被直接插值进该过滤器因此、#、/会被拒绝并保留原值——源码中有对应的rejectSparkplugGroupId校验core/Devices/IO/Drivers/MQTT.h。spBv1.0命名空间常量定义在 core/Protocols/Sparkplug/SparkplugLimits.h主题解析函数spBv1.0/group/verb/edge[/device]见 core/Devices/IO/Drivers/MQTT/SparkplugSession.cpp。解码、缓冲与 rebirthpayload 按 Sparkplug B v1.0 规范Eclipse Tahusparkplug_b.proto解码你不需要写帧解析器指标名、类型、线槽wire slots都来自出生证书。出生证书之前到达的数据先被缓冲若出生证书始终不来则丢弃与某节点序号失去同步的驱动会请求其重新发布出生证书rebirth request带限流——驱动内有m_lastRebirthMs时间戳哈希做限流见 core/Devices/IO/Drivers/MQTT.h。用project.mqtt.subscriber.getStatus{}校验其sparkplug块携带enabled、groupId、metrics已发现指标数以及拉取计数器seqGaps、capDrops、decodeErrors、ignoredMessages、preBirthBuffered、preBirthDropped、rebirthRequests、unsupportedMetrics——这些计数器在 core/Api/API/Handlers/MqttHandler.cpp 中直接由SparkplugSession::Counters填充。计数器结构与主题解析逻辑有独立单元测试app/tests/tst_sparkplug_session.cpp、app/tests/tst_sparkplug_payload.cpp。从出生证书生成项目至少一个出生证书到达后MQTT 设置面板的Create Project from Births按钮generateProjectcore/Devices/IO/Drivers/MQTT.h会构建项目每个边节点一个分组标题为node或node / device、每个指标一个数据集外加一个通过sparkplug内置Native模板解码驱动自身 delta 帧的数据源。它需要活动连接和至少一个出生证书目前没有对应的 API 动词所以需要把按钮指给用户。生成之后新发现的指标不会自动出现需要重新生成。生成的项目形态可参考仓库示例 examples/Sparkplug Example/Sparkplug Edge Node.ssproj。发布端Edge Node 模式发布端可以代替四种mode载荷之一改扮演边节点。它的四个字段——sparkplugEnabled、sparkplugGroupId、sparkplugEdgeNodeId、sparkplugDeviceId——位于 Project Editor 的 MQTT 发布表单Publish as Edge Node分区下project.mqtt.publisher.setConfig没有这些键需要引导用户操作该表单四个属性在 core/Storage/MQTT/Publisher.h 中均有 Q_PROPERTY 声明。关键行为仅在组 ID与边节点 ID 都非空时才激活设备 ID 可选留空则在节点级发布。Edge Node 模式是替换而非叠加所选mode载荷它独占会话期间会清空并丢弃原始字节队列与脚本队列。出生、死亡已布防的 will与 rebirth 均由它自动处理配置在客户端断开期间被锁存latched因此会话中途编辑配置不会在活节点下切换载荷格式。发布端的 Sparkplug 编解码实现位于 core/Storage/MQTT/SparkplugPublisher.h配套测试有 app/tests/tst_sparkplug_publisher.cpp 与 app/tests/tst_sparkplug_payload.cpp。端到端联调可参考示例 examples/Sparkplug Example/sparkplug_edge_node.py——一个 Python 模拟边节点脚本。常见陷阱速查技能文档列出的高频问题每一条都有源码依据陷阱说明源码佐证云 Broker 强制 TLSAWS IoT Core、HiveMQ Cloud 等托管 Broker 拒绝明文。订阅端连不上云 Broker 时先查sslEnabled与端口8883驱动默认端口 1883 的初始化core/Devices/IO/Drivers/MQTT.cpp连接中改配置变更订阅端字段会调度一次重连预期短暂断流不要盲目重试scheduleReconnectIfActive/applyPendingToClientcore/Devices/IO/Drivers/MQTT.h客户端 ID 唯一性强制客户端唯一的 Broker 会拒绝相同clientId的第二个连接。每实例设显式 ID或发布端customClientId: false自动重新生成两侧均有regenerateClientId()core/Devices/IO/Drivers/MQTT.h主题通配符#只能在末尾恰好一级。畸形过滤器在订阅时才被拒绝而不是 setConfig 时订阅端持有QMqttTopicFilter m_topicMatcher做匹配core/Devices/IO/Drivers/MQTT.h发布频率钳制publishFrequency钳制到 1–30 Hz用于把 Broker 流量与设备帧率解耦kMinPublishHz 1、kMaxPublishHz 30、kDefaultPublishHz 10core/Storage/MQTT/Publisher.h参数校验在 core/Api/API/Handlers/MqttHandler.cpp空仪表板上的 Sparkplug订阅端只显示出生证书声明过的指标。链路开着但metrics为 0 时说明节点尚未重新发布出生检查组 ID 或重启节点计数器经getStatus暴露core/Api/API/Handlers/MqttHandler.cpp故障排查去哪里找源码技能文档的最后一节指出MQTT 客户端、其 TLS 处理与 Sparkplug B 编解码位于source/core/Devices当前仓库布局中对应core/Devices与core/Storage/MQTT。当连接失败的原因不在上述陷阱清单内或用户原样引用了某条 Broker/TLS 错误时用该错误文本在上述目录内搜索读取命中的那一个文件即可——debugging技能app/rcc/ai/skills/debugging.md规定了引用源码的规则。建议的源码阅读顺序core/Devices/IO/Drivers/MQTT.h / core/Devices/IO/Drivers/MQTT.cpp——订阅端驱动连接状态机、主题过滤、凭据落盘、Sparkplug 订阅会话core/Storage/MQTT/Publisher.h / core/Storage/MQTT/Publisher.cpp——发布端门面模式枚举、发布频率、凭据保险库、线程间原子镜像core/Devices/IO/Drivers/MQTT/SparkplugSession.h 与 core/Devices/IO/Drivers/MQTT/SparkplugSession.cpp——Sparkplug B 状态机序号跟踪、出生缓存、rebirth 限流core/Protocols/Sparkplug/SparkplugPayload.h——Sparkplug 载荷协议层core/Api/API/Handlers/MqttHandler.cpp——六个project.mqtt.*API 命令的实现是 API 行为最直接的参照。官方帮助文档侧的延伸阅读doc/help/Drivers-MQTT.md、doc/help/MQTT-Publisher.md、doc/help/MQTT-Topics.md、doc/help/Sparkplug-B-Edge-Nodes.md。相关示例工程仓库examples/目录下有三个与本文主题直接对应的可运行示例配置形态与上文流程一一对应examples/LTE modem/LTE 模组经串口/UDP 进入仪表板后走 MQTT 发布含lte_mqtt.py模拟器与.ssproj项目文件examples/MQTT Subscriber Example/HSL Helsinki Public Transit.ssproj纯订阅端形态消费真实公交数据主题的现成项目examples/Sparkplug Example/Sparkplug 边节点联调sparkplug_edge_node.py模拟边节点发布 birth/delta。这些示例的共同价值在于它们展示了project.mqtt.*配置项落盘到.ssproj后的真实取值形态可作为手工核对getConfig返回值的基准。【免费下载链接】Serial-StudioOpen-source telemetry dashboard. Supports UART, BLE, MQTT, Modbus, CAN Bus and more.项目地址: https://gitcode.com/GitHub_Trending/se/Serial-Studio创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门