Linux--MQTT简介
一、简介
二、MQTT 的主要特性
三、开销小、带宽消耗少的原因
MQTT(Message Queuing Telemetry Transport)是一种轻量级的发布/订阅消息传输协议,专为低带宽、不稳定网络环境设计。它的开销小、带宽需求低的原因有以下几点:
1. 头部结构简洁
- 固定头部:MQTT 的固定头部只有2字节,包括消息类型和标志位。对于一些简单的消息类型(例如 PINGREQ 或 DISCONNECT),固定头部就足够了,不需要额外的可变头部或负载。
- 可变头部和负载:仅在需要时才添加,不必要时省略。这减少了数据包的总大小。
2. 协议设计轻量化
- 简单的操作码:MQTT 的操作码和控制字段设计简单,减少了解析和处理的复杂度。
- 低开销的消息格式:消息格式紧凑,有效载荷不包含冗余信息。仅在需要时才传输必要的数据。
3. 发布/订阅模型
- 异步通信:发布/订阅模型允许设备在有数据时才发送消息,无需保持长时间的连接,减少了不必要的数据传输和带宽占用。
- 减少点对点连接:一个消息发布到主题,多个订阅者可以接收,避免了多个点对点连接,减少了网络流量。
4. 保持连接机制
- 心跳包(Keep Alive):通过心跳包机制保持连接,不频繁建立和断开连接,减少了 TCP 连接建立和断开的开销。
- PINGREQ 和 PINGRESP:用于保持连接的消息很小,仅有固定头部。
5. QOS(Quality of Service)等级
- QOS 0:最多一次传输,不需要确认,最小带宽消耗。
- QOS 1:至少一次传输,需要确认,带宽消耗适中。
- QOS 2:仅一次传输,最高保证,需要两阶段确认,带宽消耗相对较高。
- 按需选择:用户可以根据应用需求选择合适的 QOS 等级,优化带宽使用。
6. 保留消息和遗嘱消息
- 保留消息:服务器保留最新的消息,新的订阅者一连接就能收到,无需发送多个请求。
- 遗嘱消息:客户端异常断开时,服务器自动发布预设的遗嘱消息,无需额外的检测和重连开销。
7. 小型消息体
- 适用于小型消息:MQTT 适合小型消息传输,通常用于传感器数据、状态更新等小型数据包。
- 减少数据量:通过小型数据包传输,减少了整体数据量和带宽占用。
四、补充(心跳包)
心跳包(Keep Alive)机制是 MQTT 协议的一项重要特性,用于保持客户端和服务器之间的连接。以下是对这项机制的详细解释:
心跳包机制的工作原理
-
Keep Alive 时间间隔:
- 在 MQTT 连接建立时,客户端和服务器约定一个时间间隔,称为 Keep Alive 时间间隔(以秒为单位)。
- 在这个时间间隔内,如果客户端没有向服务器发送任何消息,则必须发送一个 PINGREQ(心跳请求)消息。
-
PINGREQ 和 PINGRESP:
- PINGREQ:客户端发送的心跳请求消息,通知服务器客户端仍然在线。
- PINGRESP:服务器收到 PINGREQ 后,发送回客户端的响应,确认连接正常。
作用
-
保持连接活跃:
- 即使客户端没有实际数据要发送,心跳包也可以确保连接不被服务器认为已断开。
- 这对于长时间空闲但需要保持连接的设备非常重要,例如 IoT 设备。
-
检测连接状态:
- 如果服务器在 Keep Alive 时间内未收到任何消息,包括 PINGREQ,则认为客户端已断开连接,可以采取相应的措施(例如发布遗嘱消息)。
- 同样,客户端如果在合理时间内未收到服务器的 PINGRESP,可以认为连接出现问题,尝试重连。
优势
-
减少频繁的连接建立和断开:
- TCP 连接的建立和断开是一个耗时且资源消耗较大的过程。
- 通过保持长时间的稳定连接,而不是频繁建立和断开连接,可以显著减少网络资源的开销。
-
高效的带宽利用:
- 心跳包非常小,通常只有固定的 2 字节头部,几乎不会占用带宽。
- 通过这种方式保持连接,比重新建立连接所消耗的带宽要少得多。
-
提高实时性:
- 保持连接的状态,使得客户端和服务器之间的通信可以在需要时立即进行,而不需要等待重新建立连接的时间。
示例
假设一个 IoT 设备需要每小时发送一次数据到服务器,而在其他时间段保持连接:
- 设备与服务器约定 Keep Alive 时间间隔为 60 秒。
- 每隔 60 秒设备发送一个 PINGREQ,服务器响应 PINGRESP。
- 设备在每小时的数据发送前不需要重新建立连接,可以立即发送数据。
通过这种方式,设备和服务器保持了一个稳定的连接,减少了频繁的连接建立和断开操作,降低了网络开销和资源消耗。
五、MQTT版本
MQTT 5.0 是在 MQTT 3.1.1 的基础上进行扩展和改进的版本,它添加了许多新的功能和特性,使协议更加完善和灵活。以下是对 MQTT 5.0 新增功能和改进的详细解释:
新增功能和改进
-
属性(Properties)
- 在 MQTT 5.0 中,每个 MQTT 控制报文(例如 CONNECT、PUBLISH、SUBSCRIBE 等)可以携带一组属性。这些属性提供了额外的元数据,可以用于控制消息的行为、传递额外的信息等。
- 例如,PUBLISH 报文可以包含消息过期间隔(Message Expiry Interval)、内容类型(Content Type)等属性。
-
改进的错误报告
- MQTT 5.0 引入了更多的返回码,使得错误报告更加具体和详细。
- 客户端和服务器可以在不同情况下返回不同的错误码,帮助诊断和处理错误。
-
共享订阅(Shared Subscriptions)
- 支持多个客户端共享一个订阅。这对于负载均衡非常有用,消息可以分发到多个订阅者中,而不是每个订阅者都接收到相同的消息。
-
会话过期间隔(Session Expiry Interval)
- 允许客户端在断开连接后指定会话的过期间隔。在指定的时间内,客户端可以重新连接并恢复之前的会话状态(如订阅和未传递的消息)。
-
消息过期间隔(Message Expiry Interval)
- 消息可以设置一个过期间隔。如果消息在这个时间内没有被传递,消息将被丢弃。这对于时间敏感的消息非常有用。
-
请求/响应模式(Request/Response Pattern)
- 支持直接在 MQTT 协议中实现请求/响应模式,客户端可以请求并等待响应,而不是单纯的发布和订阅。
-
用户属性(User Properties)
- 允许用户在消息中添加自定义属性。这些属性可以包含任何用户定义的键值对,提供了更大的灵活性。
-
流量控制(Flow Control)
- 引入了流量控制机制,通过设置最大消息量(Maximum Packet Size)和请求限速(Request Rate Limiting)来管理和控制消息的流量,防止网络拥塞和过载。
-
增强的订阅选项(Subscription Options)
- 订阅选项更加丰富,例如可以设置是否保留消息(Retain Handling)、指定的 QOS 等级等。
-
断开连接原因码(Disconnect Reason Codes)
- 当客户端或服务器断开连接时,可以提供具体的断开原因码,帮助诊断和处理连接问题。
举例说明
假设有一个 IoT 环境中的温度传感器网络,MQTT 5.0 的一些新特性可以提供以下优势:
-
属性(Properties):
- 在发布温度数据时,传感器可以在 PUBLISH 报文中包含内容类型(例如
application/json)和消息过期间隔(例如 60 秒)。
- 在发布温度数据时,传感器可以在 PUBLISH 报文中包含内容类型(例如
-
改进的错误报告:
- 如果订阅失败,服务器可以返回详细的错误码,说明订阅失败的具体原因。
-
共享订阅:
- 多个监控系统客户端可以共享一个温度数据的订阅,服务器将消息负载均衡到各个监控客户端。
-
会话过期间隔:
- 当传感器设备临时掉线后重新连接,可以恢复之前的会话状态,而不需要重新订阅所有主题。
-
请求/响应模式:
- 监控系统可以请求某个传感器的数据,并在同一连接上接收到响应,而不是通过发布/订阅方式间接获取数据。
总结
MQTT 5.0 在 MQTT 3.1.1 的基础上增加了许多新功能和改进,使协议更加灵活、健壮和适应现代物联网应用的需求。这些改进包括属性机制、改进的错误报告、共享订阅、会话和消息的过期间隔、用户自定义属性、流量控制、增强的订阅选项以及具体的断开原因码等。通过这些特性,MQTT 5.0 提供了更强的可扩展性和可管理性,适用于更加复杂和多样化的应用场景。
相关文章:
Linux--MQTT简介
一、简介 MQTT ( Message Queuing Telemetry Transport,消息队列遥测传输), 是一种基于客户端服务端架构的发布/订阅模式的消息传输协议。 与 HTTP 协议一样, MQTT 协议也是应用层协议,工作在 TCP/IP 四…...
VMware Workerstation开启虚拟机后,产生乱码名称日志文件
问题情况 如下图所示,我的虚拟机版本是16.1.2版本,每次在启动虚拟机之后,D盘目录下都会产生一个如图下所示的乱码名称文件。同时,虚拟机文件目录也是杂乱不堪,没有按照一台虚拟机对应一个文件夹的形式存在。 问题处理…...
Unity射击游戏开发教程:(27)创建带有百分比的状态栏
创建带有弹药数和推进器百分比的状态栏 在本文中,我将介绍如何创建带有分数和百分比文本的常规状态栏。 由于 Ammo Bar 将成为 UI 的一部分,因此我们需要向 Canvas 添加一个空的 GameObject 并将其重命名为 AmmoBar。我们需要一个文本和两个图像对象,它们是 AmmoBar 的父级。…...
Linux内存从0到1学习笔记(8.16 SMMU详解)---更新中
写在前面 前面博客已经了解过。SMMU是IOMMU在ARM架构上的实现。主要为了解决虚拟化环境中,GuestOS无法直接将连续的物理地址分配给硬件的问题。对于Hypervisor/GuestOS的虚拟化系统来说,所有的VM都运行在Hypervisor上,每一个VM独立运行一个O…...
标准盒模型和怪异盒模型的区别
CSS盒模型: 内容区(content)内边距(padding)边框(border)外边距(margin) 分为标准盒模型和IE盒模型/怪异盒模型 为了正确设置元素在所有浏览器中的宽度和高度…...
【第8章】如何利用ControlNet生成“可控画面”?(配置要求/一键安装/快速上手/生成第一张图)ComfyUI基础入门教程
这节我们来讲AI绘画领域中一个很重要的概念:ControlNet,看下如何让生成的画面更可控。 🎅什么是ControlNet? Stable Diffusion中的ControlNet是一种神经网络结构,它允许将额外的条件输入添加到预训练的图像扩散模型中,通过这种方式,ControlNet可以控制图像生成过程,…...
[qt] qt程序打包以及docker镜像打包
目录 一 环境准备: 1.1 qt环境 1.2 linuxdeplouqt打包工具 二 qt包发布: 2.1 搜索链接库 2.2 应用程序APP打包 2.3 发布 三 docker镜像包发布 3.1 环境准备 3.2 镜像生产脚本 3.3 加载镜像并运行docker容器 四 补充 4.1 时间不同步问题解决 一 环境准备: qt环境l…...
电脑屏幕监控软件有哪些?2025年监控软件排行榜
电脑屏幕监控软件有哪些?2025年监控软件排行榜 虽然现在还是2024年,但是有一些被广泛讨论和推荐的电脑屏幕监控软件,它们将在2025年异军突起,成为行业的引领者。 1.安企神软件: 功能全面的电脑屏幕监控软件…...
音视频主要概念
文章目录 常用的一些概念主要概念1主要概念2I帧P帧B帧 常用视频压缩算法 小结 常用的一些概念 主要概念1 视频码率:kb/s,是指视频文件在单位时间内使用的数据流量,也叫码流率。码率越大,说明单位时间内取样率越大,数…...
AIGC全面介绍
AIGC(Artificial Intelligence and General Competitions)是一个专注于人工智能和综合能力竞赛的组织。AIGC的目标是促进人工智能和综合能力的发展,并为相关领域的学术研究和应用创新提供支持和平台。 AIGC主要致力于人工智能竞赛的组织、举…...
vscode中模糊搜索和替换
文章目录 调出搜索(快捷键)使用正则(快捷键)替换(快捷键)案例假设给定文本如下目标1:查找所有函数名目标2:替换所有函数名为hello目标3:给url增加查询字符串参数 调出搜索…...
人工智能入门学习教程分享
目录 1.首先安装python,官网地址:Download Python | Python.org,进入网址,点击Windows链接 2.下载完成之后,进行傻瓜式安装,如果不选安装路径,默认会安装到C:\Users\Administrator\AppData\Local\Programs\Python\Python38目录下。 3.配置python环境变量,即把python的…...
Django序列化器详解:普通序列化器与模型序列化器的选择与运用
系列文章目录 Django入门全攻略:从零搭建你的第一个Web项目Django ORM入门指南:从概念到实践,掌握模型创建、迁移与视图操作Django ORM实战:模型字段与元选项配置,以及链式过滤与QF查询详解Django ORM深度游ÿ…...
Commons-io工具包与Hutool工具包
Commons-io Commons-io是apache开源基金组织提供的一组有关IO操作的开源工具包 作用:提高I0流的开发效率。 FileUtils类(文件/文件夹相关) static void copyFile(File srcFile,File destFile) 复制文件 static void copyDirectory(File srcDir,File destDir) 复…...
ROS中Twist消息类型
Twist消息类型在Robot Operating System (ROS)中是一个常见的数据结构,主要用于描述物体的线性速度和角速度。这种消息类型在ROS的geometry_msgs包中定义,常用于机器人运动控制,尤其是当需要向机器人发布速度指令时。 Twist消息由两个Vector…...
Pixi.js学习 (四)鼠标跟随、元素组合与图片位控
目录 一、鼠标移动跟随 1.1 获取鼠标坐标 1.2 鼠标跟随 二、锚点、元素组合 2.1 锚点 2.2 元素组合 三、图片图层 四、实战 例题一:完成合金弹头人物交互 例题二:反恐重击瞄准和弹痕 例题一代码: 例题二代码: 总结 前言 为了提高作…...
Golang | Leetcode Golang题解之第139题单词拆分
题目: 题解: func wordBreak(s string, wordDict []string) bool {wordDictSet : make(map[string]bool)for _, w : range wordDict {wordDictSet[w] true}dp : make([]bool, len(s) 1)dp[0] truefor i : 1; i < len(s); i {for j : 0; j < i;…...
简单聊一下Oracle,MySQL,postgresql三种锁表的机制,行锁和表锁
MySQL: MySQL使用行级锁定和表级锁定。行级锁定允许多个会话同时写入表,适用于多用户、高并发和OLTP应用。表级锁定只允许一个会话一次更新表,适用于只读、主要读取或单用户应用。 比如mysql开启一个窗口执行 begin; update xc_county_a…...
Python的网络请求
自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在上一节中多次提到了URL地址与下载网页,这两项是网络爬虫必备而又关键的功能,说到这两个功能必然会提到HTTP。本节将介绍在P…...
[Shell编程学习路线]——探讨Shell中变量的作用范围(export)
🏡作者主页:点击! 🛠️Shell编程专栏:点击! ⏰️创作时间:2024年6月14日10点14分 🀄️文章质量:95分 文章目录 ————前言———— 定义变量: 输出变…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
