用四个 Trace View 读懂 MQTT 流量
Grid 看精确报文,Stream 看数值变化,Topics 看流量结构,Sparkplug 看重建后的会话。
- 作者:
- Mqttable
- 更新:
本页目录10 个章节
加载中...
Grid 看精确报文,Stream 看数值变化,Topics 看流量结构,Sparkplug 看重建后的会话。
加载中...
当 MQTT 系统的表现不符合预期时,第一个难题往往是不知道该从哪里查起。Mqttable Trace 将实时 MQTT 流量整理成四个各有侧重的 View,帮助你检查单条报文、追踪数值变化、了解 Topic 活动,以及调试 Sparkplug 会话。本章会说明每个 View 能看见什么,以及如何根据问题选择合适的 View。
每个 Trace View 都用来回答一种不同的 MQTT 流量问题。用 Grid 检查单条报文,用 Stream 追踪数值随时间的变化,用 Topics 了解流量去了哪些 Topic,用 Sparkplug 检查节点、设备、指标与会话。
| 从这里开始 | 最适合回答的问题 | 只有这个 View 增加的能力 |
|---|---|---|
| Grid | 这个 Client 精确发送或接收了哪些 MQTT 报文? | 报文级字段与 Message Details |
| Stream | 哪个数值在何时发生了多大变化? | 单个 Client 的时间序列与相邻 Payload Diff |
| Topics | 已加载流量在 Topic 命名空间中如何分布? | Topic 分组、计数和可展开的原始报文 |
| Sparkplug | 能重建出哪些节点、设备、指标和会话状态? | Sparkplug 会话、清单、序列状态,以及当前 Trace 消息对应的 Findings |
先看问题,不要先看哪种视觉形式更顺眼。问题发生变化时就切换 View,不要强迫一种投影回答所有问题。
**最适合:**协议顺序、报文方向、确认链路、MQTT 属性,以及 Mqttable 实际观察到的精确 Payload。
Grid 显示 Trace 记录的每一条 MQTT 报文。沿一行依次阅读时间戳、客户端 ID、类型、方向、主题、QoS、Retain 与 Payload 或原因。如果紧凑列不够,就打开该行;Message Details 会把选中报文的身份、Topic、Payload、属性和大小放在一起。

Grid 保留报文级链路:两个 Client 会话、四行 QoS 1 报文,以及选中接收 PUBLISH 的 JSON 与属性。
**常见误判:**Topic Filter 会从可见结果中排除 PUBACK 这类没有 Topic 的报文。这不能证明确认报文缺失。得出“没有出现控制报文”的结论前,先重置 Topic Filter。
**何时切换:**需要看趋势而不是逐条报文时切到 Stream;需要知道每个 Topic 有多少保留行时切到 Topics。
**最适合:**遥测漂移、尖峰、振荡,以及相邻消息之间的字段级变化。
Stream 会主动收窄查看范围。选择一个 Client;Mqttable 从该 Client 收到的 PUBLISH 中提取数值序列。序列标签显示最新值,图表把数值对齐到时间轴,Topic tab 切换当前比较对象,Payload Diff 可用于比较上一条与当前值。
下图的数据来自一条每 300 ms 发送一次的定时消息。它的 JSON Payload Template 会在每次发送时重新生成 temperature、humidity 和 pressure 三个随机值,因此图中正好有三条线,每条线都覆盖至少五分钟、超过 1,000 个采样点。

一条 300 ms 定时消息通过 JSON Payload Template 生成三个随机数;Stream 把每条序列至少五分钟内收到的 1,000+ 个采样点转换成正好三条线。
常见误判:
**何时切换:**需要核对 PUBACK、Flag、属性或报文顺序时切到 Grid;需要比较多个 Topic 的流量时切到 Topics;需要理解 Sparkplug 生命周期语义时切到 Sparkplug。
**最适合:**发现高噪声命名空间、判断哪些 Topic 占据了大部分保留流量,以及比较同一 Topic 中的 SEND 与 RECV 行。
Topics 按 Topic 对保留的 Trace 行进行分组。每个分组旁的数字是当前纳入范围的行数,不是 Broker 吞吐量。展开分组会回到原始报文,包括客户端 ID、方向、QoS、Payload 与时间戳。没有 Topic 的 MQTT 报文会进入无主题,而不是被丢弃。

Topics 展示命名空间形状,同时保留原始报文;temperature 分组可以展开为 publisher SEND 与 subscriber RECV 行。
常见误判:
**何时切换:**需要跨 Topic 的精确顺序或 Message Details 时切到 Grid;需要查看某个 Topic 内的数值趋势时切到 Stream。
**最适合:**Sparkplug B 节点生命周期、设备清单、指标 Alias、序列连续性,以及当前 Trace 消息对应的协议 Findings。
Sparkplug 是语义重建,不只是另一种分组。Mqttable 会识别 Sparkplug Topic、解码 Protobuf Payload,并根据 NBIRTH、NDATA、DBIRTH、DDATA 等消息建立节点会话。先看摘要,再阅读选中节点的状态、bdSeq、seq、设备、最近事件、清单与 Findings。

五条有效 Sparkplug 消息重建出一个在线节点会话、一个设备、序列状态、最近事件和节点清单。
常见误判:
**何时切换:**需要查看事件背后的原始方向、Topic、二进制 Payload 或 MQTT 属性时切到 Grid;需要按流量比较完整 Sparkplug 命名空间时切到 Topics。
| 控件 | 改变什么 | 必须记住的边界 |
|---|---|---|
| 客户端 | 把 Grid 或 Topics 限制到选中 Client;Stream 只选择一个 Client | Client 被隐藏,不代表它没有活动 |
| 主题 | 使用纯文本子串匹配,或 MQTT + / # 通配符匹配 | 匹配区分大小写;没有 Topic 的控制报文会从可见结果消失 |
| 载荷过滤器 | 在渲染后的 Payload 中查找不区分大小写的文本子串 | 它不是 JSONPath、Schema 或二进制解码器 |
| 心跳 | 切换 PINGREQ 与 PINGRESP 的可见性 | 被隐藏的心跳行仍保留在 Trace 中 |
| 加载更早消息 | 以有界分页向 Grid 加入更早的行 | Grid 从最近 200 行开始,且不能超过该 Broker 配置的保留上限 |
| Sparkplug 刷新 / 会话选择 | 重建语义状态,或切换当前显示的会话 | 它只使用当前 Trace 窗口,不会从 Broker 拉取缺失历史 |
Filter 改变的是可见性,不是保留状态。写下结论前,应明确自己检查的 Broker tab、Client 或会话、当前 Filter,以及实际检查的 Trace 窗口。
每项行动都有自己的来源与安全边界。除非界面明确显示,否则不要假设当前 Filter、选中行或可见图表会自动成为后续行动的范围。
Trace 会显示 Mqttable 记录的 Client 侧 SEND 与 RECV 消息,以及对应的时间戳、报文字段和 Payload。在已加载的行内,你可以用它了解报文顺序、数值变化、Topic 分布和 Sparkplug 重建状态。
但 Trace 本身无法显示:
准确描述你看到的结果:“Mqttable 观察到 subscriber 收到了这条 PUBLISH”符合 Trace 显示的内容;“整个系统已经处理消息”还需要查看下游日志或应用数据。要检查 Client 视角之外的网络报文,请继续阅读 PCAP 分析。