MQTT
MQTT topic & Wildcards
https://www.emqx.com/zh/blog/advanced-features-of-mqtt-topics
topic
通过 /
进行分层。
单层通配符
+
匹配单层
example:
+
sensor/+
sensor/+/temperature
多层通配符
#
用于匹配任意层级的通配符。在使用多层通配符时,它比需占据整个层级并且必须是主题的最后一个字符
example:
sensor/#
sensor/temperature/#
sensor/+/temperature/#
不同场景的 topic 设计
智能家居
myhome/bedroom/temperature
myhome/bedroom/humidity
myhome/bedroom/airquality
myhome/livingroom/temperature
myhome/livingroom/humidity
myhome/livingroom/airquality
myhome/kitchen/temperature
myhome/kitchen/humidity
myhome/kitchen/airquality
- 获取卧室的温度、湿度、空气质量
myhome/bedroom/#
- 获取三个房间的温度数据
myhome/+/temperature
- 获取所有的数据
myhome/#
充电桩
- 上行:
ocpp/cp/${cid}/notify/${action}
- 下行:
ocpp/cp/${cid}/reply/${action}
- 充电桩上线时发送上线请求:
ocpp/cp/${cid}/notify/bootNotification
- 发布充电请求:
ocpp/cp/${cid}/notify/startTransaction
- 上前订阅该 topic 接收上线应答:
ocpp/cp/${cid}/reply/bootNotification
- 充电前订阅该 topic 接收充电应答:
ocpp/cp/${cid}/reply/startTransaction
及时消息
- 一对一聊天
chat/user/${user_id}/inbox
- 群聊
chat/group/${group_id}/inbox
- 添加好友
req/user/${user_id}/add
- 接收好友申请
resp/user/${user_id}/add
- 用户在线状态
user/${user_id}/status
Topic 的建议
- 不建议使用
#
订阅所有主题 - 不建议主题以
/
开头或结尾,例如/chat
或chat/
- 不建议在主题里添加空格及非 ASCII 特殊字符
- 同一主题层级建议使用下划线
_
或横杠-
连接单词(或使用驼峰命名) - 尽量使用较少的主题层级
- 当使用通配符时,将唯一值的主题层(例如设备号)越靠近第一层越好。例如
device/001/command/#
比device/command/001/#
更好
remain 消息
https://www.emqx.com/zh/blog/mqtt5-features-retain-message
删除保留消息有以下几种方式:
- 客户端往某个主题发送一个 Payload 为空的保留消息,服务端就会删除这个主题下的保留消息;
- 在 MQTT 服务器上删除,比如 EMQX MQTT 服务器提供了在 Dashboard 上删除保留消息的功能;
- MQTT 5.0 新增了消息过期间隔属性,发布时可使用该属性设置消息的过期时间,不管消息是否为保留消息,都将会在过期时间后 自动被删除。