目录
3.5 PUBREC –发布已接收(QoS 2已发布,第1部分)
3.6 PUBREL –发布发布(已收到QoS 2发布,第2部分)
3.7 PUBCOMP –完成发布(已收到QoS 2发布,第3部分)
4.3.1 QoS 0: At most once delivery
4.3.2 QoS 1: At least once delivery
4.3.3 QoS 2: Exactly once delivery
4.4 Message delivery retry(消息重传)
4.7 Topic Names and Topic Filters(主题名称和主题过滤器)
4.7.2 Topics beginning with $(以$开头的主题)
4.7.3 Topic semantic and usage(主题的语法和用法)
6 Using WebSocket as a network transport
1.简介
1.1术语
在本规范中,关键字“必须”,“不得”,“必须”,“应”,“应不”,“应”,“不应”,“建议”,“可以”和“可选”是 如IETF RFC 2119 [RFC2119]中所述进行解释。
网络连接(Network Connection):
由MQTT使用的基础传输协议提供的构造。
- 将客户端连接到服务器。
- ·它提供了在两个方向上发送有序的无损字节流的方法。
有关示例,请参见第4.2节。
应用信息(Application Message):
MQTT协议通过网络为应用程序承载的数据。当MQTT传输应用程序消息时,它们具有关联的服务质量和主题名称。
客户端(Client):
使用MQTT的程序或设备。客户端始终建立与服务器的网络连接。它可以
- 发布其他客户端可能感兴趣的应用程序消息。
- 订阅以请求有兴趣接收的应用程序消息。
- 退订以删除对应用程序消息的请求。
- 断开与服务器的连接。
服务器(Server):
一种程序或设备,充当发布应用程序消息的客户端和进行订阅的客户端之间的中介。服务器
- 接受来自客户端的网络连接。
- 接受客户端发布的应用程序消息。
- 处理来自客户端的订阅和取消订阅请求。
- 转发与客户端订阅匹配的应用程序消息。
订阅(Subscription):
订阅包括主题过滤器和最大QoS。订阅与单个会话关联。一个会话可以包含多个订阅。会话中的每个订阅都有一个不同的主题过滤器。
主题名称(Topic Name):
附加到应用程序消息的标签,该标签与服务器已知的订阅相匹配。服务器将应用程序消息的副本发送给具有匹配订阅的每个客户端。
主题过滤器(Topic Filter):
订阅中包含的一种表达,表示对一个或多个主题感兴趣。主题过滤器可以包含通配符。
会话(Session):
客户端和服务器之间的状态交互。某些会话的持续时间仅与网络连接的时间相同,而其他会话则可以跨越客户端和服务器之间的多个连续的网络连接。
MQTT控制数据包(MQTT Control Packet:):
通过网络连接发送的信息包。 MQTT规范定义了十四种不同类型的控制包,其中一种(发布包)用于传达应用消息。
1.2 数据表示
1.2.1 位
字节中的位标记为7到0。位号7是最高有效位,最低位是0。
1.2.2整数数据值
整数数据值,16位按大端顺序:
高位字节位于低位字节之前。 这意味着在网络上将16位字表示为最高有效字节(MSB),然后是最低有效字节(LSB)。
1.2.3 UTF-8编码的字符串
稍后描述的控制包中的文本字段被编码为UTF-8字符串。 UTF-8 [RFC3629]是Unicode [Unicode]字符的有效编码,可优化ASCII字符的编码以支持基于文本的通信。
这些字符串中的每个字符串都有两个字节的长度字段作为前缀,该字段给出了UTF-8编码的字符串本身的字节数,如下图1.1所示。 因此,在这些UTF-8编码的字符串组件之一中可以传递的字符串的大小受到限制。 您不能使用编码超过65535个字节的字符串。
除非另有说明,否则所有UTF-8编码的字符串的长度都可以在0到65535字节之间。
Bit |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
byte 1 |
String length MSB |
|||||||
byte 2 |
String length LSB |
|||||||
byte 3 …. |
UTF-8 Encoded Character Data, if length > 0. |
UTF-8编码的字符串中的字符数据必须按照Unicode规范[Unicode]的规定,采用格式正确的UTF-8,并在RFC 3629 [RFC3629]中进行重述。 特别是,此数据不得包含U + D800和U + DFFF之间的代码点编码。 如果服务器或客户端收到包含格式错误的UTF-8的控制包,则必须关闭网络连接。
UTF-8编码的字符串不得包含空字符U + 0000的编码。 如果接收方(服务器或客户端)接收到包含U + 0000的控制包,则必须关闭网络连接
数据不应包含下面列出的Unicode [Unicode]代码点的编码。 如果接收方(服务器或客户端)接收到包含任何接收方的控制包,则可以关闭网络连接
U + 0001..U + 001F控制字符
U + 007F..U + 009F控制字符
Unicode规范[Unicode]中定义的代码点为非字符(例如U + 0FFFF)
UTF-8编码的序列0xEF 0xBB 0xBF始终应解释为表示U + FEFF(“零宽度无间断空格”),无论它出现在字符串中什么地方,并且一定不要被数据包接收器跳过或剥离。
2 MQTT控制包格式
2.1 MQTT控制包的结构
MQTT协议通过以定义的方式交换一系列MQTT控制包来工作。 本节介绍这些数据包的格式。
MQTT控制包最多由三部分组成,始终按以下顺序排列,如图2.1-MQTT控制包的结构所示。
固定报头(Fixed header), present in all MQTT Control Packets |
可变报头(Variable header), present in some MQTT Control Packets |
有效载荷(Payload), present in some MQTT Control Packets |
2.2 固定报头
每个MQTT控制包都包含一个固定的报头。 图2.2-固定标头格式说明了固定标头格式。
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
byte 1 |
MQTT 控制报文的类型 |
控制报文类型的标志位 | ||||||
byte 2… |
剩余长度 |
2.2.1 MQTT控制报文类型
位置:字节1,位7-4。
表示为4位无符号值的值在表2.1-控制包类型中列出。
Reserved |
0 |
禁止 |
保留 | |
CONNECT |
1 |
Client to Server |
客户端请求连接服务器 |
|
CONNACK |
2 |
Server to Client |
连接报文确认 |
|
PUBLISH |
3 |
Client to Server or Server to Client |
发布消息 |
|
PUBACK |
4 |
Client to Server or Server to Client |
消息发布收到确认(QoS1) |
|
PUBREC |
5 |
Client to Server or Server to Client |
发布收到 (QoS2) |
|
PUBREL |
6 |
Client to Server or Server to Client |
发布释放(QoS2) |
|
PUBCOMP |
7 |
Client to Server or Server to Client |
发布完成(QoS2) |
|
SUBSCRIBE |
8 |
Client to Server |
客户端订阅请求 |
|
SUBACK |
9 |
Server to Client |
订阅请求报文确认 | |
UNSUBSCRIBE |
10 |
Client to Server |
客户端取消订阅请求 | |
UNSUBACK |
11 |
Server to Client |
取消订阅报文确认 |
|
PINGREQ |
12 |
Client to Server |
心跳请求 |
|
PINGRESP |
13 |
Server to Client |
心跳响应 |
|
DISCONNECT |
14 |
Client to Server |
客户端断开连接 |
|
Reserved |
15 |
Forbidden |
系统保留 |
2.2.2 标志
固定报头中字节1的其余[3-0]位包含特定于每种MQTT控制数据包类型的标志,如下面的表2.2-标志位中所列。
如果在表2.2-标志位中将标志位标记为“保留”,则保留该标志位以备将来使用,并且必须将其设置为该表[MQTT-2.2.2-1]中列出的值。 如果收到无效标志,则接收方必须关闭网络连接[MQTT-2.2.2-2]。 有关处理错误的详细信息,请参见第4.8节。
Control Packet |
Fixed header flags |
Bit 3 |
Bit 2 |
Bit 1 |
Bit 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 |
0 |
PUBREC |
Reserved |
0 |
0 |
0 |
0 |
PUBREL |
Reserved |
0 |
0 |
1 |
0 |
PUBCOMP |
Reserved |
0 |
0 |
0 |
0 |
SUBSCRIBE |
Reserved |
0 |
0 |
1 |
0 |
SUBACK |
Reserved |
0 |
0 |
0 |
0 |
UNSUBSCRIBE |
Reserved |
0 |
0 |
1 |
0 |
UNSUBACK |
Reserved |
0 |
0 |
0 |
0 |
PINGREQ |
Reserved |
0 |
0 |
0 |
0 |
PINGRESP |
Reserved |
0 |
0 |
0 |
0 |
DISCONNECT |
Reserved |
0 |
0 |
0 |
0 |
DUP =重复发送发布控制包
QoS =发布服务质量
RETAIN = PUBLISH保留标志
有关发布控制包中DUP,QoS和RETAIN标志的说明,请参见第3.3.1节。
注:事实上,除了PUBLISH类型报文以外,其他报文的标志位均为系统保留,PUBLISH 报文的第一字节bit3 是控制报文的重复分发标志(DUP),bit1-bit2 是服务质量等级,bit0 是PUBLISH 报文的保留标志,用于标识PUBLISH 是否保留,当客户端发送一个PUBLISH 消息到服务器,如果保留标识位置1,那么服务器应该保留这条消息,当一个新的订阅者订阅这个主题的时候,最后保留的主题消息应被发送到新订阅的用户。
2.2.3剩余长度
位置:从字节2开始。
剩余长度是当前数据包中剩余的字节数,包括变量头和有效载荷中的数据。 剩余长度不包括用于编码剩余长度的字节。
剩余长度使用可变长度编码方案进行编码,该方案使用单个字节表示最大127的值。较大的值按以下方式处理。 每个字节的最低有效七位对数据进行编码,而最高有效位用于指示表示中有后续字节。 因此,每个字节编码128个值和一个“连续位”。 剩余长度字段中的最大字节数为4。
2.3 可变报头
某些类型的MQTT控制包包含可变报头组件。 它位于固定标头和有效负载之间。 可变报头的内容取决于数据包类型。 可变报头的数据包标识符字段在几种数据包类型中是常见的。
2.3.1 数据包标识符
许多控制数据包类型的可变报头组件都包含一个2字节的数据包标识符字段。 这些控制数据包是PUBLISH(QoS> 0),PUBACK,PUBREC,PUBREL,PUBCOMP,SUBSCRIBE,SUBACK,UNSUBSCRIBE和UNSUBACK。
SUBSCRIBE,UNSUBSCRIBE和PUBLISH(在QoS> 0的情况下)控制分组必须包含一个非零的16位分组标识符[MQTT-2.3.1-1]。
每次客户发送一个新的这些类型之一的数据包,它必须给它分配一个当前未使用的数据包标识符[MQTT-2.3.1-2]。
如果客户端重新发送一个特定的控制包,则它必须在该包的后续重新发送中使用相同的包标识符。 在客户端处理了相应的确认数据包后,数据包标识符就可以重用。 在QoS 1 PUBLISH的情况下,这是对应的PUBACK; 在QoS 2的情况下,它是PUBCOMP。
对于SUBSCRIBE或UNSUBSCRIBE,它是对应的SUBACK或UNSUBACK [MQTT-2.3.1-3]。
当服务器发送QoS> 0 [MQTT-2.3.1-4]的发布消息时,这些条件也适用于服务器。
如果发布的包的QoS值设置为0 [MQTT-2.3.1-5],则它绝对不能包含包标识符。
PUBACK,PUBREC或PUBREL数据包必须包含与最初发送的PUBLISH数据包相同的数据包标识符[MQTT-2.3.1-6]。
同样,SUBACK和UNSUBAC