只靠订阅端收到的消息,是无法直接判断“发布者是谁”。MQTT 报文本身不会自动把发布端 ClientID 塞进你看到的 payload。
先用 EMQX Trace 反查发布来源,这是最快的:
emqx ctl trace start topic <你的topic> /tmp/topic-trace.log debug
# 复现后停止
emqx ctl trace stop topic <你的topic>
如果你已经怀疑某个发布端:
emqx ctl trace start client <clientid> /tmp/client-trace.log debug
emqx ctl trace stop client <clientid>
集群场景用 emqx ctl traces ...(跨节点追踪)。
一句话就是:你现在是 trace 一个特定的 clientid,你可以直接 trace 特定的 topic 来看是谁在 publish。
后续版本可以加强
如果你要让客户端长期都能区分发布者,需要把发布者标识放进消息:
- 放在 topic 里,比如
device/<publisher_id>/data - 放在 payload 字段里,比如
{"publisher_id":"xxx", ...} - MQTT 5 用 User Property(比如
publisher_id=xxx)
如果你要在 Broker 侧做审计/转存,可以用规则 SQL 拿clientid、username、topic、pub_props再写库。
