具有用户属性(时间戳)的 LWT:不正常断开连接

Posted

技术标签:

【中文标题】具有用户属性(时间戳)的 LWT:不正常断开连接【英文标题】:LWT with user properties (timestamp): disconnect ungracefully 【发布时间】:2022-01-17 19:05:53 【问题描述】:

MQTT 新手在这里

使用用于 EMQX 代理的 MqttNet 库在 .NET 上进行开发:

我正在使用 MQTTv5 功能“用户属性”在发布时向我的消息添加时间戳。这是完美的工作。

但是,我还需要标记 LWT 消息。 在我的连接方法中,我可以提供一个包含时间戳用户属性的 LWT。 现在,当我使用 MQQTX 桌面客户端订阅我的 LWT 主题时;我收到了这些消息和 LWT;到目前为止一切顺利。

但是当我终止我的程序进程时(这样,不优雅地断开连接);我立即收到一条 LWT 消息。问题是我的“时间戳”用户属性具有建立连接时的时间戳(以及 LWT 首次设置)。

我可以在连接方法中将值留空,因此空值 = 不正常的断开连接;但这不是很优雅

是否有可能截获从代理发送的 LWT 消息,并设置时间戳?

编辑: 我找到了“规则引擎”,它让我使用代理时间戳。但到目前为止我只能将它添加到有效负载中(最好是用户属性)

【问题讨论】:

【参考方案1】:

我不这么认为,由代理设置时间戳,因为当它注意到客户端已经离开时,它实际上是发布 LWT 消息的。

我不相信在 MQTT 规范级别有任何东西(我真的需要重新阅读 v5 消息属性的东西)来做到这一点,但这可能是可以通过代理中的适当插件来完成的如果它支持这样的事情。

【讨论】:

感谢您的回答。我找到了 EMQ 代理的“规则引擎”;它让我可以拦截具有给定有效负载的消息,例如“不正常的断开连接”,让我使用经纪人设置的时间戳重新发布。我唯一没有发现的是如何访问规则中的用户属性;默认情况下将其添加到有效负载中

以上是关于具有用户属性(时间戳)的 LWT:不正常断开连接的主要内容,如果未能解决你的问题,请参考以下文章

移动网络状态断开连接

如何在 ASP 经典中捕获窗口断开连接的时间戳[重复]

在 Cassandra 中混合轻量级事务和正常写入

AB机器正常TCP连接后,B突然断网,A处于什么状态?

如何断开除sa之外的sql server中的所有用户?

为啥我的电脑网络连接老是断开?