【发布时间】:2017-01-24 04:22:48
【问题描述】:
我正在为我的 android 项目实施 Paho MQTT Java 客户端。它基本上是一个即时通讯系统。发布和订阅实现对我来说工作得很好,但我遇到了一个问题。订阅的客户端能够在消息发布时接收消息,但是系统检查客户端(订阅者)何时接收/传递消息的能力有点难以实现,我认为这是因为 MQTT 没有支持。
有人知道如何以不同的方式实现这个逻辑吗?
【问题讨论】:
标签: mqtt
我正在为我的 android 项目实施 Paho MQTT Java 客户端。它基本上是一个即时通讯系统。发布和订阅实现对我来说工作得很好,但我遇到了一个问题。订阅的客户端能够在消息发布时接收消息,但是系统检查客户端(订阅者)何时接收/传递消息的能力有点难以实现,我认为这是因为 MQTT 没有支持。
有人知道如何以不同的方式实现这个逻辑吗?
【问题讨论】:
标签: mqtt
MQTT 协议没有内置的端到端交付通知。没有办法知道一个主题有多少订阅者,它可以在 0 到很多之间。
如果您需要端到端传递通知,那么您需要将其构建到您的应用程序中,方法是为每条消息的有效负载添加一个唯一 ID,然后从客户端发布具有该 ID 的另一条消息(可能在单独的主题上)订阅了原始主题。消息也应该在 QOS 2 发布和订阅,以确保它们只传递一次。
【讨论】:
根据 MQTT 上的文档,您现在可以设置具有方法 deliveryComplete(IMqttDeliveryToken token) 的 MqttCallback,根据文档说明将调用此回调方法
当消息的传递已经完成,并且所有的确认都已经收到时。
为确保交付,请将 QoS(服务质量)设置为 2。
如果您仍然对这种方法有疑问,您可以使用另一种方法,在该方法中,您可以期待来自客户端的 acknowledgement 消息传递消息,但这只是 mqtt 的另一个开销,它可以满足要求使用与否。
您可以在他们的github 上探索更多信息,它还有示例代码以了解更多关于 Mqtt 的工作原理。
希望对你有帮助
【讨论】:
deliveryComplete(IMqttDeliveryToken token) 在代理成功发布您的消息时调用,当客户端收到您的消息时不会调用。
delivered这应该可以达到目的。如果要保证消息的传递,可以将QoS 设置为2,并将cleanSession 标志设置为false