当客户端被 MQTT 代理驱逐时,它的 LWT 会被发送吗?

When a client is evicted from an MQTT broker, will it's LWT be sent?

当客户端连接到 MQTT 代理时,代理会检查以确保客户端仍处于连接状态。

如果客户端突然断开连接,重新连接的速度比较快,可能会在上一个客户端断开连接之前连接上。新客户端使用与之前客户端相同的客户端 ID 连接。

发生这种情况时,据我了解,前一个客户端的连接已从代理中移除。这种驱逐会触发发送 LWT 吗?如果是这样,有没有办法阻止第一个客户端的 LWT 被发送到订阅该主题的任何其他客户端?

不,LWT 没有发送(至少没有用 mosquitto)并且不会因为 keepalive 还没有过期。

这可以通过 mosquittomosquitto_sub

轻松测试
  1. 使用 mosquitto -p 1889
  2. 在端口 1889 上启动 mosquitto
  3. 首先启动 mosquitto_sub 实例 mosquitto_sub -p 1889 -i foo -v -t '#' --will-topic bar --will-payload "testing"
  4. mosquitto_sub -p 1889 -v -t '#'
  5. 开始第二个 mosquitto_sub(收听 LWT)
  6. 开始第三个 mosquitto_sub 使用相同的客户端 ID 使用 mosquitto_sub -p 1889 -i foo -v -t '#'

您应该在 mosquitto 日志中看到第一个和第三个客户端将彼此踢出代理(如写入标准输出),而第二个客户端不应显示任何正在发布的 LWT 消息。