介绍
MQTT 主题是发布/订阅模式下的消息路由核心,是 UTF-8 编码的层级字符串(类似文件路径),用于标识消息通道、实现消息精准分发。良好的主题设计直接决定系统扩展性、可维护性与权限管控能力。
一、基础
1. 定义
- Topic Name(发布主题):发布时使用,严禁通配符,必须精确、唯一。
例:smart-home/living-room/thermostat/temperature - Topic Filter(订阅过滤器):订阅时使用,允许通配符,用于匹配一类主题。
例:smart-home/+/thermostat/#
2. 语法与规则
- 分隔符:斜杠
/划分层级(如a/b/c为 3 级) - 编码:UTF-8,支持中文(不推荐生产环境)
- 大小写敏感:
Home≠home - 长度限制:协议无强制限,但 Broker 通常建议 ≤ 64–128 字节
- 禁止:以
/开头/结尾、连续//、空格、特殊字符(#/+/$除外) - 系统保留:以
$开头(如$SYS/)为 Broker 内部使用,用户不可占用
3. 通配符(仅订阅可用)
(1)单层通配符 +
- 匹配单个完整层级,必须独占一层
- 例:
sensor/+/temperature
✅ 匹配sensor/room1/temperature
❌ 不匹配sensor/room1/humidity、sensor/room1/bed/temperature
(2)多层通配符 #
- 匹配当前层级及以下所有子层级
- 必须在末尾、前带
/、独占一层 - 例:
factory/area1/#
✅ 匹配factory/area1/machine/status、factory/area1/sensor/temp
二、主题设计原则
1. 清晰性 > 简洁性
- 用完整英文单词,拒绝无意义缩写
✅ 推荐:home/bedroom/light/01/status
❌ 不推荐:home/br/lt/01/st
2. 层级化(2–5 层最佳)
从通用 → 具体,结构稳定
推荐模板:[版本]/[租户/域]/[位置]/[设备类型]/[设备ID]/[功能/属性]/[操作]
3. 全局一致性
- 所有设备/服务遵循同一命名规范
- 温度:
.../temperature;湿度:.../humidity(统一后缀)
4. 可扩展 + 版本化
- 加入版本层:
v1/...、v2/...,兼容迭代 - 预留扩展位:避免后期硬改结构
5. 安全与权限友好
- 便于按层级做 ACL(如禁止订阅
#、限制cmd/写入) - 分离数据上报(tele)与控制指令(cmd)
三、标准层级设计
通用结构(物联网/工业/智能家居)
v1/{org}/{location}/{device-type}/{device-id}/{metric}/{operation}
- v1:协议/结构版本(必加)
- org:租户/项目/公司(多租户必备)
- location:地理/逻辑位置(园区/楼层/车间)
- device-type:设备类型(sensor/gateway/light/motor)
- device-id:唯一标识(SN/MAC/UUID)
- metric:属性/测点(temperature/power/status/battery)
- operation:动作(tele/cmd/evt/err/log)
场景示例
1)智能家居
v1/ha/home/living-room/light/001/tele/power # 上报状态
v1/ha/home/living-room/light/001/cmd/power # 下发控制
v1/ha/home/+/+/+/evt/alarm # 全宅告警
2)工业物联网(IIoT)
v2/fac/plant1/line2/machine/press-05/tele/pressure
v2/fac/plant1/line2/machine/press-05/cmd/start
v2/fac/+/+/+/+/err/# # 全厂故障
3)车载/共享设备
v1/car/region3/vehicle/vin-12345/tele/battery
v1/car/region3/vehicle/vin-12345/cmd/lock
四、命名规范
1. 字符规则
- 统一小写、数字、
-/_(二选一,全局一致) - 禁止:空格、中文、
?/!/@/%/&等 - 禁止:以
/开头/结尾、连续//
2. 后缀约定(推荐)
/tele//report:设备上报数据/cmd//set:平台下发控制/evt//event:事件(上线/离线/告警)/err//fault:故障/异常/log:日志/online//offline:状态
3. 禁止做法
- ❌ 过深:
a/b/c/d/e/f/g/h(难订阅、难维护) - ❌ 过浅:
temp123(无法通配、无法权限) - ❌ 动态ID放顶层:
device-123/temp(无法批量订阅) - ❌ 发布用通配符:
sensor/#(协议非法) - ❌ 混用大小写:
Sensor/Temp、sensor/temp
五、权限与安全设计(ACL 友好)
1. 最小权限原则
- 设备只写自己的
/tele、/evt、/err - 设备只读自己的
/cmd - 平台/应用只读
/tele、/evt、/err;只写/cmd
2. 典型 ACL 规则(以 EMQX 为例)
# 设备只能发布自己的上报主题
publish {
topic: "v1/ha/home/+/light/+/tele/#"
}
# 设备只能订阅自己的控制主题
subscribe {
topic: "v1/ha/home/+/light/+/cmd/#"
}
# 禁止订阅全量 #
deny {
topic: "#"
}
六、常见误区与坑
过度使用
#
大规模下 Broker 性能急剧下降、安全风险高无版本、无层级
业务扩展时重构成本极高设备ID放顶层
device-01/temp→ 无法批量订阅同类型设备混用
cmd/tele
控制与数据混在一起,权限混乱、易误控主题过长
增加网络开销、Broker 匹配耗时
七、设计检查清单
投产前必验
- [ ] 2–5 层级、从通用到具体
- [ ] 含版本(v1/)
- [ ] 含租户/域(多租户)
- [ ] 设备类型 + 唯一ID
- [ ] 分离 tele/cmd/evt/err
- [ ] 全小写、
-/_统一、无特殊字符 - [ ] 便于通配、便于 ACL 权限
- [ ] 无
/开头结尾、无连续// - [ ] 发布主题无任何通配符
八、总结
MQTT 主题本质是系统的消息 API 架构。好设计 = 层级清晰 + 全局一致 + 版本化 + 安全可控。按“版本→域→位置→类型→ID→属性→动作”模板落地,可支撑千万级设备、长期迭代不重构。