15.4.2 MQTT协议简介
1.概述
MQTT协议是一种基于发布/订阅(Publish/Subscribe)模式的轻量级通信协议,该协议构建于TCP/IP上,由IBM公司于1999年发布。MQTT协议最大的优点在于它可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通信协议,MQTT协议在物联网、小型设备、移动应用等方面有较广泛的应用。
MQTT协议通信原理如图15.27所示。在通信过程中,系统中有3种身份:发布者(Publisher)、代理者(Broker,即服务器)、订阅者(Subscriber)。其中,消息的发布者和订阅者都是客户端,代理者是服务器,发布者可以同时是订阅者。
2.报文及格式

图15.27 MQTT协议通信原理
下面以MQTT-3.1.1协议为内容分析其应用。MQTT控制报文由3部分组成,分别是固定报头、可变报头、有效载荷(根据需要可选),所以一个报文数据=固定报头+可变报头+有效载荷。MQTT报文结构如表15.5所示。
表15.5 MQTT报文结构

(1)固定报头。
固定报头由两个字节组成,第一个字节的7~4位为控制报文类型,3~0位为标志位;第二个字节表示剩余长度(包含可变报头和有效载荷)。固定报头结构如表15.6所示。
表15.6 固定报头结构

①控制报文类型。
MQTT协议中提供14种控制报文类型,如表15.7所示。这些报文实现客户端和服务器之间的通信。客户端首先通过CONNECT报文与服务器之间建立连接,然后订阅请求或发布消息。当没有通信时,客户端要定时发送PINGREQ报文给服务器的心跳包,以建立长连接。
表15.7 MQTT控制报文类型
(https://www.daowen.com)
②标志位。
第一个字节的3~0位作为保留位时,要求按照协议规定传输固定值,其他按标志位定义的含义传输值,标志位功能如表15.8所示。
表15.8 标志位功能

•DUP1表示控制报文的重复分发标志。
•QoS2表示PUBLISH报文的服务质量等级。
•RETAIN3表示PUBLISH报文的保留标志。
③剩余长度。
剩余长度表示当前报文剩余部分的字节数,包括可变报头和负载的数据。剩余长度不包括用于编码剩余长度字段本身的字节数。
剩余长度字段使用变长编码方案,最小1个字节,最大4个字节。每个字节的低7位用于编码数据,最高位用0或1指示是否有更多字节。
例如,CONNECT报文剩余长度如果是200字节,那么固定报文为10 C8 01;如果是1 000字节,那么固定报文为10 E8 07。
(2)可变报头。
某些控制报文包含可变报头,每个协议的可变报头都不一样,大多数控制报文都会有的字段是报文标识符。可变报头在各个控制报文中的详细内容读者可参见协议MQTT-3.1.1。
(3)有效载荷。
有效载荷是除控制报文格式以外的有效信息,CONNECT、PUBLISH、SUBSCRIBE等需要传递有效信息的协议帧都需要有效载荷,即要传输的数据。
综上所述,要实现MQTT协议通信过程,一定要严格按照其报文格式对数据进行打包和拆包,才能确保联网和数据的有效通信。