【问题标题】:MQTT: How to know which msg a puback is for?MQTT:如何知道 puback 用于哪个味精?
【发布时间】:2012-12-26 07:20:09
【问题描述】:

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

问题是:

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

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

我正在使用 mqttjs 和 paho mqttv3 btw。

【问题讨论】:

  • 找出问题所在。显然,您需要专门为您从 MQTT 服务器发布的消息分配一个 messageId。如果你不这样做,将使用一个随机数,并且 puback 中的 messageId 发送回服务器,packet.messageId,将是不同的。在专门给了一个消息id之后,来自puback的messageId和我发布时指定的一样。这是故意的吗????

标签: mqtt


【解决方案1】:

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

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

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

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

【讨论】:

  • 是的,我会将每个味精的记录保存给客户。关于 QOS 1 和 2 需要 messageId,在未指定 messageId 时捕获/通知用户不是更好吗?而不是分配一个随机数,以某种方式发回的 puback 不使用。
  • 我说的是协议本身,恐怕我无法评论 Paho 库的工作原理。
猜你喜欢
  • 2015-01-13
  • 1970-01-01
  • 2019-09-05
  • 1970-01-01
  • 2020-07-11
  • 2020-04-20
  • 1970-01-01
  • 2021-02-13
  • 1970-01-01
相关资源
最近更新 更多