乐鑫官网中文esp32 WiFi+蓝牙无线接收模块MQTT 协议功能,从远程控制的拓扑结构来看,智能手机和被控设备不是直接连接的,智能手机和被控设备都连接到云服务器(云端),智能手机发送的数据和被控设备发送的数据都是通过云端进行转发的。那么,设备与云端连接的协议是什么?数据通信的协议是什么?只有弄清楚这些协议,才能对远程控制有一定的认识。目前常见的设备与云端连接的协议有 MQTT 协议和 HTTP 协议。本文主要介绍 MQTT 协议。
MQTT 协议介绍
MQTT (Message Queue Telemetry Transport)是一个基于客户端/服务器端(C/S)架构的发布/订阅模式的消息传输协议。该协议具有轻巧、开放、简单、规范和易于实现的特点,适合于资源受限设备,属于物联网的标准传输协议之一。乐鑫官网中文esp32 WiFi+蓝牙无线接收模块MQTT 协议由 IBM 于 1999 年发布,目前MQTT 协议已经发展到 v5.x,ESP-IDF 支持v3.1.1。MQTT v5.x 与 v3.x 的差异比较大,而且不是互相兼容的。目前市面上大部分云平台还是以 v3.x 为主,因此本文介绍的是 MQTT v3.x。
MQTT 协议运行在 TCP 协议之上,具有如下特点:
·使用发布/订阅消息模式,提供了一对多的消息分发模式和应用之间的解耦。
·消息传输时不需要知道负载内容。
·提供三种等级的服务质量(QoS) 来保证数据的传输。
·传输消耗很小,可大限度地减少网络流量。
·支持遗嘱消息,在连接异常断开时,能通知到相关各方。
MQTT 协议原理
MQTT 协议是基于客户端与服务器端架构进行通信的。在乐鑫官网中文esp32 WiFi+蓝牙无线接收模块MQTT 协议中,有三个角色: 发布者 (Publisher)、代理服务器 (Broker) 和订阅者(Subscriber)。发布者和订阅者都属于客户端,并且客户端可以既是消息的发布者也可以是消息的订阅者;代理服务器是服务器端。
(1) 客户端。通常指使用 MQTT 程序的设备,可以是发布者和订阅者,一般可将智能手机和被控设备视为客户端。客户端总是通过网络连接到服务器端的,可以现实以下功能:
·将应用消息发布给其他相关的客户端。
·通过订阅以请求接收相关的应用消息。
·通过取消订阅以移除接收应用消息的请求
·断开和服务器端的连接。
(2)服务器端。通常指代理服务器,作为发送消息的客户端和请求订阅的客户端之间的中介一般可将云平台和云服务器视为服务器端。服务器端可以实现以下功能:
·接收来自客户端的网络连接。
·接收客户端发布的应用消息。
·处理客户端的订阅和取消订阅请求。
·将应用消息转发给符合条件的客户端。
(3)订阅(Subscribe)。乐鑫官网中文esp32 WiFi+蓝牙无线接收模块订阅包含一个主题过滤器(Topic Filter)和一个大的服务质量(QoS)等级。订阅与单个会话(Session) 关联,会话可以包含多个订阅。会话的每个订阅都有一个不同的主题过滤器。
(4)主题 (Topic)。主题是附加在应用消息上的一个标签,服务器端在已知该标签的情况下向订阅了该标签的客户端发送该应用消息的副本。
(5)主题过滤器(Topic Filter)。订阅中包含的一个表达式,用于表示相关的一个或多个主题。
主题过滤器可以使用通配符,用于代替单个或多个字符。
(6)会话(Session)。客户端和服务器端之间的状态交互,一些会话的持续时长与网络连接样。客户端和服务器端从建立连接到断开连接之间的状态交互称为会话。
(7)订阅与发布模式。订阅与发布模式是乐鑫官网中文esp32 WiFi+蓝牙无线接收模块MQTT 协议的灵魂,订阅者和发布者不需要关心对端的IP地址和端口号,也不需要直接与对端相连,它们甚至不知道对端是否存在。订阅者和发布者之间由代理服务器维系两者的消息交换,代理服务器过滤所有发布者发布的消息,然后分发给合适的订阅者。发布者和订阅者都需要关心消息的主题。例如,智能手机想查看智能灯 A 的状态,此时智能毛机可以作为订阅者向代理服务器订阅主题为 A/light_state 的订阅消息,智能灯设备 A可以作为发布者,当智能灯的状态发生变化时,就会发布主题为 A/light_state 的状态消息给代理服务器;代理服务器过滤订阅了主题 A/light state 的订阅者,将状态消息发布给智能手机,这样智能手机就能查询到智能灯 A 的状态。
MQTT 消息格式
在MQTT 协议中,MQTT 控制报文由固定头 (Fixed Header)、可变头(Variable Header) 和消息体(Payload)三部分组成。
(1)固定头。存在于所有 MQTT 控制报文中。
乐鑫官网中文esp32 WiFi+蓝牙无线接收模块MOTT 控制报文的类型占 4 bit,一共有 14 种类型:
名字 值 报文流动方向 描述
Reserved 0 禁止 保留
CONNECT 1 客户端到服务器端 客户端请求连接服务器端
CONNACK 2 服务器端到客户端 连接报文确认
PUBLISH 3 两个方向都允许 发布消息
PUBACK 4 两个方向都允许 QoS 1 消息发布收到确认
PUBREC 5 两个方向都允许 发布收到(保证交付一步)
PUBREL 6 两个方向都允许 发布释放(保证交付第二步)
PUBCOMP 7 两个方向都允许 QoS 2 消息发布完成(保证交互第三步)
SUBSCRIBE 8 客户端到服务器端 客户端订阅请求
SUBACK 9 服务器端到客户端 订阅请求报文确认
UNSUBSCRIBE 10 客户端到服务器端 客户端取消订阅请求
UNSUBACK 11 服务器端到客户端 取消订阅报文确认
PINGREQ 12 客户端到服务器端 心跳请求
PINGRESP 13 服务器端到客户端 心跳响应
DISCONNECT 14 客户端到服务器端 客户端断开连接
乐鑫官网中文esp32 WiFi+蓝牙无线接收模块MQTT 消息质量有三个等级,即 QoS 0、QoS 1和QS 2。
1) QoS 0。多分发一次。消息的传输完全依赖底层的 TCP/IP 网络,MQTT 协议里没有定
应答和重试,消息要么只会到达服务器端一次,要么根本没有到达。
2) QoS 1。至少分发一次。服务器的消息接收由 PUBACK 消息进行确认,如果通信链路或发送设备异常,或者在指定时间内没有收到确认消息,则发送端会重发这条报文,并且在 MOTT控制报文固定头中设置重发标志位 (DUP)。
3) QoS 2。只分发一次。这是高级别的服务质量等级,消息丢失和重复都是不可接受的,使用这个服务质量等级会有额外的开销。
MOTT 控制报头固定头的 bit0~bit3 为标志位,依照控制报文类型有不同的含义。事实上,除了PUBLISH类型,其他控制报文类型的标志位均为系统保留,在不使用标志位的消息类型中,标志位被作为保留位。如果收到无效的标志,接收端就必须关闭网络连接。PUBLISH报文头Byte 1中 bito~bit3 组成如下:
1)DUP (bit3)。重发标志位。如果 DUP 标志位被设置为 0,则表示这是客户端或服务器端一次请求发送 PUBLISH 报文。如果 DUP 标志位被设置为 1,则表示这可能是一个早前报文请求的重发。对于 QoS0 的消息,DUP 标志位必须设置为 0。
2) QoS (bit2~bit1)。发布消息的服务质量等级,保证消息传输的次数。Qo
S值与bit2~bit1的关系:
QoS值 bit2 bitl 描述
0 0 0 多分发一次
1 0 1 至少分发一次
2 1 0 只分发一次
- 1 1 保留
3)RETAIN(bit0)。保留标志位。如果客户端发给服务器端的 PUBLISH 报文的保留(RETAIN)标志位被设置为 1,则服务器端必须存储这个报文和它的服务质量等级(QoS),以便它可以被分发给未来与主题名匹配的订阅者,在建立一个新的订阅时,对于每个匹配的主题名,如果存在近保留的消息,则该消息必须被发送给这个订阅者。RETAIN 标志位通常用于遗嘱消息,例如在设备异常离线后,代服务器会将嘱消息告知给智能手机,智能手机就会示设备离线的状态。第 2个及以后的字节表示剩余长度,表示当前控制报文剩余部分的字节数,包括可变报头和负载的数据。剩余长度字段使用一个可变长度的编码方案,对小于 128 的值使用单字节编更大的值按下面的方式处理:低 7位有效位用于编码数据,高有效位用于指示是否有更多的字节。因此每个字节可以编码 128 个数值和一个延续位。剩余长度字段大为 4 B。剩余长度字节数如下表所示。
字节 小值 大值
1 0 (0x00) 127 (0x7F)
2 128 (0x80、0x01) 16383 (0xFF、0x7F)
3 16384 (0x80、0x80、0x01) 2097151 (0xFF、0xFF、0x7F)
4 2097152 (0x80、0x80、0x80、0x01) 268435455 (0xFF、xFF、0xFF、0x7F)
(2)可变头。某些乐鑫官网中文esp32 WiFi+蓝牙无线接收模块MQTT 控制报文包含一个可变报头部分,它在固定报头和负载之间,可变报头的内容根据控制报文类型的不同而不同。可变报头的报文标识符(Packet Identifier)字段存在于多种类型的控制报文中,如 PUBLISH (QOS>0时)、PUBACK、PUBREC、PUBRELPUBCOMP、SUBSCRIBE、SUBACK、UNSUBSCIBE、UNSUBACK。
(3)有效载荷。消息体位于 MQTT 数据报的第三部分,包含 CONNECT、SUBSCRIBE、
SUBACK、UNSUBSCRIBE 和 PUBLISH 五种类型的消息。
1) CONNECT。消息体内容主要是客户端的 ClientID、订阅的 Topic、Message,以及用户名和密码。
2) SUBSCRIBE。消息体内容是一系列要订阅的主题以及 QoS。
3)SUBACK。消息体内容是服务器对于 SUBSCRIBE 所申请的主题以及 QoS 进行确认和回复。
4)UNSUBSCRIBE。消息体内容是要取消订阅的主题。
5)PUBLISH。消息体内容是发布的应用消息,可以是零长度的。