MQTT 主题名称
MQTT 主题名称是 UTF-8(万国码)编码的字符串,用户可以自行决定主题名称(Topic),例如,传送温度信息的主题可以命名为「温度」、传送亮度信息的主题可以叫做 「照度」… 等等。在 MQTT 协议中,主题名称也支持类似于文件系统路径的层级式命名方式。假设你的家里有许多传感器,那么我们可以依照传感器所在位置进行规划,结构如下:
+--------+
| Home |
+--------+
|
| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|
+---------+ +------------+ +----------+
| Bedroom | | Livingroom | | Bathroom |
+---------+ +------------+ +----------+
| | |
| ̄ ̄ ̄ ̄ ̄| | ̄ ̄ ̄ ̄ ̄| | ̄ ̄ ̄ ̄ ̄|
+------+ +------+ +------+ +------+ +------+ +------+
| Temp | | Humi | | Temp | | Humi | | Temp | | Humi |
+------+ +------+ +------+ +------+ +------+ +------+
每个层级之间用斜杠(/
)分隔,例如卧室里的温度传感器,其主题名称可命名为:
/Home/Bedroom/Temp
MQTT 主题支持中文命名,但不建议使用。
主题命名规则
MQTT 命名主题时需要注意以下几点:
- 由于某些微控制器或编程语言不支持 UTF-8 编码或中文,因此建议主题名称使用英文命名,并且取个有意义的名字。
- 名称长度不可以超过 65536 个字节。
- 自定义的主题名称请勿使用
$
开头,因为像$SYS
这样的主题是 MQTT 中介服务器提供的保留主题;也不可以包含井号(#
)、加号(+
)、减号(-
)和乘号(*
)等字符,因为它们在 MQTT 主题中有特殊意义。 - 主题名称是区分英文大小写的,也就是说,Home 和 home 是两个不同的名称。
- 虽然名称可以包含空格,但是英文的「半形」空格和中文的「全形」空格的编码是不一样的,如果名称时没有统一,就会导致程序无法识别正确主题,因此建议最好不要加入空格。
- 层级名称可以空白,像这样的命名(连续的斜杠)是合法的:
Home//Bathroom
,它代表有三个层级,但是由于中间的层级没有名字,因此在语义上怪怪的,不好理解。 - 有些开发者习惯在主题名称最前面添加一个斜杠,类似于 Linux 系统中的根目录,但这不是必需的。不过请注意,
/Home
和Home
是两个不同的名称。另外,单一个\
也是合法的名称。
主题规划
除了根据设备的安装地点来命名主题,当同一个地点包含许多传感器时,使用编号或者唯一识别码来命名主题也是比较合理的选择。
例如,假设有一个位于客厅的设备,它的 MAC 地址是 AABBCCDDEEFF。那么,你可以将其主题命名为:
/Home/Livingroom/AABBCCDDEEFF