前言
诞生及优势
MQTT由Andy Stanford-Clark(IBM)和Arlen Nipper(Eurotech,现为Cirrus Link)于1999年开发,用于监测穿越沙漠的石油管道。目标是拥有一个带宽有效且使用很少电池电量的协议,因为这些设备是通过卫星链路连接的,当时这种设备非常昂贵。与HTTP及其请求/响应范例相比,该协议使用发布/订阅体系结构。发布/订阅是事件驱动的,可以将消息推送到客户端。中央通信点是MQTT代理,它负责调度发送者和合法接收者之间的所有消息。向代理发布消息的每个客户端都在消息中包含一个主题。主题是代理的路由信息。每个想要接收消息的客户端都订阅某个主题,并且代理将具有匹配主题的所有消息传递给客户端。因此,客户不必彼此了解,他们只通过主题进行通信。该架构支持高度可扩展的解决方案,而不依赖于数据生产者和数据使用者。
发布/订阅架构
与HTTP的区别在于客户端不必提取所需的信息,但是在有新内容的情况下,代理会将信息推送到客户端。因此,每个MQTT客户端都与代理具有永久打开的TCP连接。如果此连接在任何情况下中断,MQTT代理可以缓冲所有消息,并在它重新联机时将它们发送到客户端。如前所述,MQTT中用于分派消息的核心概念是主题。主题是一个简单的字符串,可以有更多的层次结构级别,用斜杠分隔。用于发送起居室的温度数据的示例主题可以是房屋/起居室/温度。一方面,客户端可以订阅确切的主题,或者另一方面使用通配符。对房屋/ + /温度的订阅将导致所有消息发送到先前提到的主题房屋/起居室/温度以及在起居室的地方具有任意值的任何主题,例如房屋/厨房/温度。加号是单级通配符,只允许一个层次结构的任意值。如果您需要订阅多个级别,例如订阅整个子树,还有一个多级通配符(#)。它允许订阅所有底层层次结构级别。比如房子/#订阅以house开头的所有主题。
适用人群
以下内容需要你对照着MQTT协议内容仔细推敲
推荐资源:
MQTT控制报文格式
MQTT控制报文结构
结构备注
Fixed header
固定报头,所有控制报文都包含
Variable header
可变报头,部分控制报文包含
Payload
有效载荷,部分控制报文包含
固定报头 Fixed header
+-----+-----+-----+-----+-----+------+------+------+-------+
| | | | | | | | | |
| Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
+-----------+-----+-----+------------+------+------+-------+
| | | |
|byte1|MQTT ControlPacket type| Flags |
+----------------------------------------------------------+
| | |
|byte2| Remaining Length |
+----------------------------------------------------------+
控制报文类型(MQTT Control Packet type)
名字值报文流动方向描述
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
客户端到服务端
客户端断开连接
Reserved
15
禁止
保留
标志(Flags)
控制报文固定报头标志Bit 3Bit 2Bit 1Bit 0
CONNECT
Reserved
0
0
0
0
CONNACK
Reserved
0
0
0
0
PUBLISH
Used in MQTT 3.1.1
DUP1
QoS2
QoS2
RETAIN3
PUBACK
Reserved
0
0
0</