MQTT 协议格式 | 学习笔记

简介: 快速学习 MQTT 协议格式

开发者学堂课程【嵌入式之 RFID 开发与应用2020版:MQTT 协议格式】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/665/detail/11173


MQTT 协议格式

内容简介

一、MQTT 协议

二、MQTT 报文格式

 

本节内容简单学习 MQTT 协议,如果不需要进行 MQTT 协议栈开发,就不需要深度学习协议,了解协议对应用开发有一定帮助。

 

一、MQTT 协议

image.png

mqtt 是应用层协议,按照 TCP/IP 四层参考模型,最底层是数据链路层,然后分别是网络层,传输层,应用层,应用层是最常见的,比如 http,ftp 等,还有后面物联网会使用低功耗通信协议 CoAP, CoAP 是建立在 UDP 之上,今天学习的 MQTT是建立在 TCP 上的,所以因为 TCP 本身开销大,MQTT 功耗也高。

 

二、MQTT 报文格式

通信过程中,除了底层 TCP 保障传输,网络包括数据链路的一系列投靠,在应用层有自己的数据包格式。格式从大的层面可以分为 2 个,细分则有 4 个。第一个是固定控制报头,因为它永远是一个字节,一个字节分为两段,高四位和低四位,第二个是剩余数据长度,基本固定,长度不超过 4bytes,告诉我们接下来还有多少数据;第三个是可变长度报头,主要服务于 payload;第四个是有效数据载荷,根据可变报头类型变化发送变化。

1.MQTT 报文格式

Control

Header

Pakcet

Length

Variable

Header

Payload

 

1 Byte

1- 4 Bytes

0- x Byte

0-y Byte

所以整个数据长度是可变的,大概分为固定控制报头,剩余数据长度,可变长度报头,有效数据载荷。

固定控制报头固定的一个字节被分为 2 个字段,高 4 位和低 4 位。高 4bit 表示14种控制报文类型。

建议打开 MQTT 协议,所讲协议是 MQTT 建立在 3.1.1 基础上,网上可以下载翻译版和原版。

最开始就会进行协议介绍,前面会有专业术语和简单介绍。和我们所讲不同,这里是由三部分组成,由固定报头,可变报头和有效载荷组成,省略了剩余长度。

固定报头:

image.png

固定报头分为高 4 位和低 4 位,高 4 位代表 MQTT 控制报文的类型,低 4 位代表用于指定控制报文类型的标志位。

2.控制报文的类型:

image.png

去除首尾保留部分,类型有 14 个。这里标记出报文的流动方向,是客户端留向服务端还是服务端流向客户端还是都可以。比如 CONNECT 是客户端发往服务端的连接请求,就是现在有连接需求,服务器应该做出响应,而 CONNACK 是服务器表达响应,叫做连接报文确定。Publish 是发布请求,发布请求服务器和客户端都可以进行,服务器并不只是服务器,本身可以发布订阅。PUBACK 是发布确认。正常情况根据信息的服务质量,QoS0, 发布信息后就不需要再管是否收到,QoS1 级别会进行发布信息确认,服务器会回应收到,QoS2 级别通讯除了以上两次握手,还需要服务器记录消息发布方认为我释放了信息,经过了更多步骤,经历 5 个来回才完成发布,发布是最可靠的。接下来是订阅请求,SUBSCRIBE 是客户端订阅请求,SUBACK 是取消订阅,以及 UNSUBACK 是取消订阅确认。心跳包,属于可变报头约定的数据格式,可以设置心跳的时间间隔,在不低于这个间隔内必须发送一次心跳请求。还可以发起断开连接 DISCONNECT。

以上是整个 MQTT 的报文数据类型,共 14 个,有固定报头高 4 位确定。

3.标志

image.png

image.png

标志是 4 位,大致是根据控制报文类型会有对应参数,比如建立连接 CONNECT 和连接应答 CONNACK 是 0,发布记录释放完成只有一个值不一样等,根据报文类型不同,标志也不同。

DUP1  = 控制报文的重复分发标志

QoS2= PUBLISH 报文的服务质量等级

RETAIN3 = PUBLISH 报文的保留标志

PUBLISH 控制报文中的 DUP, QoS 和 RETAIN 标志的描述见 3.3.1 节。

4.剩余数据长度,剩余包括指定长度和可变报头和载荷。

剩余长度位置:从第 2 个字节开始。

剩余长度( Remaining Length ) 表示当前报文剩余部分的字节数,包括可变报头和负載的数据。剩余长度不包括用于编码剩余长度字段本身的字节数。

剩余长度字段使用一个变长度编码方案,对小于 128 的值它使用单字节编码。更大的值按下面的方式处理。低7位有效位用于编码数据,最高有效位用于指示是否有更多的字节。因此每个字节可以编码 128  个数值和一个延续位( continuation bit )。剩余长度字段最大 4 个字节。

因为剩余长度不仅表达了可变报头长度还有载荷,载荷里面除了主题还包含了内容,内容很多,所以内容理论上 4 字节情况最多能发 256MB。

(1)可变报头

根据报文类型的不同,会有不同的报文标识

协议名称 (Protocol Name )

协议级别( Protocol Level )

连接标志( Connect Flags )

保活时间( Keep Alive )

连接标识( Packet Identifier )

可变报头从协议名称开始就不包含固定头,前两个字节约定了大小端

名称( MQTT 占了 4 个字节)。协议级别在第七个字节,接下来是连接标志,属于第八个字节,这和载荷有很大关系,指出了有效载荷中的字段是否存在,比如标志是数用户名还是密码。后面是保活时间,即保存连接的时间,用了 16 位的字它占了两个字节,第九个字节和第十个字节,保持连接是以秒为单位的时间间隔,不能有小数。

image.png

保持连接( Keep Alive )是一个以秒为单位的时间间隔,表示为一个 16 位的字,它是指在客户端传输完成一个控制报文的时刻到发送下一个报文的时刻,两者之间允许空闲的最大时间间隔。客户端负责保证控制报文发送的时间间隔不超过保持连接的值。如果没有任何其它的控制报文可以发送,客户端必须发送一个 PINGREQ 报文 [MQTT-3.1.2-23]。

不管保持连接的值是多少,客户端任何时候都可以发送 PINGREQ 报文,并且使用 PINGRESP 报文判断网络和服务端的活动状态。所以在不低于给定保活时间内需要有心跳包。

所以从协议名称,协议级别,连接标志,保活时间就构成协议的头,具体内容是什么是由可变头和连接标识决定。

了解整个协议大概就是如此,具体每一个字段作用建议参考手册 3.1.1。

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
7月前
|
消息中间件 物联网 网络性能优化
MQTT常见问题之MQTT不支持5.0的协议如何解决
MQTT(Message Queuing Telemetry Transport)是一个轻量级的、基于发布/订阅模式的消息协议,广泛用于物联网(IoT)中设备间的通信。以下是MQTT使用过程中可能遇到的一些常见问题及其答案的汇总:
|
11天前
|
数据采集 传感器 监控
多协议网关BL110钡铼6路RS485转MQTT协议云网关
BL110钡铼6路RS485转MQTT协议云网关是一款高性能、易配置的工业级设备,适用于各种需要远程监控和数据采集的物联网应用场景。通过将传统RS485设备的数据转换为MQTT协议并上传至云平台,实现了设备的远程管理和智能控制,极大地提升了系统的管理效率和响应速度。
21 2
|
2月前
|
网络协议 物联网 网络性能优化
物联网协议比较 MQTT CoAP RESTful/HTTP XMPP
【10月更文挑战第18天】本文介绍了物联网领域中四种主要的通信协议:MQTT、CoAP、RESTful/HTTP和XMPP,分别从其特点、应用场景及优缺点进行了详细对比,并提供了简单的示例代码。适合开发者根据具体需求选择合适的协议。
62 5
|
3月前
|
消息中间件 监控 物联网
MQTT协议对接及RabbitMQ的使用记录
通过合理对接MQTT协议并利用RabbitMQ的强大功能,可以构建一个高效、可靠的消息通信系统。无论是物联网设备间的通信还是微服务架构下的服务间消息传递,MQTT和RabbitMQ的组合都提供了一个强有力的解决方案。在实际应用中,应根据具体需求和环境进行适当的配置和优化,以发挥出这两个技术的最大效能。
201 0
|
7月前
|
传感器 网络协议 Ubuntu
MQTT协议与EMQ
MQTT协议与EMQ
186 0
|
4月前
|
物联网 C# 智能硬件
智能家居新篇章:WPF与物联网的智慧碰撞——通过MQTT协议连接与控制智能设备,打造现代科技生活的完美体验
【8月更文挑战第31天】物联网(IoT)技术的发展使智能家居设备成为现代家庭的一部分。通过物联网,家用电器和传感器可以互联互通,实现远程控制和状态监测等功能。本文将探讨如何在Windows Presentation Foundation(WPF)应用中集成物联网技术,通过具体示例代码展示其实现过程。文章首先介绍了MQTT协议及其在智能家居中的应用,并详细描述了使用Wi-Fi连接方式的原因。随后,通过安装Paho MQTT客户端库并创建MQTT客户端实例,演示了如何编写一个简单的WPF应用程序来控制智能灯泡。
138 0
|
4月前
|
物联网 网络性能优化 Python
"掌握MQTT协议,开启物联网通信新篇章——揭秘轻量级消息传输背后的力量!"
【8月更文挑战第21天】MQTT是一种轻量级的消息传输协议,以其低功耗、低带宽的特点在物联网和移动应用领域广泛应用。基于发布/订阅模型,MQTT支持三种服务质量级别,非常适合受限网络环境。本文详细阐述了MQTT的工作原理及特点,并提供了使用Python `paho-mqtt`库实现的发布与订阅示例代码,帮助读者快速掌握MQTT的应用技巧。
93 0
|
6月前
|
数据采集 监控 物联网
MQTT协议在智能制造中的应用案例与效益分析
【6月更文挑战第8天】MQTT协议在智能制造中的应用案例与效益分析
172 1
|
6月前
|
消息中间件 存储 RocketMQ
消息队列 MQ产品使用合集之Remoting协议是否可以直接和proxy交互的吗
阿里云消息队列MQ(Message Queue)是一种高可用、高性能的消息中间件服务,它允许您在分布式应用的不同组件之间异步传递消息,从而实现系统解耦、流量削峰填谷以及提高系统的可扩展性和灵活性。以下是使用阿里云消息队列MQ产品的关键点和最佳实践合集。
|
6月前
|
消息中间件 Serverless Windows
消息队列 MQ产品使用合集之MQTT协议是否可以应用于社交软件的系统通知场景
阿里云消息队列MQ(Message Queue)是一种高可用、高性能的消息中间件服务,它允许您在分布式应用的不同组件之间异步传递消息,从而实现系统解耦、流量削峰填谷以及提高系统的可扩展性和灵活性。以下是使用阿里云消息队列MQ产品的关键点和最佳实践合集。