大家好,欢迎来到IT知识分享网。
LWT 全称为 Last Will and Testament,也就是我们在连接到 Broker 时提到的遗嘱,包括遗嘱Topic、遗嘱 QoS、遗嘱消息等。
顾名思义,当 Broker 检测到 Client 非正常地断开连接的时候,就会向遗嘱Topic里面发布一条消息。遗嘱相关的设置是在建立连接的时候,在 CONNECT 数据包里面的 Variable header(可变头与) Payload(有效载荷) 中 指定的。
- Will Flag:是1否0使用 LWT
- Will Topic:遗嘱主题名,不可使用通配符(在 CONNECT报文中的 有效载荷 中 设置)
- Will Qos:发布遗嘱消息时使用的 QoS 等级,如果遗嘱标志(Will Flag)被设置为0,遗嘱QoS也必须设置为0(0x00)
- Will Retain:遗嘱消息的 Retain 标识
- Will Message:遗嘱消息内容(在 CONNECT报文中的 有效载荷 中 设置)
Broker 在以下情况下认为 Client 是非正常断开连接的:
- Broker 检测到底层的 I/O 异常;
- Client 未能在 Keep Alive 的间隔内和 Broker 之间有消息交互;
- Client 在关闭底层 TCP 连接前没有发送 DISCONNECT 数据包;
- Broker 因为协议错误关闭和 Client 的连接,比如 Client 发送了一个格式错误的 MQTT 数据包。
如果 Client 通过发布 DISCONNECT 数据包断开连接,这个属于正常断开连接,不会触发 LWT 的机制,同时,Broker 还会丢弃掉这个 Client 在连接时指定的 LWT 参数。
使用场景
在客户端 A 进行连接时候,遗嘱消息设定为”offline“,客户端 B 订阅这个遗嘱主题。当 A 异常断开时,客户端 B 会收到这个”offline“的遗嘱消息,从而知道客户端 A 离线了。
Connect Flag 报文字段
Bit | 7 | 6 | 5 | 4 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|
User Name Flag | Password Flag | Will Retain | Will QoS | Will Flag | Clean Start | Reserved | |
byte 8 | X | X | X | X | X | X | X |
遗嘱消息在客户端正常调用 disconnect 方法之后并不会被发送。
Will Flag 作用
简而言之,就是客户端预先定义好,在自己异常断开的情况下,所留下的最后遗愿(Last Will),也称之为遗嘱(Testament)。这个遗嘱就是一个由客户端预先定义好的主题和对应消息,附加在CONNECT的可变报文头部中,在客户端连接出现异常的情况下,由服务器主动发布此消息。
当Will Flag位为1时,Will QoS和Will Retain才会被读取,此时消息体中要出现Will Topic和Will Message具体内容,否则Will QoS和Will Retain值会被忽略掉。
当Will Flag位为0时,则Will Qos和Will Retain无效。
命令行示例
下面是一个Will Message的示例:
- Sub端clientid=sub预定义遗嘱消息:
mosquitto_sub --will-topic test --will-payload die --will-qos 2 -t topic -i sub -h 192.168.1.1
- 客户端 clientid=alive 在 192.168.1.1(EMQ服务器) 订阅遗嘱主题
mosquitto_sub -t test -i alive -q 2 -h 192.168.1.1
- 异常断开Sub端与Server端(EMQ服务器)连接,Pub端收到Will Message 。
根据遗嘱的属性和触发机制,我们不难看出,遗嘱常用于获取设备的连接状态。
最佳使用:
我想让我的APP或者上位机或者网页一登录的时候获取设备的状态 在线还是离线
设备端只需要这样设置
注意:MQTT本身有遗嘱设置
所以大家可以设置遗嘱 ,注意哈,发布的主题自己随意哈,假设是aaaaa 假设设置的遗嘱是 {data:state,state:offline} 注意遗嘱的retain 必须设置为1 ,即让服务器保留这个消息
如果这样设置了,那么只要 设备掉线了,服务器就会向订阅aaaaa主题的APP或者上位机或者网页发送{data:state,state:offline}
但是只这样设置还不行,因为你会发现每次APP或者上位机或者网页只要一启动就会收到{data:state,state:offline}
所以需要下一步
在设备成功连接MQTT的时候主动发个消息,发送的主题必须和上面一样哈aaaaa 假设消息是 {data:state,state:online} 注意消息的retain 必须设置为1 ,即让服务器保留这个消息
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/154046.html