当前位置: 首页 > news >正文

MQTT Keep Alive机制

MQTT 协议是承载于 TCP 协议之上的, 而 TCP 协议以连接为导向, 在连接双方之间, 提供稳定、 有序的字节流功能。 但是, 在部分情况下, TCP 可能出现半连接问题。 所谓半连接, 是指某一方的连接已经断开或者没有建立, 而另外一方的连接却依然维持着。 在这种情况下, 半连接的一方可能会持续不断地向对端发送数据, 而显然这些数据永远到达不了对端。 为了避免半连接导致的通信黑洞, MQTT 协议提供了Keep Alive 机制, 使客户端和 MQTT 服务器可以判定当前是否存在半连接问题, 从而关闭对应连接。

启用 Keep Alive
客户端在创建和 MQTT Broker 的连接时, 只要将连接请求协议包内的 Keep Alive 可变头部字段设置为非 0 值, 就可以在通信双方间启用 Keep Alive 机制。 Keep Alive 为 0~65535 的一个整数, 代表客户端发送两次 MQTT 协议包之间的最大间隔时间。而 Broker 在收到客户端的连接请求后, 会检查可变头部中的 Keep Alive 字段的值, 如果有值, 则 Broker将会启用 Keep Alive 机制。

在 MQTT 5.0 标准中, 引入了 Server Keep Alive 的概念, 允许 Broker 根据自身的实现等因素, 选择接受客户端请求中携带的 Keep Alive 值, 或者是覆盖这个值。 如果 Broker 选择覆盖这个值, 则需要将新值设置在连接确认包(CONNACK) 的 Server Keep Alive 字段中, 客户端如果在连接确认包中读取到了Server Keep Alive, 则需要使用该值, 覆盖自己之前的Keep Alive 的值。

Keep Alive 机制流程

  • 客户端流程
    在连接建立后, 客户端需要确保, 自己任意两次 MQTT 协议包的发送间隔不超过 Keep Alive 的值, 如果客户端当前处于空闲状态, 没有可发送的包, 则可以发送 PINGREQ 协议包。当客户端发送 PINGREQ 协议包后, Broker 必须返回一个 PINGRESP 协议包, 如果客户端在一个可靠的时间内, 没有收到服务器的 PINGRESP 协议包, 则说明当前存在半连接、 或者 Broker 已经下线、 或者出现了网络故障, 这个时候, 客户端应当关闭当前连接。

  • Broker 流程
    在连接建立后, Broker 如果没有在 Keep Alive 的 1.5 倍时间内, 收到来自客户端的任何包, 则会认为和客户端之间的连接出现了问题, 此时 Broker 便会断开和客户端的连接。如果 Broker 收到了来自客户端的 PINGREQ 协议包, 需要回复一个 PINGRESP 协议包进行确认。

  • 客户端接管机制
    当 Broker 里存在半连接时, 如果对应的客户端发起了重连或新的连接, 则 Broker 会启动客户端接管机制: 关闭旧的半连接, 然后与客户端建立新的连接。这种机制保证了客户端不会因为 Broker 里存在的半连接, 导致无法进行重连。

Keep Alive 与遗嘱消息
Keep Alive 通常还可以与遗嘱消息结合使用, 通过遗嘱消息, 设备可将自己的意外掉线情况及时通知第三方。
例如,客户端连接时设置了 Keep Alive 为 5 秒, 并且设置了遗嘱消息。 那么当服务器 7.5 秒(1.5 倍Keep Alive) 内未收到该客户端的任何报文时, 即会向 last_will 主题发送 Payload 为 offline 的遗嘱消息。

相关文章:

MQTT Keep Alive机制

MQTT 协议是承载于 TCP 协议之上的, 而 TCP 协议以连接为导向, 在连接双方之间, 提供稳定、 有序的字节流功能。 但是, 在部分情况下, TCP 可能出现半连接问题。 所谓半连接, 是指某一方的连接已经断开或者…...

基于springboot+vue的游戏交易系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…...

高职(大专)结构化面试之答题思路

目录 一、岗位认知 二、职教热点 三、教育教学 四、人际关系 五、组织管理 六、应急应变 七、时政与教育 八、专业知识 一、岗位认知 考试方向:主要考察对岗位的全面认识、职业目标、职业规划、职业理想。 必背题目: 1.“你为什么要报考我们学校的教师岗…...

Python基础学习笔记(一)

Python简介 Python 语言是一种跨平台、开源、免费、解释型、面向对象、动态数据类型的高级程序设计语言。早期版本的 Python 被称作是 Python1;Python2 最后一个版本是 2.7;Python3 是目前最活跃的版 本,基本上新开发的 Python 代码都会支持…...

机器学习-可解释性机器学习:支持向量机与fastshap的可视化模型解析

一、引言 支持向量机(Support Vector Machine, SVM)作为一种经典的监督学习方法,在分类和回归问题中表现出色。其优点之一是生成的模型具有较好的泛化能力和可解释性,能够清晰地展示特征对于分类的重要性。 fastshap是一种用于快速计算SHAP值&#xff08…...

32.768K晶振X1A000141000300适用于无人驾驶汽车电子设备

科技的发展带动电子元器件的发展电子元器件-“晶振”为现代的科技带来了巨大的贡献,用小小的身体发挥着大大的能量。 近两年无人驾驶汽车热度很高,不少汽车巨头都已入局。但这项技术的难度不小,相信在未来几年里,无人驾驶汽车这项…...

利用autodl服务器跑模型

1. 租用服务器 本地改模型 服务器 将改进好的、数据集处理好的模型压缩为zip文件上传到阿里云盘打开服务器AUTODL服务器,在主页中选择容器实例 在此位置进行开关机操作,若停止服务器,必须关机,不然会一直扣钱 2. 运行模型 选择…...

【微服务】分布式调度框架PowerJob使用详解

目录 一、前言 二、定时任务调度框架概述 2.1 为什么需要定时任务调度框架 2.2 定时任务调度使用场景 三、PowerJob 介绍 3.1 PowerJob 概述 3.2 PowerJob 功能特性 3.3 PowerJob 应用场景 3.4 PowerJob 与其他同类产品对比 四、PowerJob 部署 4.1 PowerJob 架构 4.…...

一命通关广度优先遍历

前言 在这篇文章之前,已对非线性结构遍历的另一种方法——深度优先遍历进行了讲解,其中很多概念词都是共用的。为了更好的阅读体验,最好先在掌握或起码了解dfs的基础上,再来阅读本文章,否则因为会有很多概念词看不明白…...

力扣4寻找两个正序数组的中位数

1.实验内容 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 2.实验目的 算法的时间复杂度应该为 O(log (mn)) 。 3.基本思路 碰到时间复杂度要求log的,肯定用二分查找&…...

jmeter之常用函数-第六天

1.常见函数: _counter 计数器函数 TRUE(每个用户都有自己的计数器) FALSE(所有用户共用一个计数器) _Random 随机数函数 参数1:取值范围最小值(包含) 参数2:取值范围最大值(包含) _time 获取当前时间的函数 无参: 获取的是距离 1970/01/01 00:00:00 的毫秒值 参…...

原创!分解+集成思想新模型!VMD-CNN-BiGRU-Attention一键实现时间序列预测!以风速数据集为例

声明:文章是从本人公众号中复制而来,因此,想最新最快了解各类智能优化算法及其改进的朋友,可关注我的公众号:强盛机器学习,不定期会有很多免费代码分享~ 目录 数据介绍 模型流程 创新点 结果展示 部…...

ab (Apache benchmark) - 压力/性能测试工具

Apache benchmark(ab) 安装window安装使用方法 - bin目录运行使用方法 - 任意目录运行 linux安装 基本命令介绍常用参数:输出结果分析: ab的man手册 安装 window安装 官网下载链接:https://www.apachehaus.com/cgi-bin/download…...

除了Confluence,有没有其他工具一样好用?

每个团队都需要一个协同工作工具,以更有效地管理任务、跟踪进度和分享知识。这就是Atlassian的Confluence发挥作用的地方。然而,尽管它相当强大,其昂贵的价格和复杂的界面可能会让某些用户望而却步。所以,还有其他工具可以替代Con…...

查询表中数据(全列/特定列/表达式,where子句(比较/逻辑运算符),order by子句,limit筛选分页),mysql执行顺序

目录 select 全列查询 特定列查询 用表达式查询 (as) 名字 distinct 去重 where子句 比较运算符 列数据之间的比较 ​编辑 别名不能参与比较 null查询 between and in ( ... , ...) 模糊匹配 逻辑运算符 order by子句 可以使用别名 总结mysql执行顺…...

【Linux】多线程概念 | POSIX线程库

文章目录 一、线程的概念1. 什么是线程Linux下并不存在真正的多线程,而是用进程模拟的!Linux没有真正意义上的线程相关的系统调用!原生线程库pthread 2. 线程和进程的联系和区别3. 线程的优点4. 线程的缺点5. 线程异常6. 线程用途 二、二级页…...

Java Spring AOP代码3分钟快速入手

AOP Spring入门(十)&#xff1a;Spring AOP使用讲解 - 掘金 maven的依赖&#xff1a; <dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId> </dependency> <!--aspectj支持--> <dependen…...

.NET开源快速、强大、免费的电子表格组件

今天大姚给大家分享一个.NET开源&#xff08;MIT License&#xff09;、快速、强大、免费的电子表格组件&#xff0c;支持数据格式、冻结、大纲、公式计算、图表、脚本执行等。兼容 Excel 2007 (.xlsx) 格式&#xff0c;支持WinForm、WPF和Android平台&#xff1a;ReoGrid。 项…...

docker一键部署若依前后端分离版本

比如这里把文件放到/xin/docker/jiaoZ/的目录下&#xff0c;jar包和下面的配置文件都放在这个文件夹下。 注意要把jar端口改为你实际启动的&#xff0c;映射端口也可以改为你想要的。 这里的映射端口为&#xff1a;nginx监听80端口&#xff0c;jar在8620端口&#xff0c;mysq…...

Java项目开发之fastjson详解

Fastjson 是由阿里巴巴公司开发的一个 Java 语言编写的高性能 JSON 处理库。它主要用于 Java 对象与 JSON 数据格式之间的转换&#xff0c;提供了简单易用的 API 来实现序列化&#xff08;Java 对象转 JSON 字符串&#xff09;和反序列化&#xff08;JSON 字符串转 Java 对象&a…...

Hunyuan-MT 7B翻译历史管理:所有记录本地存储,支持检索与快速复用

Hunyuan-MT 7B翻译历史管理&#xff1a;所有记录本地存储&#xff0c;支持检索与快速复用 1. 为什么需要本地翻译历史管理 在日常工作中&#xff0c;我们经常遇到这样的场景&#xff1a; 上周翻译过的合同条款&#xff0c;这周需要再次使用&#xff0c;却找不到原始记录需要…...

Local Moondream2案例分享:设计师用其解析竞品海报→提取视觉关键词→重构创意

Local Moondream2案例分享&#xff1a;设计师用其解析竞品海报→提取视觉关键词→重构创意 1. 项目背景与核心价值 作为一名设计师&#xff0c;你是否经常遇到这样的困境&#xff1a;看到一张优秀的竞品海报&#xff0c;想要分析其设计精髓&#xff0c;却不知从何下手&#x…...

语音指令分类模型训练(基于机器学习方法)

1、统计音频长度信息&#xff0c;便于后续参数的设定import os import librosa import numpy as np# 配置参数 DATA_PATH "data4c" # 数据集根目录 FIXED_SAMPLE_RATE 16000def stat_audio_lengths():# 存储所有音频的长度&#xff08;采样点数&#xff09;和时长…...

国标GBT 28181实战解析:第三方呼叫控制在跨平台历史视音频回放中的关键实现(GB/T28181-2022)

1. 第三方呼叫控制机制在GB/T28181-2022中的核心价值 第一次接触国标GB/T28181的开发者&#xff0c;往往会被其复杂的协议栈和交互流程吓退。但当我真正在跨厂商视频监控项目中实施第三方呼叫控制时&#xff0c;才发现这套机制的精妙之处。想象一下这样的场景&#xff1a;某大型…...

vLLM-v0.17.1实战手册:vLLM + FastAPI 构建带鉴权的私有API网关

vLLM-v0.17.1实战手册&#xff1a;vLLM FastAPI 构建带鉴权的私有API网关 1. vLLM框架简介 vLLM是一个专为大型语言模型(LLM)设计的高性能推理和服务库&#xff0c;由加州大学伯克利分校的天空计算实验室(Sky Computing Lab)发起&#xff0c;现已发展成为社区驱动的开源项目…...

一文读懂计算机视觉需要哪些数学基础

一文读懂计算机视觉需要哪些数学基础 标签&#xff1a;#计算机视觉、#线性代数、#人工智能、#深度学习、#自然语言处理、#神经网络、#机器学习### 一、痛点引入&#xff1a;为什么很多人怕CV数学&#xff1f;真相是什么&#xff1f;### 二、CV必备数学&#xff1a;必须掌握的和…...

5分钟掌握百度网盘提取码智能获取:告别繁琐搜索的高效解决方案

5分钟掌握百度网盘提取码智能获取&#xff1a;告别繁琐搜索的高效解决方案 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 还在为百度网盘资源提取码而烦恼吗&#xff1f;baidupankey作为一款专业的提取码智能获取工具&#x…...

Windows安卓子系统终极指南:从零到精通完整教程

Windows安卓子系统终极指南&#xff1a;从零到精通完整教程 【免费下载链接】WSA Developer-related issues and feature requests for Windows Subsystem for Android 项目地址: https://gitcode.com/gh_mirrors/ws/WSA 你知道吗&#xff1f;Windows 11上运行安卓应用不…...

Relm与GTK+深度集成:如何利用原生GUI组件构建现代化界面

Relm与GTK深度集成&#xff1a;如何利用原生GUI组件构建现代化界面 【免费下载链接】relm Idiomatic, GTK-based, GUI library, inspired by Elm, written in Rust 项目地址: https://gitcode.com/gh_mirrors/re/relm Relm是一个基于Rust语言的GUI库&#xff0c;深受Elm…...

DLSS Swapper深度解析:如何在不更新游戏的情况下提升30%画质表现

DLSS Swapper深度解析&#xff1a;如何在不更新游戏的情况下提升30%画质表现 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 想象一下&#xff0c;当你正在玩一款心爱的3A大作时&#xff0c;发现游戏中的DLSS版本已经落…...