我正在尝试设置一个 MQTT 服务器,它将客户端发送的消息保存到本地数据库中。每条消息都有一个“成功接收”标志,当接收客户端为收到的每条消息(QOS = 1)返回 puback 时,我想翻转该标志。
问题是:
当我发布消息时,服务器正确接收从接收客户端返回的消息。但是,messageId 与发布客户端数据包时的 messageId 不同。我知道这是故意的。但随后我将无法在数据库中找到正确的消息来翻转标志。如果客户端 A 连续向客户端 B 发送 2 条 QOS = 1 的消息怎么办?服务器如何区分返回的 2 个 pubacks?
也许 MQTT 客户端正在做一些神奇的事情来映射我丢失的 messageId?
顺便说一句,我正在使用 mqttjs 和 paho mqttv3。
QoS 1 或 2 的 MQTT PUBLISH 消息需要消息 ID 作为数据包的一部分。消息 id 用于标识 PUBACK(或 QoS 2 的 PUBREC/PUBREL/PUBCOMP)所引用的消息。这是一个重要的功能,因为您可能同时有多个“正在传输”的消息。
您可能忽略的重要一点是,客户之间是完全分开的。这意味着消息 ID 对于客户端(以及消息流方向、代理到客户端或客户端到代理)是唯一的。代理为源自代理的消息生成消息 ID,客户端为源自客户端的消息生成消息 ID;每个方向的消息 ID 都是独立的,因此代理和客户端无需跟踪对方正在做什么。
如果您想跟踪哪些传入消息已发送到所有订阅客户端,则需要跟踪哪些传出消息与传入消息相关,并且仅在收到这些传出消息的所有 PUBACK 后才触发数据库。这将告诉您哪些消息已成功发送到收到消息时订阅的所有客户端。
如果您只想要已发送到代理的所有消息的日志,并且可以假设发送工作正常,那么生活会容易得多。只需在代理主机上创建一个侦听“#”主题或您感兴趣的任何内容的客户端,然后使用客户端 on_message() 回调(或您的库管理它的方式)来处理消息并将其存储在数据库中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)