是否有一种方法可以存储特定客户端的未发送消息?

问题描述 投票:0回答:1

我想用Paho MQTT JS+Mosquitto broker 1.6.8实现客户端和管理员之间的通信方式(双向),在保留消息和持久会话方面遇到了一些麻烦。

我想完成的是我的web客户端订阅了一个管理员发布的主题(比方说topicA),而管理员订阅了一个客户端发布的主题(topicB)。当任何一个用户收到该话题的消息时,它就会出现在屏幕上,而且它们一直出现在前面的下面,这样它们就形成了一个消息列表。当他们都在线时,他们必须看到正在发送的消息,如果他们离线,他们也必须看到新旧消息。另外,用户必须有清除消息列表的功能。

到目前为止,我已经尝试了什么。 我的第一个尝试是将已发布的消息保留值设置为true,这样消息就可以传递给未来的用户。但是,我看到只有最后一条消息被保留。我研究了一下,发现我可以在broker和客户端之间建立一个持久的会话(通过cleanSession: false),这样如果我把消息的qos设置成一个大于0的值(0或1),并且客户端订阅了这个主题,他们就会得到所有未交付的消息。这对我来说是行不通的,或者至少是我期望的工作方式。我试过删除Mosquitto Db并重新启动(没有任何改变)。我也试过对所有的客户端使用同一个ID,而对所有的管理员使用另一个ID,因为我想,也许,经纪人只为一个特定的客户端ID保存消息,所以如果一个客户端用一个完全不同的ID连接,他们将不会收到消息。

有没有一种方法可以将所有未发送的消息(因为一个客户端在线而管理员离线,或者反之)而不是只发送最后一个(保留)?或者有什么方法可以保留多个消息(在我看来,如果我可以通过发送一个null payload来清除保留的消息,会更好)?

javascript websocket mqtt mosquitto paho
1个回答
0
投票

首先每个客户端必须有一个唯一的客户端id。当出现客户端id冲突时,最老的连接客户端将被断开。

其次,是订阅的QoS,而不是发布,决定了broker是否会为离线客户端的持久会话排队发送消息。

因此,客户端要想在离线状态下接收发布的消息,就必须

  1. 此前已经连接并订阅了QoS为1或2的主题。
  2. 当重新连接时,它必须使用与上次相同的客户端ID
  3. 将清洁设置为假

消息只会传递一次,所以不需要清除消息,但如果你不需要接收排队的消息,请将cleansession flash设置为true。

经纪人只会保留在给定主题上发布的最后一条消息,该消息的保留位被设置,没有办法改变。

© www.soinside.com 2019 - 2024. All rights reserved.