跳到主要内容

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 系统中的根目录,但这不是必需的。不过请注意,/HomeHome 是两个不同的名称。另外,单一个 \ 也是合法的名称。

主题规划

除了根据设备的安装地点来命名主题,当同一个地点包含许多传感器时,使用编号或者唯一识别码来命名主题也是比较合理的选择。

例如,假设有一个位于客厅的设备,它的 MAC 地址是 AABBCCDDEEFF。那么,你可以将其主题命名为:

/Home/Livingroom/AABBCCDDEEFF