Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MQTT:如何知道puback用于哪个消息?_Mqtt - Fatal编程技术网

MQTT:如何知道puback用于哪个消息?

MQTT:如何知道puback用于哪个消息?,mqtt,Mqtt,我正在尝试设置一个MQTT服务器,它将客户端发送的消息持久化到本地数据库中。每个消息都有一个“成功接收”标志,当接收客户端为每个接收到的消息(QOS=1)返回puback时,我希望翻转该标志 问题是: 当我发布消息时,服务器会正确地从接收客户端接收回puback。但是,messageId与发布客户端数据包的messageId不同。我知道这是有意的。但是,我将无法在DB中找到正确的消息来翻转标志。如果客户端A背对背地向客户端B发送两条QOS=1的消息,该怎么办?服务器如何区分返回的2个Puback

我正在尝试设置一个MQTT服务器,它将客户端发送的消息持久化到本地数据库中。每个消息都有一个“成功接收”标志,当接收客户端为每个接收到的消息(QOS=1)返回puback时,我希望翻转该标志

问题是:

当我发布消息时,服务器会正确地从接收客户端接收回puback。但是,messageId与发布客户端数据包的messageId不同。我知道这是有意的。但是,我将无法在DB中找到正确的消息来翻转标志。如果客户端A背对背地向客户端B发送两条QOS=1的消息,该怎么办?服务器如何区分返回的2个Puback

也许MQTT客户机正在做一些神奇的事情来映射我丢失的MessageID


我正在使用mqttjs和paho mqttv3 btw。

QoS为1或2的MQTT发布消息需要消息id作为数据包的一部分。消息id用于标识PUBACK(或用于QoS 2的PUBREC/PUBREL/PUBCOMP)引用的消息。这是一个重要的特性,因为您可能同时有多条消息处于“飞行中”

您可能缺少的一个重要点是,客户机彼此完全独立。这意味着消息ID对于客户端是唯一的(以及消息流的方向、代理到客户端或客户端到代理)。代理为源自代理的消息生成消息ID,客户端为源自客户端的消息生成消息ID;消息ID对于每个方向都是独立的,因此代理和客户机不需要跟踪另一方在做什么

如果要跟踪哪些传入消息已发送到所有订阅客户端,则需要跟踪哪些传出消息与传入消息相关,并且仅在收到这些传出消息的所有Puback后才触发DB。这将告诉您哪些消息已成功发送到收到消息时订阅的所有客户端


如果您只需要一个已发送到代理的所有消息的日志,并且可以假设发送工作正常,那么生活就简单多了。只需在代理主机上创建一个侦听“#”主题或您感兴趣的任何内容的客户端,然后使用client on#message()回调(或您的库如何管理)来处理消息并将其存储在DB中。

解决了问题。显然,您需要专门为从MQTT服务器发布的消息分配messageId。如果不这样做,将使用一个随机数,并且发送回服务器的puback中的messageId packet.messageId将不同。在明确给出消息id之后,puback中的消息id与我在发布时指定的消息id相同。这是有意的吗???是的,我将为每个消息保存一个记录给客户。关于QOS 1和QOS 2需要messageId,在未指定messageId时捕获/通知用户不是更好吗?我说的是协议本身,我恐怕无法评论泛美卫生组织图书馆是如何工作的。