遗嘱消息是 MQTT 为那些可能出现 意外断线 的设备提供的将 遗嘱 优雅地发送给第三方的能力。意外断线包括但不限于:
- 因网络故障或网络波动,设备在保持连接周期内未能通讯,连接被服务端关闭
- 设备意外掉电
- 设备尝试进行不被允许的操作而被服务端关闭连接,例如订阅自身权限以外的主题等
当应用需要即时的感知设备下线状态时,可以使用 MQTT 遗嘱消息实现。
- 设备连接时,指定 遗嘱主题和遗嘱内容(可以将client id写到内容中,用于服务器判断接收的遗嘱消息来自哪个客户端)
- 服务端监听遗嘱主题,当设备意外断线时,服务端能立即收到遗嘱内容
- 设备端连接成功时,可以主动往遗嘱主题发布一条消息,标志设备上线
安装 EMQX
docker run -d --name emqx -p 1883:1883 -p 8081:8081 -p 8083:8083 -p 8883:8883 -p 8084:8084 -p 18083:18083 emqx/emqx:v4.0.0
在客户端连接属性上设置遗嘱主题和内容
使用 MQTTX 软件模拟客户端,在连接属性上设定好遗嘱主题和内容。
本例中设定:
Last-Will Topic:online-status-change
Last-Will Payload:
{
"clientId":"mqttx_3e826f48",
"message":"I have lost",
"status":"offline"
}
点击 Connect 按钮,发起正常连接。
服务器监听遗嘱主题
使用 MQTT.fx 模拟服务器端,监听遗嘱主题 online-status-change
。
点击 MQTTX 软件右侧顶部的关闭按钮,模拟客户端掉电异常断线。
观察 MQTT.fx 监听的 online-status-change
的主题,可以看到立即收到了设备的遗嘱内容(由Broker发出)。
服务器收到遗嘱内容,根据内容马上可以判断出设备掉线了。
资料:
https://www.emqx.io/docs/zh/v4.4/getting-started/install.html