四、MQTT的基本概念
1.MQTT的主题和主题过滤器
在MQTT当中,消息是没有消息队列这一概念,那它是怎么隔离区分各种繁杂的消息呢,这里就涉及到 主题 概念,不同的主题可被不同的订阅者订阅,发布者可以发布不同的主题消息,从而将消息进行一个隔离区分。MQTT 协议规定主题是 UTF-8 编码的字符串。
命名规则:
- 所有的主题名必须至少包含一个字符
- 主题名是大小写敏感的。
- 主题名可以包含空格字符。
- 主题名以前置或后置斜杠 / 区分。
- 只包含斜杠 / 的主题名是合法的
- 主题名不能包含 null 字符(Unicode U+0000)
MQTT 主题通配符包含单层通配符 “+” 及多层通配符 “#”,主要用于客户端一次订阅多个主题。
- 单层通配符
如客户端订阅AAA/+/CCC主题消息,则会收到AAA/1/CCC,AAA/2/CCC,…,AAA/N/CCC主题消息
- 多层通配符
如客户端订阅AAA/#主题消息,则会收到AAA,AAA/BBB,AAA/BBB/CCC主题消息
- $开头的主题为系统主题
注意:
通配符只能用于订阅,不能用于发布。
2.MQTT的会话和保留消息
3.MQTT的消息格式和负载
- 固定头(Fixed header),存在于所有MQTT数据包中,表示数据包类型及数据包的分组类标识;
- 可变头(Variable header),存在于部分MQTT数据包中,数据包类型决定了可变头是否-存在及其具体内容;
- 消息体(Payload),存在于部分MQTT数据包中,表示客户端收到的具体内容;
3.1 MQTT固定头
3.1.1 MQTT消息类型 (Message type)
- byte 1(bits7~4)
- 相于一个4位的无符号值,类型如下:
3.1.2 标识位 (DUP)
-
byte 1(bits3~0)
-
在不使用标识位的消息类型中,标识位被做为保留位。如果收到无效的标志时,接收端必须关闭网络连接:
-
DUP:发布消息的副本。用来在保证消息的可靠传输,如果设置为 1,则在下面的变长中增加MessageId,并且需要回复确认,以保证消息传输完成,但不能用于检测消息重复发送。
-
QoS发布消息的服务质量(前面已经做过介绍),即:保证消息传递的次数
- 00:最多一次,即:<=1
- 01:至少一次,即:>=1
- 10:一次,即:=