Linux--MQTT(一)简介

news2024/11/28 18:46:01

一、简介

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.coloradmin.cn/o/1825269.html

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

相关文章

在Pycharm使用Github Copilot

文章目录 1.GitHub Copilot 是什么2.注册GitHub Copilot3.官方使用文档4.安装 GitHub Copilot插件5.在Pycharm中使用6.相关功能键7.启用或禁用 GitHub Copilot 1.GitHub Copilot 是什么 GitHub Copilot 是一款 AI 编码助手,可帮助你更快、更省力地编写代码&#xff…

Linux/Windows 安装 RocketMQ 详细图文教程!

Linux 安装 RocketMQ 首先,你需要从RocketMQ的官方网站或GitHub仓库下载最新的RocketMQ发行版下载安装,官网下载地址:https://rocketmq.apache.org/download/。 接下来配置环境变量: 输入vim /etc/profile命令配置环境变量输入i进…

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

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

PromptMRG: Diagnosis-Driven Prompts for Medical Report Generation

文章汇总 存在的问题 罕见疾病在训练数据中的代表性不足,使其诊断性能不可靠。 解决办法 1:利用预训练的CLIP模型从数据库中检索相似的报告来辅助查询图像的诊断。 2:设计SDL模块根据不同疾病的学习状态自适应调整优化目标。 流程解读 文…

一键解锁创意无界:高效AI生成古典肖像图片,轻松打造艺术化身

在数字化时代,创意与艺术的结合正逐渐改变我们的生活。你是否曾梦想过拥有一幅专属于自己的古典肖像画,却又苦于找不到合适的画师或高昂的费用而望而却步?现在,这一切都将成为现实! 进入首助编辑高手的AI魔法智绘图板块…

面试官:你公司是怎么做日志收集处理的?

引言:在现代的软件开发和运维中,日志管理是至关重要的一环。面试官可能会问到如何处理日志收集与分析,特别是在微服务架构中如何有效地管理日志数据。本文将介绍一种常见且广泛应用的解决方案:ELK Stack。 题目 面试官&#xff…

10W大奖等你瓜分,OpenTiny CCF开源创新大赛报名火热启动!

OpenTiny CCF开源创新大赛正式启幕! 🌟10万奖金,等你来战! 🌟 👥无论你是独行侠还是团队英雄👥 只要你对前端技术充满热情, 渴望在实战中磨砺技能, 那么&#xff0c…

eclipse中报出Invaild project path

一、问题: 二、提示分析: 资源路径位置类型无效的项目路径:找到重复的路径条目 项目路径中有一个名为"/eclipse_rtt_demo"的条目被多次定义,这在Eclipse的构建路径设置中是不允许的。这个重复的条目既被标记为系统包含…

Postman接口测试/接口自动化实战教程

一、API 自动化测试 Postman 最基本的功能用来重放请求,并且配合良好的 response 格式化工具。 高级点的用法可以使用 Postman 生成各个语言的脚本,还可以抓包,认证,传输文件。 仅仅做到这些还不能够满足一个系统的开发&#x…

增值税发票OCR识别API在Java、Python、PHP中的使用教程

​增值税发票OCR识别是一种利用光学字符识别(OCR)技术,自动提取和识别增值税发票上的文字信息的过程。增值税发票是企业在销售商品或提供服务过程中产生的一种税务凭证,包含了关键的财务信息,如商品明细、金额、税率等…

pdf structuredClone is not defined 解决

问题 部分手机系统的浏览器 pdf v2版本会出现 structuredclone is not defined 的报错,这是因为浏览器过低 解决 查看structuredClone的浏览器兼容性 structuredClone api 文档 polyfill 网站下方有个 polyfill的网址入口 可以解决低版本的兼容问题 相应网址…

QT day02

思维导图 UI界面设计 设置登录界面,输入账号、密码,登录/取消 按钮 使用手动连接,将登录框中的取消按钮使用第二中连接方式,右击转到槽,在该槽函数中,调用关闭函数 将登录按钮使用qt4版本的连接到自定义…

计算机组成原理学习 Part 1

计算机系统 组成 计算机系统 { 硬件 计算机的实体,如主机、外设等 软件 由具有各类特殊功能的信息(程序)组成 计算机系统 \begin{cases} 硬件 &\text 计算机的实体,如主机、外设等\\ 软件 &\text 由具有各类特殊功能的信…

牛客链表刷题(二)

目录 题目一:合并两个有序链表 代码: 题目二:合并k个有序链表 代码: 题目三:判断链表中是否有环 代码: 题目四:链表中环的入口结点 代码: 题目一:合并两个有序链表 代…

B端系统:面向用户or面向客户?有啥区别?当二者起冲突呢?

在B端系统中用户和客户大部分情况下是分离的,不像C端,用户即客户。那么用户和客户到底怎么区分,做B端设计到底听谁的呢?大美B端工场为大家详细解读下。 一、B端产品的用户和客户 在B端产品中,用户和客户是两个不同的…

推荐一款mac截图利器

一、介绍 Longshot 是 macOS 上一款功能丰富的截图工具,它提供了多种截图方式和便捷的标注功能。主要包含以下功能特点: 多种截图方式:Longshot 支持区域截图、全屏截图、窗口截图以及滚动截图。 标注工具:提供了丰富的标注工具…

FlinkCDC 3.1.0 支持 Flink 1.18.0 版本选择

问题:FlinkCDC 3.1.0 pipeline 与 Flink 1.17.0 可能是因为出现版本不支持的问题(已实测) 持续报错: -- client log Exception in thread "main" java.lang.BootstrapMethodError: java.lang.NoSuchMethodError: org.a…

开源医疗大模型Llama3-Aloe-8B-Alpha,性能超越 MedAlpaca 和 PMC-LLaMA

前言 近年来,大型语言模型 (LLM) 在医疗领域展现出巨大潜力,能够帮助医生和研究人员更快地获取信息、分析数据,并提高医疗服务效率。然而,目前市场上大多数医疗 LLM 都是闭源模型,限制了其在学术研究和应用领域的推广…

二层弹出框,点掉小弹出框后,遮罩层没有消失

解决办法把 父元素的vue实例对象的,最后一个元素删除。删除的就是遮罩层元素 thus.$ refs.dialig.$ parent.$ el.lastChild. remove()

Bigtable: A Distributed Storage System for Structured Data

2003年USENIX,出自谷歌,开启分布式大数据时代的三篇论文之一,底层依赖 GFS 存储,上层供 MapReduce 查询使用 Abstract 是一种分布式结构化数据存储管理系统,存储量级是PB级别。存储的数据类型和延时要求差异都很大。…