在文章翻译前,简单补充说明一下,MQTT官网中,没有使用到Last Will and Testament 这个描述,根据3.1版本协议,3.1.1版本协议,5.0版本协议,能与之关联的规范用语词为
Will Message
, 在5.0版本协议中给出了具体定义:An Application Message which is published by the Server after the Network Connection is closed in cases where the Network Connection is not closed normally (即:网络连接异常断开时,服务器发送的一种应用消息)。在本篇文章中我会把LWT翻译为:未来消息
原文:www.hivemq.com/blog/mqtt-e...
本篇文章在翻译过程中,对相关内容进行了一些删减,比如文字超链接
作者: HiveMQ Team
发布时间: March 9, 2015
更新于: 2023年6月27日
未来消息在MQTT中是一个强大的功能,它允许客户端指定一条消息,在自己发生意外断开连接时,由代理服务器自动发送这条消息。它提供了一种可靠的通信,并且确保了客户端可以优雅的处理异常断开情况。在异常断开情况下,当客户端需要通知其他客户端自己不在线或者传递一些重要信息时,未来消息就显得非常有价值。
让我们开始学习本节内容吧。
什么是"未来消息"?
在普遍存在网络不可靠的场景下,MQTT客户端遇到偶发性意外中断就是一件平常事(比如:连接断开了或者没电了)。理解断开连接类型对能否采用合适的措施至关重要(优雅的断开:断开连接时发布一条断开消息,非优雅的断开:断开连接时不发任何断开消息)
MQTT中的未来消息可以应对非优雅式的连接中断事件,并确保能合适的处理此类意外事件
"未来消息"可以让客户端在他们自己发生意外中断连接情况下,通知到其他客户端。 当一个客户端连接到代理服务器时,它可以定制一条自己的"未来消息"。未来消息也是要遵循MQTT消息结构的,它也会包含主题,保留消息标志,QoS,消息负载体 ,代理服务器在客户端发生意外断开前,会一直存储这条未来消息。一旦代理服务器侦测断开发生,代理服务器会广播这条未来消息至已订阅了此消息主题的客户端,如果客户端使用DISCONNECT方式断开,代理服务器会抛弃存储的"未来消息"。
断开包结构
利用未来消息,你可以采用多种策略去处理客户端断开,并把离线状态通知给其它客户端。
如何在MQTT 客户端配置"未来消息"呢?
为了给客户端定制"未来消息",你需要把"未来消息"包含在CONNECT消息中,CONNECT消息是被用来初始化客户端和代理服务器初始化用的。
MQTT代理服务器会在什么时候发送"未来消息"呢?
根据MQTT 3.1.1 规范, 代理服务器在如下情况发生时,会自动发送"未来消息":
- I/O 错误 或者 网络失败: 如果代理服务器监测到I/O或者网络连接错误时,它会分发"未来消息"
- 保活期间通信失败: 如果客户端在代理服务器允许的保活期间内发生了通信失败,"未来消息"会给发送
- 未发送DISCONNECT消息而关闭连接: 当客户端没有发送DISCONNECT包时就中断网络连接,代理服务器会确保"未来消息"被分发下去
- 由于协议错误,代理服务器关闭了连接: 如果代理服务器因为协议错误关闭了网络连接,代理服务器也会发送"未来消息"
了解"未来消息"发送的时间和原因对我们利用这个功能实现最佳实践奠定了基础。
在什么时候使用"未来消息"?
事实证明,"未来消息"在提醒客户端"意外断开连接"事件来讲是非常有价值的。当和保留消息结合使用时,对于存储客户端通信状态来讲,它会变成一个强大的工具。
例如, 通过设置 带Offline
消息负载体的lastWillMessage
时, 启用lastWillRetain标志, 然后指定lastWillTopic
为 client1/status , 接下来发布一个Online
保留消息到client1/status , client1 可以让新接入的订阅客户端拿它在线的状态。如果client1意外断开连接,代理服务器将发布带有Offline
"消息负载体的"未来消息"作为新的保留消息,确保已订阅这个主题的客户端在client1离线时可以收到这个"未来消息",并保持它的当前状态一直是最新的。
"未来消息"不仅能提醒客户端意外断开连接,而且通过提供有价值的客户端状态信息,也可帮助维护系统的完整性。将"未来消息"与保留消息结合起来,可以创建一个健壮的解决方案,该解决方案存储并通信特定主题上的最新客户机状态,确保所有订阅者都能获得可靠的最新数据。这种方法支持客户端之间的无缝集成和同步,增强了MQTT网络的整体弹性和功能。
未来消息的重要性: 小结
总而言之,未来消息在确保高效通信和维护系统处理意外断开事件上,作用是至关重要的。通过将未来消息与保留消息结合起来,开发人员可以存储特定主题上的客户端通信状态,从而为订阅了特定主题的客户端提供有价值的信息 "未来消息"让MQTT网络更具适应性、无缝集成和可靠的数据更新,使其成为各种应用程序的强大工具。通过了解"未来消息"的好处和最佳实践,您可以利用这个特性来创建健壮和有效的 MQTT解决方案。
以下非原文翻译
为了更好理解"未来消息",可以使用"MQTTHarvey"工程中的"ExampleLWTDetail.java"文件来实践。
关于其它的准备工作可参见"MQTT 实践"
实验步骤:
- 启动工程
- 启动MQTTX客户端,订阅"harvey"主题
- 通过InteIIJ IDEA菜单中的红色停止按钮来终止工程运行
- 终止之后,在MQTTX客户端中可以收到"Offline"字样的内容