一:背景:
MQTT协议是基于TCP/IP协议栈构建的异步通信协议,是轻量级的发布订阅传输协议,MQTT将发布者和接受者中间进行分离,可以在不可靠的网络中进行拓展,适用于设备硬件存储空间有限或者网络带宽有限的场景。
注:MQTT协议支持TLS/SSL的加密通信,保证信息安全。
二:名词解构:
1:Client(客户端):发布消息,订阅/取订消息,连接/断开代理的连接。
2:Server:(服务端/代理端):充当发布消息的客户端和已订阅的客户端的中介。
接受多个订阅者,只接受一个发布者,点对点。
处理客户端/订阅者的各类诉求。
转发与客户端订阅匹配的消息。
3:Topic(主题):消息的类型,订阅者在订阅后就会接收到该主题内容/负载。
4:Payload(负载):消息的内容。
5:Session(会话):客户端和服务器之间的信息交互。
三:三种服务质量(QOS)
1:QOS 0:最多一次,这一级别会发生消息丢失或者重复,其依赖于TCP/IP网络,<=1次
2:QOS 1:至少发送一次(至少一次的将消息发送给订阅者),消息会确保到达,但是消息会重复 >=1次。
3:QOS 2:只有一次,发送一次消息(必然到达) =1,适用于严格计费的系统,花销也大。
四:MQTT的三大结构之:固定头
1:固定头:存在于所有的MQTT数据包中,表示数据包类型及数据包分组类标识,包括:连接,发布,订阅。
固定头=消息类型+DUP+可靠等级+RETAIN
地址\bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Byte1 | MQTT数据包类型 | 不同类型MQTT数据包具体标识 | ||||||
Byte2 | 剩余长度 |
内容长度:八位四字节:0~127,若其为大于127的值,用最高位表示是否有后续字节,数据包最大可以容纳256MB的数据。
所以,第一个字节的高四位可以确定消息报文的类型;4个bit位可以确定16种类型;0000和1111是保留字段。
MQTT中有关Bit的知识:
Bit的【3-0】位:为标志位,用来控制报文的类型的字段
(1):其中Bit【3】为DUP字段,若是DUP=1,则该数据包为一条重复的消息,否则该数据为第一次发布的消息。
(2):Bit【2-1】为QOS 字段:QOS 0:Bit1=0 Bit2=0 至多一次消息发送。
QOS1:Bit1=1 Bit2=0 至多一次消息发送。
QOS2:Bit1=0 Bit2=1只发送一次消息。
非法:Bit1=1Bit2 空置,服务器认为非法会关闭当前连接。
目前Bit【3-0】只在PUBLISH协议中生效,且指定为MQTT 3.11/5.0版本。
PUBLISH中的Bit【0】中的RETAIN字段,发布了保留标识,当Bit【0】=1:表示服务器要求保留这次推送的消息,如果有新的订阅者出现,则将此消息推送给他,若没有,则将此次消息推送至已有订阅者之后再释放。
MQTT的消息报文类型如下:Bit【7-4】位
报文类型 | 字段位 | 数据方向 | 描述 | 7-4位Bit位 |
保留 | 0 | 禁用 | 保留 | 0000 |
CONNECT | 1 | Client-->Server | 客户端连接到服务器 | 0001 |
CONNACK | 2 | Server-->Client | 连接确认 | 0010 |
PUBLISH | 3 | Client<-->Server | 发布消息 | 0011 |
PUBACK | 4 | Client<-->Server | 发布确认(QOS1) | 0100 |
PUBREC | 5 | Client<-->Server | 消息已接受(QOS2第一阶段 | 0101 |
PUBREL | 6 | Client<-->Server | 消息释放(QOS2第二阶段 | 0110 |
PUBCOMP | 7 | Client<-->Server | 发布结束(QOS2第三阶段 | 0111 |
SUBSCRIBE | 8 | Client<-->Server | 客户端订阅请求 | 1000 |
SUBACK | 9 | Server-->Client | 服务端订阅缺失 | 1001 |
UNSUBSCRIBE | 10 | Client-->Server | 客户端取消订阅确认 | 1010 |
UNSUBACK | 11 | Server-->Client | 服务端取消订阅确认 | 1011 |
PINGREQ | 12 | Client-->Server | 客户端发送心跳 | 1100 |
PINGRESP | 13 | Server-->Client | 服务端回复心跳 | 1101 |
DISCONNECT | 14 | Client-->Server | 客户端断开连接请求 | 1110 |
AUTH(V5.0使用) | 15 | Client<-->Server | 认证数据交换 | 1111 |