【问题标题】:How to check when a broker has delivered a message to a client(Subscriber)如何检查代理何时将消息传递给客户端(订阅者)
【发布时间】:2017-01-24 04:22:48
【问题描述】:

我正在为我的 android 项目实施 Paho MQTT Java 客户端。它基本上是一个即时通讯系统。发布和订阅实现对我来说工作得很好,但我遇到了一个问题。订阅的客户端能够在消息发布时接收消息,但是系统检查客户端(订阅者)何时接收/传递消息的能力有点难以实现,我认为这是因为 MQTT 没有支持。

有人知道如何以不同的方式实现这个逻辑吗?

【问题讨论】:

    标签: mqtt


    【解决方案1】:

    MQTT 协议没有内置的端到端交付通知。没有办法知道一个主题有多少订阅者,它可以在 0 到很多之间。

    如果您需要端到端传递通知,那么您需要将其构建到您的应用程序中,方法是为每条消息的有效负载添加一个唯一 ID,然后从客户端发布具有该 ID 的另一条消息(可能在单独的主题上)订阅了原始主题。消息也应该在 QOS 2 发布和订阅,以确保它们只传递一次。

    【讨论】:

    • "消息也应该在 QOS 2 发布和订阅" @hardillb 在实现唯一有效负载 id 时 QoS 1 还不够吗?
    • QOS 2 节省了在双重传送的情况下必须跟踪消息
    • 我知道 QoS2 的作用。对于聊天应用程序,OP 无论如何都必须跟踪消息 ID,以正确排序无序或延迟的交付。所以从技术上讲,我猜它可以在 QoS1 上实现。
    • 是的,但如果你让经纪人做一些工作会更容易做到
    【解决方案2】:

    根据 MQTT 上的文档,您现在可以设置具有方法 deliveryComplete(IMqttDeliveryToken token) 的 MqttCallback,根据文档说明将调用此回调方法

    当消息的传递已经完成,并且所有的确认都已经收到时。

    为确保交付,请将 QoS(服务质量)设置为 2。

    如果您仍然对这种方法有疑问,您可以使用另一种方法,在该方法中,您可以期待来自客户端的 acknowledgement 消息传递消息,但这只是 mqtt 的另一个开销,它可以满足要求使用与否。

    您可以在他们的github 上探索更多信息,它还有示例代码以了解更多关于 Mqtt 的工作原理。

    希望对你有帮助

    【讨论】:

    • deliveryComplete(IMqttDeliveryToken token) 在代理成功发布您的消息时调用,当客户端收到您的消息时不会调用。
    • @George 是的,可能是这样,因为您的问题与订阅者端消息的确认有关,我建议您使用一个 rest api,可以将每条消息标记为 delivered这应该可以达到目的。如果要保证消息的传递,可以将QoS 设置为2,并将cleanSession 标志设置为false
    猜你喜欢
    • 1970-01-01
    • 2019-08-03
    • 1970-01-01
    • 1970-01-01
    • 2019-11-06
    • 1970-01-01
    • 2012-12-31
    • 2012-10-02
    • 1970-01-01
    相关资源
    最近更新 更多