当客户端被 MQTT 代理驱逐时,它的 LWT 会被发送吗?
When a client is evicted from an MQTT broker, will it's LWT be sent?
当客户端连接到 MQTT 代理时,代理会检查以确保客户端仍处于连接状态。
如果客户端突然断开连接,重新连接的速度比较快,可能会在上一个客户端断开连接之前连接上。新客户端使用与之前客户端相同的客户端 ID 连接。
发生这种情况时,据我了解,前一个客户端的连接已从代理中移除。这种驱逐会触发发送 LWT 吗?如果是这样,有没有办法阻止第一个客户端的 LWT 被发送到订阅该主题的任何其他客户端?
不,LWT 没有发送(至少没有用 mosquitto)并且不会因为 keepalive 还没有过期。
这可以通过 mosquitto
和 mosquitto_sub
轻松测试
- 使用
mosquitto -p 1889
在端口 1889 上启动 mosquitto
- 首先启动
mosquitto_sub
实例 mosquitto_sub -p 1889 -i foo -v -t '#' --will-topic bar --will-payload "testing"
- 用
mosquitto_sub -p 1889 -v -t '#'
开始第二个 mosquitto_sub
(收听 LWT)
- 开始第三个
mosquitto_sub
使用相同的客户端 ID 使用 mosquitto_sub -p 1889 -i foo -v -t '#'
您应该在 mosquitto 日志中看到第一个和第三个客户端将彼此踢出代理(如写入标准输出),而第二个客户端不应显示任何正在发布的 LWT 消息。
当客户端连接到 MQTT 代理时,代理会检查以确保客户端仍处于连接状态。
如果客户端突然断开连接,重新连接的速度比较快,可能会在上一个客户端断开连接之前连接上。新客户端使用与之前客户端相同的客户端 ID 连接。
发生这种情况时,据我了解,前一个客户端的连接已从代理中移除。这种驱逐会触发发送 LWT 吗?如果是这样,有没有办法阻止第一个客户端的 LWT 被发送到订阅该主题的任何其他客户端?
不,LWT 没有发送(至少没有用 mosquitto)并且不会因为 keepalive 还没有过期。
这可以通过 mosquitto
和 mosquitto_sub
- 使用
mosquitto -p 1889
在端口 1889 上启动 - 首先启动
mosquitto_sub
实例mosquitto_sub -p 1889 -i foo -v -t '#' --will-topic bar --will-payload "testing"
- 用
mosquitto_sub -p 1889 -v -t '#'
开始第二个 - 开始第三个
mosquitto_sub
使用相同的客户端 ID 使用mosquitto_sub -p 1889 -i foo -v -t '#'
mosquitto
mosquitto_sub
(收听 LWT)
您应该在 mosquitto 日志中看到第一个和第三个客户端将彼此踢出代理(如写入标准输出),而第二个客户端不应显示任何正在发布的 LWT 消息。