MQTT协议简介

ops/2024/10/9 2:36:19/

MQTT_0">MQTT协议介绍

MQTT是一个客户端服务端架构的发布/订阅模式的消息传输协议。它具有轻巧、开放、简单、规范、易于实现的特点,适用于受限环境如机器与机器的通信(M2M)以及物联网环境(IoT)。以下是对MQTT协议的详细介绍:

数据表示

  • 二进制位:字节中的位从0到7,第7位是最高有效位,第0位是最低有效位。
  • 整数数值:整数数值是16位,使用大端序(高位字节在低位字节前面)。
  • UTF - 8编码字符串:控制报文中的文本字段编码为UTF - 8格式的字符串,有长度限制且需符合特定规则,如不能包含某些Unicode代码点的编码。

控制报文格式

  • 结构组成:由固定报头、可变报头和有效载荷三部分组成。
  • 固定报头:包含MQTT控制报文的类型和标志位,以及剩余长度字段,剩余长度使用变长度编码方案。
  • 可变报头:部分控制报文包含,其中报文标识符字段存在于多个类型的报文里,不同报文对报文标识符有不同要求。
  • 有效载荷:部分控制报文包含,如CONNECT、PUBLISH(可选)、SUBSCRIBE等报文需要有效载荷。

控制报文类型

  • CONNECT:客户端到服务端网络连接建立后发送的第一个报文,有效载荷包含客户端标识符、Will主题、Will消息、用户名和密码等字段,各字段根据标志位决定是否存在。
  • CONNACK:服务端发送给客户端的确认连接请求报文,包含连接确认标志和连接返回码。
  • PUBLISH:用于传输应用消息,包含重发标志DUP、服务质量等级QoS和保留标志RETAIN等。
  • PUBACKPUBRECPUBRELPUBCOMP:分别是QoS 1和QoS 2等级的PUBLISH报文的相关确认报文。
  • SUBSCRIBE:客户端用于创建订阅,有效载荷包含主题过滤器列表和服务质量要求字段。
  • SUBACK:服务端用于确认收到并处理SUBSCRIBE报文,包含返回码清单。
  • UNSUBSCRIBE:客户端用于取消订阅主题,有效载荷包含主题过滤器列表。
  • UNSUBACK:服务端用于确认收到UNSUBSCRIBE报文。
  • PINGREQPINGRESP:用于心跳请求和响应,保持连接状态。
  • DISCONNECT:客户端发给服务端的最后一个控制报文,表示正常断开连接。

服务质量(QoS)等级

  • QoS 0:最多分发一次,消息分发依赖底层网络能力,发送者发送QoS等于0、DUP等于0的PUBLISH报文,接收者不发送响应,发送者不重试。
  • QoS 1:至少分发一次,PUBLISH报文可变报头包含报文标识符,需要PUBACK报文确认,发送者需分配未使用的报文标识符,接收者响应的PUBACK报文需包含对应标识符。
  • QoS 2:仅分发一次,消息可变报头有报文标识符,接收者使用两步确认过程,发送者需分配未使用的报文标识符,发送的PUBLISH报文需符合特定规则,且有一系列的确认和重发机制。

主题和订阅

  • 主题通配符:主题过滤器中可以使用通配符,包括多层通配符“#”和单层通配符“+”,但主题名不能使用通配符。
  • 主题语义和用法:主题名和主题过滤器需符合一系列规则,如至少包含一个字符、区分大小写、可以包含空格等,匹配订阅时服务端需按规则进行处理。

MQTT_37">MQTT协议具有以下优点和缺点:

优点

  1. 轻巧简单
    • 协议设计MQTT协议的设计思想是轻巧、开放、简单、规范且易于实现。它采用发布/订阅模式,消息传输的流程相对简洁,易于理解和应用。
    • 代码实现:对于资源受限的设备,如物联网中的传感器和执行器等,其简单的设计使得在这些设备上实现MQTT客户端相对容易,不需要大量的计算资源和存储空间。
  2. 低带宽和低功耗
    • 消息精简MQTT协议的消息头较小,能够有效减少网络传输的数据量。例如,它采用固定报头和可变报头的结构,通过合理的编码方式,在保证消息完整性和功能性的前提下,尽量压缩了消息的头部信息。
    • 适用于物联网:在物联网环境中,大量的设备可能通过低带宽的网络进行通信,如ZigBee、LoRa等网络。MQTT的低带宽特性使其能够在这些网络中高效运行,同时也降低了设备的功耗,延长了设备的电池寿命。
  3. 可靠传输
    • 服务质量等级(QoS):协议定义了三种服务质量等级(QoS 0、QoS 1、QoS 2),可以根据不同的应用场景需求选择合适的等级。
      • QoS 0提供最多一次的消息传递,适用于对消息丢失不太敏感的场景,如环境监测中的一些周期性数据采集,偶尔丢失一次数据可能不会对整体分析造成太大影响。
      • QoS 1提供至少一次的消息传递,确保消息能够可靠地到达接收方,适合大多数对可靠性有一定要求的应用,如智能家居中的设备控制指令,需要确保指令能够被设备接收到。
      • QoS 2提供只有一次的消息传递,保证消息既不丢失也不重复,适用于对消息准确性要求极高的场景,如金融交易数据的传输。
    • 会话管理:客户端和服务端可以保存会话状态,以支持跨网络连接的可靠消息传输。例如,当客户端因网络故障等原因断开连接后重新连接时,服务端可以根据保存的会话状态恢复与客户端的通信,继续处理未完成的消息传递。
  4. 灵活的主题订阅
    • 主题通配符:主题过滤器中可以使用通配符(多层通配符“#”和单层通配符“+”),允许客户端一次订阅多个主题。例如,客户端可以订阅“sport/tennis/#”,这样它就可以接收到以“sport/tennis/”开头的所有主题的消息,方便对相关主题的消息进行集中处理。
    • 动态订阅:客户端可以在运行时动态地订阅或取消订阅主题,适应不同的应用需求。比如在一个智能工厂环境中,监控设备可以根据生产流程的不同阶段动态订阅相关设备的状态主题,以便及时获取所需信息。

缺点

  1. 有限的消息大小
    • UTF - 8编码限制:控制报文中的文本字段编码为UTF - 8格式的字符串,且每个字符串都有一个两字节的长度字段作为前缀,这限制了可以传送的UTF - 8编码的字符串大小不能超过65535字节。对于一些需要传输大量文本数据的应用场景,如传输长文档或复杂的配置文件等,可能会受到限制。
  2. 缺乏双向身份验证机制(默认)
    • 单向验证MQTT协议本身不是双向信任的,它没有提供客户端验证服务端身份的机制(默认情况下)。虽然可以通过使用TLS等安全协议来实现双向身份验证,但这需要额外的配置和资源。在一些对安全性要求极高的应用场景中,如果没有正确配置双向身份验证,可能会存在安全风险,例如中间人攻击的可能性会增加。
  3. 可能存在的消息顺序问题(在某些网络条件下)
    • 网络因素影响:在一些复杂的网络环境中,如网络拥塞、高延迟或不稳定的网络连接情况下,虽然协议本身定义了消息排序的规则,但可能无法完全保证消息按照发送的顺序到达接收方。例如,在QoS 1的消息传输中,虽然发送者会按照顺序发送消息,接收者也会按照顺序确认,但在网络不稳定时,可能会出现后发送的消息先到达接收方的情况,这可能会对一些对消息顺序敏感的应用造成影响,如实时视频流的控制指令传输等。

关键字术语

  • 网络连接(Network Connection)
    • 定义MQTT使用的底层传输协议基础设施,客户端使用它连接服务端,提供有序的、可靠的、双向字节流传输。
    • 解析:它是MQTT协议运行的基础,确保了客户端和服务端之间能够进行稳定的数据传输。例如,在物联网环境中,传感器设备通过网络连接将数据发送到服务器,这个网络连接可以是基于TCP/IP协议的,并且要满足MQTT对网络连接的要求。
  • 应用消息(Application Message)
    • 定义MQTT协议通过网络传输应用数据,应用消息通过MQTT传输时,有关联的服务质量(QoS)和主题(Topic)。
    • 解析:应用消息是实际需要传输的有效数据,其传输的可靠性和准确性由QoS等级保障,并且通过主题进行分类和标识,以便接收方能够正确地获取和处理相关消息。比如在智能家居系统中,智能灯泡的开关状态信息就是一个应用消息,它可能具有特定的QoS等级,并关联到一个表示灯泡状态的主题。
  • 客户端(Client)
    • 定义:使用MQTT的程序或设备,总是通过网络连接到服务端,可以发布应用消息给其它相关的客户端,订阅以请求接受相关的应用消息,取消订阅以移除接受应用消息的请求,从服务端断开连接。
    • 解析:客户端是MQTT协议中的主动参与者,它可以是各种智能设备、应用程序等。例如,手机上的智能家居控制应用就是一个MQTT客户端,它可以向智能设备发送控制消息(发布应用消息),也可以订阅智能设备的状态主题以获取设备状态信息。
  • 服务端(Server)
    • 定义:一个程序或设备,作为发送消息的客户端和请求订阅的客户端之间的中介,接受来自客户端的网络连接,接受客户端发布的应用消息,处理客户端的订阅和取消订阅请求,转发应用消息给符合条件的已订阅客户端。
    • 解析:服务端在MQTT协议中起到核心的枢纽作用,负责管理客户端的连接、消息的转发和处理订阅等操作。比如在一个物联网云平台中,服务端接收大量物联网设备(客户端)发送的数据,并根据设备的订阅情况将数据转发给相应的设备。
  • 订阅(Subscription)
    • 定义:包含一个主题过滤器(Topic Filter)和一个最大的服务质量(QoS)等级,与单个会话(Session)关联,会话可以包含多于一个的订阅,每个订阅都有一个不同的主题过滤器。
    • 解析:订阅是客户端向服务端表达对特定主题消息感兴趣的一种方式,通过指定主题过滤器和QoS等级,客户端可以确保接收到符合要求的消息。例如,在一个工业监控系统中,监控客户端可以订阅“factory/machine1/status/#”这样的主题过滤器,以获取机器1的各种状态消息,同时可以指定QoS等级来保障消息的可靠性。
  • 主题名(Topic Name)
    • 定义:附加在应用消息上的一个标签,服务端已知且与订阅匹配,服务端发送应用消息的一个副本给每一个匹配的客户端订阅。
    • 解析:主题名用于准确标识应用消息的类别或所属领域,使得服务端能够根据客户端的订阅情况准确地发送消息。例如,在一个智能交通系统中,“traffic/lights/red”可以是一个主题名,表示交通灯变红的相关消息。
  • 主题过滤器(Topic Filter)
    • 定义:订阅中包含的一个表达式,用于表示相关的一个或多个主题,可以使用通配符。
    • 解析:主题过滤器提供了一种灵活的方式让客户端订阅多个相关主题。例如,“sport/tennis/#”这个主题过滤器可以匹配“sport/tennis/player1”、“sport/tennis/player1/ranking”等多个主题,方便客户端获取相关主题的消息。
  • 会话(Session)
    • 定义:客户端和服务端之间的状态交互,一些会话持续时长与网络连接一样,另一些可以在客户端和服务端的多个连续网络连接间扩展。
    • 解析:会话用于维护客户端和服务端之间的交互状态,包括消息的发送和接收状态、订阅信息等。例如,当客户端因为网络故障断开连接后重新连接时,服务端可以根据保存的会话状态恢复与客户端的通信,继续处理未完成的操作。
  • 控制报文(MQTT Control Packet)
    • 定义:通过网络连接发送的信息数据包,MQTT规范定义了十四种不同类型的控制报文,其中一个(PUBLISH报文)用于传输应用消息。
    • 解析:控制报文是MQTT协议中用于管理连接、消息传输和交互的基本单元,不同类型的控制报文具有不同的功能,如连接建立、消息发布和确认、订阅和取消订阅等操作都通过相应的控制报文来实现。

http://www.ppmy.cn/ops/122937.html

相关文章

kafka-windows集群部署

kafka-windows集群部署目录 文章目录 kafka-windows集群部署目录前言一、复制出来四个kafka文件夹二、修改集群每个kafka的配置文件四、启动zookeeper,kafka集群 前言 部署本文步骤可以先阅读这一篇博客,这篇是关于单机kafka部署测试的。本文用到的文件…

Object.values() 、 Object.keys()

拿到当前对象里面的value值 // 假设你有一个对象 const myObject {name: Kimi,age: 30,country: Moon };// 获取对象的所有值 const values Object.values(myObject);// 输出值数组 console.log(values); // ["Kimi", 30, "Moon"] 如果你需要在 Vue 组…

『网络游戏』Tips弹窗队列【10】

修改脚本:DynamicWnd.cs 修改脚本:GameRoot.cs 运行项目 - Tips提示消息按顺序依次弹出显示 修改代码:GameRoot.cs 修改代码:LoginSys.cs 运行项目 设置初始化函数 将CreateWnd设置为隐藏 运行项目 本章结束

Linux 计划任务

1.常见定时计划任务设置方式: at: 突发性的,临时决定只执行一次的任务。 crontab: 定时性的,每隔一定的周期就需要重复执行一次的命令。 用#date 为参考时间 1.1 at 计划任务的使用: 使用…

五子棋双人对战项目(3)——匹配模块

目录 一、分析需求 二、约定前后端交互接口 匹配请求: 匹配响应: 三、实现游戏大厅页面(前端代码) game_hall.html: common.css: game_hall.css: 四、实现后端代码 WebSocketConfig …

0 代码自动化测试:RF 框架实现企业级 UI 自动化测试

RobotFramework框架可以作为公司要做自动化 但是又不会代码的一种临时和紧急情况的替代方案,上手简单。 现在大家去找工作,反馈回来的基本上自动化测试都是刚需!没有自动化测试技能,纯手工测试基本没有什么市场。 但是很多人怕代…

螺蛳壳里做道场:老破机搭建的私人数据中心---Centos下Docker学习03(网络及IP规划)

3 网络及IP规划 3.1 容器连接网络初步规划 规划所有容器与虚拟机的三张网卡以macvlan的方式进行连接(以后根据应用可以更改),在docker下创建nat、wifi、nei、wai四张网卡,他们和虚拟机及宿主机上NIC的相关连接参数如下表所示&am…

C++常见的内存错误和解决策略

目录 1.未初始化指针 (Uninitialized Pointer) 2.内存分配未成功却使用了它 3.野指针 (Dangling Pointer) 4.内存泄漏 (Memory Leak) 5.重复释放内存 (Double Free) 6.内存越界访问 (Buffer Overflow) 7.错误的数组删除方式 (Mismatched Delete) 8.栈内存溢出 (Stack O…