4

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

问题是:

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

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

我正在使用 mqttjs 和 paho mqttv3 顺便说一句。

4

1 回答 1

9

具有 QoS 1 或 2 的 MQTT PUBLISH 消息需要消息 id 作为数据包的一部分。消息 ID 用于标识 PUBACK(或 QoS 2 的 PUBREC/PUBREL/PUBCOMP)所指的消息。这是一个重要的功能,因为您可能同时有多个“正在运行”的消息。

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

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

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

于 2012-12-27T23:47:00.160 回答