Linux--MQTT(一)简介

一、简介

MQTT Message Queuing Telemetry Transport,消息队列遥测传输), 是一种基于客户端服务端架构的发布/订阅模式的消息传输协议。
与 HTTP 协议一样, MQTT 协议也是应用层协议,工作在 TCP/IP 四层模型中的最上层(应用层),构建于 TCP/IP 协议上。MQTT 最大 优点 在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。

二、MQTT 的主要特性

MQTT 协议是为工作在低带宽、不可靠网络的远程传感器和控制设备之间的通讯而设计的协议,它具有以下主要的几项特性:
①、使用发布 / 订阅消息模式,提供一对多的消息发布,解除应用程序耦合。
②、基于 TCP/IP 提供网络连接。
主流的 MQTT 是基于 TCP 连接进行数据推送的,但是同样也有基于 UDP 的版本,叫做 MQTT-SN 。这两种版本由于基于不同的连接方式,优缺点自然也就各有不同了。
③、支持 QoS 服务质量等级。
根据消息的重要性不同设置不同的服务质量等级。
④、小型传输,开销很小,协议交换最小化,以降低网络流量。
因为它开销小,所占带宽低的特性,所以适合在算力小,资源少的嵌入式设备上。
⑤、使用 will 遗嘱机制来通知客户端异常断线。
⑥、基于主题发布 / 订阅消息,对负载内容屏蔽的消息传输。
⑦、支持心跳机制。

三、开销小、带宽消耗少的原因

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 协议的一项重要特性,用于保持客户端和服务器之间的连接。以下是对这项机制的详细解释:

心跳包机制的工作原理

  1. Keep Alive 时间间隔

    • 在 MQTT 连接建立时,客户端和服务器约定一个时间间隔,称为 Keep Alive 时间间隔(以秒为单位)。
    • 在这个时间间隔内,如果客户端没有向服务器发送任何消息,则必须发送一个 PINGREQ(心跳请求)消息。
  2. PINGREQ 和 PINGRESP

    • PINGREQ:客户端发送的心跳请求消息,通知服务器客户端仍然在线。
    • PINGRESP:服务器收到 PINGREQ 后,发送回客户端的响应,确认连接正常。

作用

  • 保持连接活跃

    • 即使客户端没有实际数据要发送,心跳包也可以确保连接不被服务器认为已断开。
    • 这对于长时间空闲但需要保持连接的设备非常重要,例如 IoT 设备。
  • 检测连接状态

    • 如果服务器在 Keep Alive 时间内未收到任何消息,包括 PINGREQ,则认为客户端已断开连接,可以采取相应的措施(例如发布遗嘱消息)。
    • 同样,客户端如果在合理时间内未收到服务器的 PINGRESP,可以认为连接出现问题,尝试重连。

优势

  • 减少频繁的连接建立和断开

    • TCP 连接的建立和断开是一个耗时且资源消耗较大的过程。
    • 通过保持长时间的稳定连接,而不是频繁建立和断开连接,可以显著减少网络资源的开销。
  • 高效的带宽利用

    • 心跳包非常小,通常只有固定的 2 字节头部,几乎不会占用带宽。
    • 通过这种方式保持连接,比重新建立连接所消耗的带宽要少得多。
  • 提高实时性

    • 保持连接的状态,使得客户端和服务器之间的通信可以在需要时立即进行,而不需要等待重新建立连接的时间。

示例

假设一个 IoT 设备需要每小时发送一次数据到服务器,而在其他时间段保持连接:

  1. 设备与服务器约定 Keep Alive 时间间隔为 60 秒。
  2. 每隔 60 秒设备发送一个 PINGREQ,服务器响应 PINGRESP。
  3. 设备在每小时的数据发送前不需要重新建立连接,可以立即发送数据。

通过这种方式,设备和服务器保持了一个稳定的连接,减少了频繁的连接建立和断开操作,降低了网络开销和资源消耗。

五、MQTT版本

目前 MQTT 主流版本有两个,分别是 MQTT3.1.1 MQTT5 MQTT3.1.1 是在 2014 10 月发布的,而 MQTT5 是在 2019 3 月发布的。虽然 MQTT3.1.1 MQTT5 在时间相差了将近五年,但是 MQTT3.1.1作为一个经典的版本,目前仍然是主流版本,能够满足大部分实际需求。
MQTT5 是在 MQTT3.1.1 的基础上进行了升级,因此 MQTT5 是完全兼容 MQTT3.1.1 的。而 MQTT5 是在 MQTT3.1.1 的基础上添加了更多的功能、补充完善 MQTT 协议。

MQTT 5.0 是在 MQTT 3.1.1 的基础上进行扩展和改进的版本,它添加了许多新的功能和特性,使协议更加完善和灵活。以下是对 MQTT 5.0 新增功能和改进的详细解释:

新增功能和改进

  1. 属性(Properties)

    • 在 MQTT 5.0 中,每个 MQTT 控制报文(例如 CONNECT、PUBLISH、SUBSCRIBE 等)可以携带一组属性。这些属性提供了额外的元数据,可以用于控制消息的行为、传递额外的信息等。
    • 例如,PUBLISH 报文可以包含消息过期间隔(Message Expiry Interval)、内容类型(Content Type)等属性。
  2. 改进的错误报告

    • MQTT 5.0 引入了更多的返回码,使得错误报告更加具体和详细。
    • 客户端和服务器可以在不同情况下返回不同的错误码,帮助诊断和处理错误。
  3. 共享订阅(Shared Subscriptions)

    • 支持多个客户端共享一个订阅。这对于负载均衡非常有用,消息可以分发到多个订阅者中,而不是每个订阅者都接收到相同的消息。
  4. 会话过期间隔(Session Expiry Interval)

    • 允许客户端在断开连接后指定会话的过期间隔。在指定的时间内,客户端可以重新连接并恢复之前的会话状态(如订阅和未传递的消息)。
  5. 消息过期间隔(Message Expiry Interval)

    • 消息可以设置一个过期间隔。如果消息在这个时间内没有被传递,消息将被丢弃。这对于时间敏感的消息非常有用。
  6. 请求/响应模式(Request/Response Pattern)

    • 支持直接在 MQTT 协议中实现请求/响应模式,客户端可以请求并等待响应,而不是单纯的发布和订阅。
  7. 用户属性(User Properties)

    • 允许用户在消息中添加自定义属性。这些属性可以包含任何用户定义的键值对,提供了更大的灵活性。
  8. 流量控制(Flow Control)

    • 引入了流量控制机制,通过设置最大消息量(Maximum Packet Size)和请求限速(Request Rate Limiting)来管理和控制消息的流量,防止网络拥塞和过载。
  9. 增强的订阅选项(Subscription Options)

    • 订阅选项更加丰富,例如可以设置是否保留消息(Retain Handling)、指定的 QOS 等级等。
  10. 断开连接原因码(Disconnect Reason Codes)

    • 当客户端或服务器断开连接时,可以提供具体的断开原因码,帮助诊断和处理连接问题。

举例说明

假设有一个 IoT 环境中的温度传感器网络,MQTT 5.0 的一些新特性可以提供以下优势:

  1. 属性(Properties)

    • 在发布温度数据时,传感器可以在 PUBLISH 报文中包含内容类型(例如 application/json)和消息过期间隔(例如 60 秒)。
  2. 改进的错误报告

    • 如果订阅失败,服务器可以返回详细的错误码,说明订阅失败的具体原因。
  3. 共享订阅

    • 多个监控系统客户端可以共享一个温度数据的订阅,服务器将消息负载均衡到各个监控客户端。
  4. 会话过期间隔

    • 当传感器设备临时掉线后重新连接,可以恢复之前的会话状态,而不需要重新订阅所有主题。
  5. 请求/响应模式

    • 监控系统可以请求某个传感器的数据,并在同一连接上接收到响应,而不是通过发布/订阅方式间接获取数据。

总结

MQTT 5.0 在 MQTT 3.1.1 的基础上增加了许多新功能和改进,使协议更加灵活、健壮和适应现代物联网应用的需求。这些改进包括属性机制、改进的错误报告、共享订阅、会话和消息的过期间隔、用户自定义属性、流量控制、增强的订阅选项以及具体的断开原因码等。通过这些特性,MQTT 5.0 提供了更强的可扩展性和可管理性,适用于更加复杂和多样化的应用场景。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mybatis做批量操作

动态标签foreach,做过批量操作,但是foreach只能处理记录数不多的批量操作,数据量大了后,先不说效率,能不能成功操作都是问题,所以这里讲一讲Mybatis正确的批量操作方法: 在获取opensession对象…

实用软件下载:XMind 2024最新安装包及详细安装教程

​XMind不仅是一款易用且功能强大的思维导图软件,也是一个开源项目。XMind以构建一个社区向全球提供领先的跨平台思维导图和头脑风暴软件为目标,以帮助用户提升效率。XMind公司是XMind开源项目的主要代码贡献者,与此同时,我们欢迎…

SpringCloud之Zuul源码解析

Zuul 是在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。Zuul 相当于是设备和 Netflix 流应用的 Web 网站后端所有请求的前门。Zuul 可以适当的对多个 Amazon Auto Scaling Groups 进行路由请求。 其架构如下图所示: Zuu…

高速公路智能管理系统:构建安全畅通的数字大动脉

随着城市化进程的加速和交通需求的增长,高速公路系统作为城市交通的重要组成部分,正承担着越来越多的交通运输任务。为了提升高速公路的安全性、便捷性和智能化管理水平,高速公路智能管理系统应运而生。本文将深入探讨高速公路智能管理系统的…

Linux shell编程学习笔记58:cat /proc/mem 获取系统内存信息

0 前言 在开展系统安全检查的过程中,除了收集cpu信息,我们还需要收集内存信息。在Linux中,获取内存信息的命令很多,这里我们着重研究 cat /proc/mem命令。 1 cat /proc/mem命令 /proc/meminfo 文件提供了有关系统内存的使用情况…

能耗分析与远程抄表是什么?

一、引言 在21世纪的数字化时代,能耗分析和远程抄表已成为现代能源管理的重要组成部分。这两项技术不仅提高了能源效率,还为企业和个人提供了更精细的能源使用数据,从而实现更科学的节能减排。 二、能耗分析的深度洞察 能耗分析是通过收集…

[Java基本语法] 逻辑控制与方法

🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏:🍕 Collection与数据结构 (92平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 🧀线程与…

【C++进阶】模板进阶与仿函数:C++编程中的泛型与函数式编程思想

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;栈和队列相关知识 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀模板进阶 &#x1f9e9;<&…

【C语言】13.数组指针与函数指针及其应用

一、数组指针 顾名思义&#xff0c;数组指针就是指向数组的指针。形如&#xff1a;int (*p)[10]; 注意&#xff1a;[]的优先级要高于*号的&#xff0c;所以必须加上&#xff08;&#xff09;来保证p先和*结合。 数组指针的使用 int arr[10] {0}; int (*parr)[10] &arr;…

探索服务器硬件:理解基础组件及其重要性

在现代IT基础设施中&#xff0c;服务器扮演着至关重要的角色。无论是托管网站、管理数据、运行应用程序还是提供各种在线服务&#xff0c;服务器硬件的性能和稳定性都是确保这些任务顺利进行的关键。本文将介绍服务器硬件的基本组件及其功能&#xff0c;以帮助读者更好地理解和…

程序优化 --- arthas trace命令使用

最近在做优化,通过arthas的trace命令去观察方法内的耗时情况以便对程序进行修改. 1.启动arthas之后选择需要监测的程序 2.找到需要监测的接口,一般都是直接找service例子如下: trace 类地址.类名 方法名 (中间有空格)

数据可视化后起之秀——pyecharts

题目一&#xff1a;绘制折线图&#xff0c;展示商家A与商家B各类饮品的销售额 题目描述&#xff1a; 编写程序。根据第9.3.1&#xff0c;绘制折线图&#xff0c;展示商家A与商家B各类饮品的销售额。 运行代码&#xff1a; #绘制折线图&#xff0c;展示商家A与商家B各类饮品的…

一键安全体检!亚信安全携手鼎捷软件推出企业安全体检活动 正式上线

亚信安全联合鼎捷软件股份有限公司&#xff08;以下简称“鼎捷软件”&#xff09;正式推出“一键安全体检”服务。亚信安全网络安全专家将携手鼎捷软件数据安全专家&#xff0c;围绕企业的数智安全状况&#xff0c;进行问题探索与治愈、新问题预测与预警&#xff0c;在全面筛查…

【git使用一】windows下git下载、安装和卸载

目录 &#xff08;1&#xff09;下载安装包 &#xff08;2&#xff09;安装git &#xff08;3&#xff09;安装验证 &#xff08;4&#xff09;卸载git &#xff08;1&#xff09;下载安装包 官网下载地址&#xff1a;Git 国内镜像下载地址&#xff1a;CNPM Binaries Mir…

docker安装rabbitmq和延迟插件(不废话版)

1.下载镜像 docker pull rabbitmq:3.8-management 2.启动 docker run -e RABBITMQ_DEFAULT_USERlicoos -e RABBITMQ_DEFAULT_PASSlicoosrabbitmq -v mq-plugins:/plugins --name mq --hostname mq -p 15672:15672 -p 5672:5672 -d rabbitmq:3.8-management 3.下载对…

基于matlab的MTCNN(多任务卷积神经网络)人脸检测算法

关键词&#xff1a;Matlab&#xff1b;深度学习&#xff1b;多任务卷积神经网络&#xff1b;人脸检测&#xff1b; 背景 在不受约束的环境中&#xff0c;由于个体姿势的多样性、光照条件的变化以及潜在的遮挡问题&#xff0c;人脸检测和对齐任务面临诸多挑战。近期的研究表明…

Python也能“零延迟“通信吗?ZeroMQ带你开启高速模式!

目录 1、零基础入门ZeroMQ 🚀 1.1 ZeroMQ简介与安装 1.2 基础概念:Socket类型详解 1.3 实战演练:Hello World示例 2、深入浅出消息模式 🔌 2.1 请求-应答模式( REQ/REP ) 2.2 发布-订阅模式( PUB/SUB ) 2.3 推送-拉取模式( PUSH/PULL ) 3、Python实战ZeroM…

redis+lua实现分布式限流

redislua实现分布式限流 文章目录 redislua实现分布式限流为什么使用redislua实现分布式限流使用ZSET也可以实现限流&#xff0c;为什么选择lua的方式实现依赖lua脚本yaml代码实现 Jmeter压测 为什么使用redislua实现分布式限流 原子性&#xff1a;通过Lua脚本执行限流逻辑&am…

socket收发数据的处理

1. TCP 协议是一种基于数据流的协议 Socket的Receive方法只是把接收缓冲区的数据提取出来,当系统的接收缓冲区为空,Receive方法会被阻塞,直到里面有数据。 Socket的Send方法只是把数据写入到发送缓冲区里,具体的发送过程由操作系统负责。当操作系统的发送缓冲区满了,Send方法会…

计算机网络 —— 网络层 (路由协议)

计算机网络 —— 网络层 &#xff08;路由协议&#xff09; 什么是路由协议内部网关协议RIP关键特性 OSPF主要特点 外部网关协议BGP关键特性 我们今天来看路由协议&#xff1a; 什么是路由协议 路由协议是网络设备&#xff08;主要是路由器&#xff09;用来决定数据包在网络中…