【问题标题】:is there a way of storing the undelivered messages for a particular client?有没有办法为特定客户存储未传递的消息?
【发布时间】:2020-05-01 20:53:36
【问题描述】:

我正在尝试使用 Paho MQTT JS + Mosquitto 代理 1.6.8 实现客户端和管理员之间的通信方法(双向),但我在保留消息和持久会话方面遇到了一些问题。

我想要完成的事情: 我的 Web 客户端订阅了管理员发布的主题(比如说 topicA),管理员订阅了客户端发布的主题(topicB)。当任何用户收到关于该主题的消息时,它会出现在屏幕上,并且他们会继续出现在上一个主题的下方,以便形成一个消息列表。当他们都在线时,他们必须看到正在发送的消息,如果他们离线,他们也必须看到旧消息和新消息。此外,用户必须能够清除消息列表。

到目前为止我所做的尝试: 我的第一次尝试是将已发布消息的保留值设置为 true,以便可以将消息传递给未来的订阅者。但是,我看到只保留最后一条消息。我调查发现我可以在broker和客户端之间建立一个持久会话(通过cleanSession:false),这样如果我将消息的qos设置为大于0(0或1)的值并且客户端订阅了主题,他们会收到所有未送达的消息。这对我不起作用,或者至少是我期望它起作用的方式。我试过删除 Mosquitto Db 并重新启动(没有改变任何东西)。我还尝试为所有客户端使用相同的 id,为所有管理员使用另一个 id,因为我认为代理可能只为特定的 clientID 保存消息,所以如果具有完全不同 ID 的客户端连接,他们不会得到消息。

有没有办法传递所有未传递的消息(因为一个客户端在线而管理员离线,反之亦然)而不仅仅是最后一个(保留)?或者有没有办法保留多个消息(我认为更好,如果我可以通过发送空有效负载来清除保留的消息)?

【问题讨论】:

    标签: javascript websocket mqtt mosquitto paho


    【解决方案1】:

    首先,每个客户端都必须有一个唯一的客户端 ID。当客户端 ID 冲突时,最早连接的客户端将断开连接。

    其次是订阅的 QoS,而不是发布决定代理是否会为具有持久会话的离线客户端排队消息

    因此,客户端要在离线时接收发布的消息,它必须

    1. 之前已连接并订阅了 QoS 为 1 或 2 的主题
    2. 重新连接时必须使用与上次相同的客户端 ID
    3. 将 cleansession 设置为 false

    消息只会发送一次,因此无需清除消息,但如果您不必接收排队的消息,请将 cleansession flash 设置为 true。

    代理将仅保留在给定主题上发布的最后一条消息,该消息已设置保留位,无法更改。

    【讨论】:

    • 感谢您的回答。假设我将 Qos 设置为 2 并且 cleanSession=false:假设 ID 为“client1”的客户端订阅了 topicA,然后断开连接。断开连接时,客户端“admin1”向 topicA 发送 3 条不同的消息。然后client1连接,它会收到这个配置的3条消息吗?我不明白唯一 ID 的部分,这是否意味着同一个客户端(我想查看未传递的消息)必须始终具有相同的 ID?因为如果发生冲突,最旧的 id 将被断开,消息是否丢失?
    • 是的,它应该收到这 3 条消息。至于客户端 ID,您只能让一个客户端与给定的客户端 ID 连接。当第二个客户端使用相同的 id 连接时,它将从代理启动第一个客户端。传递给这两个客户端中的第一个的任何消息都不会传递给第二个客户端。如果这是一个网页,请确保在您离开/关闭页面时主动断开连接。
    • 谢谢,关于断开连接,是否应该实现断开连接()函数,即使在重新加载时也会调​​用,以及在关闭事件中?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 2021-11-24
    • 2016-04-24
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    相关资源
    最近更新 更多