环境信息
- EMQX 版本:4.3.5
- 操作系统及版本:
- 其他
问题描述
我发送一条消息,消息id设置的是-1890011158(int类型,发送客户端是使用java),然后接收到的$events/message_acked事件中的ID是"id":“0005D959BD422FEB1DF314007ABE0002”。那我如何判断是我发送的消息确认被接收了呢?
我发送一条消息,消息id设置的是-1890011158(int类型,发送客户端是使用java),然后接收到的$events/message_acked事件中的ID是"id":“0005D959BD422FEB1DF314007ABE0002”。那我如何判断是我发送的消息确认被接收了呢?
这里的 id 是指 message id, 不是 packet id. message id 是有 EMQX 内部自动生成的唯一性的id
那我在java服务端如何能获取到这个id呢?我如何通过$events/message_acked事件中的message id,判断是我发送的哪条消息呢?
首先,我们需要区分这几个概念
EMQX 内部的 Message ID,通常用 id
表示, 取值是 16 字节的二进制。它代表是的 EMQX 内部对每条消息唯一的标识,是 EMQX内部生成的,每条消息发布 EMQX 都会生成这样一个 ID。这条消息被投递给 N 个订阅者时,这个 ID 仍然不变的。
MQTT 协议上的 Packet ID
,取值是 1-65535, 通常这个 ID 是没有对外暴露的,它指的是 MQTT 协议在传输的时候,标识每条 QoS1 和 QoS2 消息的 ID,是 MQTT 协议上的。而且只在一个客户端对服务端的MQTT连接中有效,一般来说是自增的。例如发布者发布一条消息 A,此时他的 Packet ID 是 128
,这条消息被转发到了 3 个订阅者,在分别投递给这三个客户端时,他们的 Packet ID 可能是任何一个1-65535的数值。(可以参考 MQTT 协议标准)
我不太清楚 Java 客户端的 Message ID 是什么,肯定不是 1 ,也不像是 2 (你给的值看起来不太对…)所以他可能只是你 SDK 软件内部的一个标识而已。
在 EMQX 如果你想追踪一个消息的发布、投递成功,可以分别用 message_publish
事件,和 message_acked
事件,这里面都包含有 Message ID
。
注: message_acked 事件,仅在投递消息的QoS等级为QoS1, QoS2 时会触发。