客户端如何知道发送的消息设备是否接收到了呢

环境信息

  • EMQX 版本:4.3.5
  • 操作系统及版本:
  • 其他

问题描述

web服务给设备发送一条消息,web服务是否能够通过某种方式知道设备是否接收到消息了呢?以及什么方式呢?

配置文件及日志

通常有两种:

  1. 应用层自己做 ack 机制
  2. emqx 有钩子事件 message.acked 来表明 emqx 已收到客户端对这个消息的回执。这个事件可以用 规则引擎, webhook 或者 exhook 方式来处理

好的,谢谢


$events/message_acked
$events/message_dropped
一条消息,最终要么被dropped,要么被acked。只要这两种情况吧?如果这两个事件都没有触发,说明消息还在emqx的服务器上,还需要等待,看最终消息时dropped还是acked吧?这样我就可以监听这两个事件,来判断消息是发送成功了,还是消息发送失败了(失败了就可以重新发送)

还不太一样。需要查看文档里面的对钩子事件的描述。

简单来说,对于 QoS0 消息:由于客户端没有 ack 回复到 emqx,所以可以以 message_delivered 的触发为准
对于 QoS1, QoS2 是可以按照 message_acked 来确定的

另外message_dropped 和前面两个还不太一样 它是 发布出的消息被丢弃后 这是基于发布者的事件,是客户端发布消息到 emqx 可能触发的。前两者是基于订阅者,emqx 消息发向你的客户端的时候回触发的。

这样我就可以监听这两个事件,来判断消息是发送成功了,还是消息发送失败了(失败了就可以重新发送…

按这种逻辑是可以判断的,注意这几个事件的区别即可

好的,谢谢

我发送一条消息,消息id设置的是-1890011158(int类型,发送客户端是使用java),然后接收到的$events/message_acked事件中的ID是"id":“0005D959BD422FEB1DF314007ABE0002”。那我如何判断是我发送的消息确认被接收了呢?