1

我有两台机器,正在测试带有 Sparkplug B 有效负载的 MQTT 桥连接。

我的桥梁按预期工作,但是当我模拟下图中注释的一些故障点时,事情没有按预期工作。我的期望是当图像中的三个点中的任何一个断开连接时,机器 B 上的代理上会出现 NDEATH。

当我杀死机器 A 上的发布者或本地 MQTT 代理时,我确实在订阅机器 B MQTT 代理时看到了预期的 NDEATH,但是当我拔出机器 A 和 B 之间的插头时,如图中的 #3 所示,我没有看到一个NDEATH!我已经等了很长时间,以确保 60 秒保持活动有足够的时间做出反应,据我所知,这通常是保持活动的 1.5 倍。

机器 A 上的发布者和代理继续运行,当第 3 点的连接重新联机时,所有消息都已传递,但我期待在桥连接断开时,任何已发布最后遗嘱和遗嘱的节点(LWT ) 会因为任何时候的连接丢失而看到 NDEATH。

我已经用 mosquitto、vernemq 和一些 hive-ce 进行了测试,但是 hive-ce 在功能上受到严重限制。我对 MQTT 桥接的理解是否遗漏了什么?不应该在所有三种情况下都发送 NDEATH 吗?

在此处输入图像描述

4

1 回答 1

2

火花塞规格

MQTT 在实时 SCADA/IIoT 应用程序中的一个关键方面是确保主 MQTT SCADA/IIoT 主机节点可以在 MQTT Keep Alive 期间知道基础设施中任何 EoN 节点的“状态”(请参阅​​第 3.1 节) .2.10 在 MQTT 规范中)。为了实现状态,定义和指定了一个已知的遗嘱主题和遗嘱消息。在 MQTT CONNECT 会话建立中注册的 Will Topic 和 Will Message,共同构成了我们所说的死亡证书。请注意,在任何 MQTT 客户端意外离线时交付死亡证书是 MQTT 协议规范的一部分,而不是此 Sparkplug™ 规范的一部分(有关如何建立 MQTT 会话的更多详细信息,请参阅 MQTT 规范中的第 3.1 节 CONNECT并保持)。

因此,在 MQTT 术语中,NDEATH 是一个“遗嘱”,如上所述,在MQTT 规范的第 3.1 节中定义:

如果 Will Flag 设置为 1,这表明如果 Connect 请求被接受,Will 消息必须存储在服务器上并与网络连接相关联。遗嘱消息必须在网络连接随后关闭时发布,除非服务器在收到 DISCONNECT 数据包时删除了遗嘱消息

总之,NDEATH 创建一个“遗嘱”,如果 MQTT 代理失去与发布者的连接(除非首先收到 DISCONNECT),它就会发布该遗嘱。

当您建立网桥时,它将中继发布在网桥配置为中继的任何主题上的消息。网桥只传递发布的消息;没有关于连接了哪些客户端的信息(或他们可能设置的任何“Will”),因此当桥接连接断开时,订阅者将不会收到 NDEATH。

监控网桥的连接状态不在规范中,因此选项因代理而异。例如,Mosquitto 可以(在桥接连接上使用“Will”)在连接断开时提供通知(参见notificationsmosquitto.conf 。这可能会为您提供一些选项来获取您需要的信息。

于 2021-08-09T08:50:47.120 回答