MQTT中的遗嘱和证明(Last Will and Testament, LWT)

news2024/11/24 23:07:56

在MQTT中,遗嘱和证明(Last Will and Testament, LWT)是一个很有用的功能,允许客户端指定一条消息,当非预期的断开连接发生时,由代理(broker)代替它们自动发布出去。提供了一个可靠通信机制,可以确保客户端能够优雅的处理连接断开,而不用将主题停留在一个不连续的状态。当客户端必须通知其他相关方它们的不可用状态,或者预期之外的断开发生时传输一些重要的信息,这个功能将非常有用。

LWT在MQTT的目的

在一些场景中,不稳定的网络很普遍,对于MQTT客户端来说,遇到意外的断开很常见,断电和断网都可能发生。理解了这一点,进而采取一些合适的举措就非常重要。
LWT允许客户端通知其他相关方关于它们的意外断开连接。当一个客户端连接到代理(broker),它可以指定一条遗嘱消息。**这个消息和其他常规的MQTT消息结构相同,包括一个主题、保留标志、QoS和负载。**代理(broker)存储这条消息,直到检测到来自客户端的意外断开连接。一旦检测到断开连接,代理(broker)就会广播这条遗嘱消息到所有订阅了相应主题的客户端。如果客户端使用DISCONNECT消息断开连接,代理(broker)就会抛弃存储的LWT消息。

通过使用LWT,可以实现多种策略来处理客户端的异常断开,通知其他客户端这个离线状态。

如何配置LWT消息

为了给一个MQTT客户端指定一条LWT消息,可以将其包含在CONNECT消息中,用来初始化客户端和代理(broker)之间的连接。

更多关于建立客户端和代理(broker)连接的详细信息,参见:http://t.csdnimg.cn/STgDy

MQTT代理何时发送LWT消息

根据 MQTT 3.1.1 specification,代理(broker)会在以下情况下发送LWT消息:

  1. I/O异常或网络失败: 如果代理(broker)检测到任务关于I/O或网络连接的问题,它就会分发LWT消息。
  2. 保活期间通信失败: 如果在保活周期内,客户端和代理(broker)通信失败,LWT消息就会被发送。在后续文章中会讨论MQTT保活。
  3. 客户端没有使用DISCONNECT关闭连接: 当客户端没有发送DISCONNETCT消息而中断了网络连接,代理(broker)也会发送LWT消息。
  4. 因为协议异常代理关闭连接: 如果因为协议异常代理关闭了连接,代理就会发送LWT消息。

理解了何时及为何代理(broker)发送LWT消息,就为最佳的使用该功能打下了基础。

何时使用LWT消息

事实证明,LWT为订阅的客户端提供意外断开连接预警的功能是非常有价值的。当结合保留信息一起使用时,LWT变成了一个有力的工具,在特定主题上用来存储、沟通客户端的状态。
比如,设置lastWillMessage消息的负载为Offine,启用lastWillRetainlastWillTopicclient1/status,随后向同一主题发布一条Online状态的保留消息,这样client1就能够让新订阅的客户端知道它的在线状态。一旦client1异常断开,代理(broker)就会发送Offine负载的LWT消息做为新的保留消息,这样,确保在client1脱机时,订阅该主题的客户端接收LWT消息并保持其当前状态的最新状态。
LWT不仅可通知订阅的客户端有关意外断开的信息,还可以通过提供有关客户端状态的有价值信息,确保系统的完整性。将LWT和保留消息结合,可以创建出有关存储、沟通客户端在指定主题上最新状态的健壮解决方案,确保所有订阅者获取稳定的更新。这种方式确保客户端之间无缝的集成和同步,全面加强了MQTT网络的可弹性和功能性。

结论

总之,MQTT中的LWT,在意外的客户端连接断开时确保高效沟通、维持系统完整性上至关重要。通过将LWT和保留消息结合,开发人员可以存储和传达特定主题的客户端状态,从而为订阅的客户端提供有价值的信息。通过加强弹性、无缝集成和可靠的更新,LWT加强了MQTT的网络,使之成为各类应用的强有力工具。理解了LWT的好处和最佳实践,借助此功能可以构建健壮、高效的MQTT解决方案。
后续章节将讨论
MQTT心跳机制和代理(broker)如何知道一个客户端是否在线。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1321484.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis原理之网络模型笔记

目录 1. 阻塞IO 2. 非堵塞IO 3. IO多路复用 ​3.1 select 3.2 poll 3.3 epoll 4. 信号驱动IO 5. 异步IO 6. Redis是单线程还是多线程 Redis采用单线程模型,这意味着一个Redis服务器在任何时刻都只会处理一个请求。Redis的网络模型涉及到阻塞I/O(Blo…

基于双目RGB图像和图像深度信息的三维室内场景建模matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 双目视觉原理 4.2 深度信息获取 4.3 表面重建 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 .....................................…

快速处理EDI数据映射:知行EDI Profiler 操作指南

一个完整的EDI项目通常由建立传输通道,处理数据映射以及集成内部业务系统三部分组成。对用户而言,基于知行之桥EDI系统进行自主实施最大的挑战便是处理数据映射。EDI报文读不懂,映射关系太复杂……这些问题给企业造成困扰的同时也阻挡了自主实…

【Linux】进程状态、进程优先级和进程切换

> 作者简介:დ旧言~,目前大二,现在学习Java,c,c,Python等 > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:了解冯诺依曼体系结构与操作系统,掌握…

RLC防孤岛负载测试:电力系统安全运行的重要保障

在电力系统中,孤岛效应是一个严重的问题,它可能导致电力系统的不稳定甚至崩溃。为了确保电力系统的安全运行,必须进行RLC防孤岛负载测试。RLC防孤岛负载测试是一种模拟电网故障后,对电力系统进行检测的方法,主要用于检…

css实现边框彩虹跑马灯效果

效果展示 代码实战 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-…

Ubuntu20.04 下编译安装 ffmpeg 和 ffplay

Ubuntu20.04 下编译安装 ffmpeg 和 ffplay 一、下载源码包二、安装依赖库三、编译四、添加环境变量五、验证是否成功六、问题 一、下载源码包 1.1 官方下载链接&#xff1a;http://ffmpeg.org/download.html 最新版本为6.1&#xff0c;点击 Download Source Code下载即可 &…

Apache Seatunnel本地源码构建编译运行调试

Apache Seatunnel本地源码构建编译运行调试 文章目录 1. 环境准备1.1 Java环境1.2 Maven1.3 IDEA1.4 Docker环境1.5 Mysql8.0.281.6 其它环境准备 2. 源码包下载3. idea项目配置3.1 项目导入3.2 maven配置3.3 项目JDK配置3.4 项目启动参数配置3.4.1 seatunnel项目启动参数配置3…

21.Servlet 技术

JavaWeb应用的概念 在Sun的Java Servlet规范中&#xff0c;对Java Web应用作了这样定义&#xff1a;“Java Web应用由一组Servlet、HTML页、类、以及其它可以被绑定的资源构成。它可以在各种供应商提供的实现Servlet规范的 Servlet容器 中运行。” Java Web应用中可以包含如下…

lua语法

lua语法 1.lua数据类型 lua 脚本输出乱码&#xff0c;将lua脚本改为UTF-8编码&#xff0c;并且需要DOS下修改代码页&#xff1a;CHCP 65001 即可。 基本语法 注释 print("script lua win")-- 单行注释--[[多行注释]]--标识符 类似于&#xff1a;java当中 变量、…

ASP.NET MVC+EntityFramework图片头像上传

1&#xff0c;先展示一下整体的效果 2&#xff0c;接下来展示用户添加以及上传头像代码、添加用户界面 前端代码如下&#xff1a; <div class"form-group">Html.LabelFor(model > model.img, "头像&#xff1a;", htmlAttributes: new { class &…

网络协议小记

一、TCP/IP协议 作为一个小萌新&#xff0c;当然我无法将tcp/ip协议的大部分江山和盘托出&#xff0c;但是其中很多面试可能问到的知识&#xff0c;我觉得有必要总结一下&#xff01; 首先&#xff0c;在学习tcp/ip协议之前&#xff0c;我们必须搞明白什么是tcp/ip协议。 1、…

IND-CCA DEM:AE AEAD

参考文献&#xff1a; [BN00] Bellare M, Namprempre C. Authenticated encryption: Relations among notions and analysis of the generic composition paradigm[C]//International Conference on the Theory and Application of Cryptology and Information Security. Berl…

网络安全之Linux环境配置及Linux基础知识讲解<三>

目录 一.下载安装Vmware二.下载安装Kali三.Linux目录结构四.Linux文件属性五.文件目录管理六.vim编辑器 一.下载安装Vmware Vmware官网&#xff1a;https://www.vmware.com 二.下载安装Kali Kali包含数百种工具&#xff0c;可用于各种信息安全任务&#xff0c;例如渗透测试、…

静态路由及动态路由

文章目录 静态路由及动态路由一、静态路由基础1. 静态路由配置2. 负载分担3. 路由备份4. 缺省路由5. 静态路由实操 二、RIP 动态路由协议1. RIP 协议概述2. RIP 协议版本对比2.1 有类路由及无类路由 3. RIP 路由协议原理4. RIP 计时器5. 度量值6. 收敛7. 示例 静态路由及动态路…

ADB:获取坐标

命令&#xff1a; adb shell getevent | grep -e "0035" -e "0036" adb shell getevent -l | grep -e "0035" -e "0036" 这一条正确&#xff0c;但是&#xff0c;grep给过滤了&#xff0c;导致没有输出 getevent -c 10 //输出10条信息…

【Apache-StreamPark】Flink 开发利器 StreamPark 的介绍、安装、使用

【Apache-StreamPark】Flink 开发利器 StreamPark 的介绍、安装、使用 1&#xff09;框架介绍与引入1.1.&#x1f680; 什么是 StreamPark1.2.&#x1f389; Features1.3.&#x1f3f3;‍&#x1f308; 组成部分1.4.引入 StreamPark 2&#xff09;安装部署2.1.环境要求2.2.Hado…

electron与cesium组件入门应用功能

electron与cesium组件入门应用功能 运行应用效果图&#xff1a; electron应用目录&#xff0c;需要包括三个文件: index.html main.js package.json (一)、创建一个新项目 目录名称&#xff1a;project_helloWolrd (二)、生成package.json文件 npm init --yes(三&#x…

Glycosaminoglycans Assay Kit(糖胺聚糖检测试剂盒)--Chondrex

糖胺聚糖&#xff08;glycosaminoglycans&#xff0c;GAGs&#xff09;是一种携带负电荷的多糖链&#xff0c;位于大多数结缔组织和许多不同类型细胞的细胞外基质&#xff08;extracellular matrices, ECM&#xff09;中以及细胞表面上。由重复双糖单位复合构成的糖胺聚糖可分为…

crash实战:手把手教你使用crash分析内核dump

Kdump是Linux的一种内核崩溃捕获机制&#xff0c;Linux内核遇到致命错误崩溃时会触发Kdump机制将崩溃时的现场保存下来&#xff0c;以便后续分析和故障排查。目前市面上有很多分析Kdump的工具&#xff0c;例如trace32, crash tool&#xff0c;本文介绍crash tool在手机领域的应…