MQTT:如何知道puback的用途?

时间:2012-12-26 07:20:10

标签: mqtt

我正在尝试建立一个MQTT服务器,它将客户端发送的消息保存到本地数据库中。每个消息都有一个“成功接收”标志,当接收客户端为每个收到的消息(QOS = 1)返回一个puback时,我想要翻转。

问题是:

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

也许MQTT客户端正在做一些神奇的事情来映射我错过的messageIds?

我正在使用mqttjs和paho mqttv3 btw。

1 个答案:

答案 0 :(得分:5)

具有QoS 1或2的MQTT PUBLISH消息需要消息ID作为数据包的一部分。消息id用于标识PUBACK(或用于QoS 2的PUBREC / PUBREL / PUBCOMP)引用的消息。这是一项重要功能,因为您可能会同时“在飞行中”收到多条消息。

您可能遗漏的重要一点是客户彼此完全分开。这意味着消息ID对于客户端是唯一的(消息流的方向,代理到客户端或客户端到代理)。代理为源自代理的消息生成消息ID,客户端为源自客户端的消息生成消息ID;消息ID对于每个方向都是独立的,因此代理和客户端不需要跟踪对方正在做的事情。

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

如果您只想记录已发送给代理的所有消息,并且可以认为发送正常,那么生活就会轻松得多。只需在代理主机上创建一个侦听“#”主题的客户端,或者您感兴趣的任何内容,然后使用客户端on_message()回调(或者您的库管理它)来处理消息并将其存储在数据库中