1 MQTT介绍
MQTT是一种基于客户端/服务器架构(CS架构)的发布/订阅模式的消息传输协议。它最初由IBM开发,并被设计成为轻量、开放、简单以及易于实现的消息传输协议。MQTT很适合应用于环境受限(窄带、高延迟、不可靠的网络环境)的机器与机器(M2M)、物联网(IoT)设备之间的消息通信。
2 MQTT的遗嘱消息
MQTT协议通常使用在一些网络非常糟糕的应用场景,MQTT客户端与MQTT服务器之前的连接经常会由于网络原因非正常断开。
说明:对于使用MQTT协议通信双方,连接的非正常断开指的是,客户端在没有向服务器发送DISCONNET
请求的情况下断开了TCP连接。这在MQTT中称为连接的非正常断开,这种情况往往是由于网络突然中断、客户端掉电等不可预料的情况。
MQTT的遗嘱消息(Last Will and Testament,简称LWT
)通常用于通知其他MQTT客户端自己的非正常掉线。LWT的具体使用如下说明:
- MQTT客户端在连接MQTT服务器的时候(即
CONNECT
请求),可以在连接参数里面设置Last Will消息,该消息跟正常的消息一样,也有topic; - 成功连接上MQTT服务器后,服务器会为该客户端保存该条Last Will消息;
- 当MQTT服务器检测到MQTT客户端非正常断开后,MQTT服务器会将该客户端设置的该条Last Will消息推送给订阅了该topic的客户端。这样一来,其他客户端就能及时知道该客户端离线了;
- 如果连接是正常断开(即客户端向服务器发送了
DISCONNET
请求),那么该条Last Will消息不会推送给其他订阅了该topic的客户端
客户端设置的Last Will消息跟其他发布的消息一样,也需要指定Topic、Payload、QoS以及RETAIN标志位。MQTT服务器会在以下四种情况下,将Last Will消息发布出去:
- 服务器检测到客户端的Socket I/O异常,或者服务器检测到客户端的网络有异常;
- 服务器在指定的KeepAlive时间超时后,没有收到客户端的心跳消息;
- 客户端主动关闭了Socket连接,但是关闭Socket连接之前并没有向服务器发送
DISCONNET
请求; - 由于协议错误原因,服务器关闭了客户端的Socket连接。
Last Will消息中的Topic、Payload、QoS以及RETAIN标志位跟通过PUBLISH
指令发布消息的含义一样。区别在于Last Will消息是在建立连接的时候提交给MQTT服务器的。
——————–【参考文章】——————–