MQTT:如何知道puback的用途?

aso*_*ily 3 mqtt

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

问题是:

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

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

我正在使用mqttjs和paho mqttv3 btw.

ral*_*ght 6

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

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

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

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