目录
1. 概述
协议详细描述:https://blog.csdn.net/XieWinter/article/details/101198750
MQTT通过“主题”实现将消息从发布者客户端送达至接收者客户端。“主题”是附加在应用消息上的一个标签,发布者客户端将“主题”和“消息”发送至代理服务器,代理服务器将该消息转发至每一个订阅了该“主题”的订阅者客户端。
一个主题名可以由多个主题层级组成,每一层通过“/”斜杠分隔开,例如:“topicRoot/F1”,“topicRoot/F2”。如果用户需要一次订阅多个具有类似结构的主题,可以在主题过滤器中包含通配符。通配符只可用在主题过滤器中,在发布应用消息时的主题名不允许包含通配符,主题通配符有两种:
- #:表示匹配>=0个层次,比如a/#就匹配a,a/,a/b,a/b/c。单独的一个#表示匹配所有,不允许a#或a/#/c等形式。
- +:表示匹配一个层次,例如a/+匹配a/b,a/c,不匹配a/b/c。单独的一个+是允许的,但a+为非法形式。
通配符可以应用在物接入策略中和实体设备的订阅主题中,通过以下示例我们可以进一步了解通配符的作用。
2. 示例说明
我们使用下表的配置在云端创建四个物接入用户。
测试环境为:百度天工物接入及PC端软件MQTT FX
项目名称 (Endpoint) |
用户名称 |
身份名称 |
策略名称 |
主题 |
权限 |
endpoint01 |
thing01 |
principal01 |
policy01 |
topicRoot/# |
发布/订阅 |
endpoint01 |
thing02 |
principal02 |
policy02 |
topicRoot/+/area1 |
发布/订阅 |
endpoint01 |
thing03 |
principal03 |
policy03 |
topicRoot/floor1 |
发布/订阅 |
endpoint01 |
thing04 |
principal04 |
policy04 |
topicRoot/floor1/area1 |
发布/订阅 |
通过MQTT.fx客户端模拟4台实体设备(Device01~Device04),分别使用thing01、thing02、thing03和thing04的用户名和密码连接物接入服务。
2.1 Device01发布
- Device01 发布:topicRoot/device02/area1
收到订阅为Device 01 /02:
- Device01 发布:topicRoot/floor1
收到订阅为Device 01 /03:
- Device01 发布:topicRoot/floor1/area1
收到订阅为Device 01 /02/04:
2.2 Device02发布
- Device02 发布:topicRoot/device01/area1
收到订阅为Device 01 /02:
- Device02 发布:topicRoot/floor1/area1
收到订阅为Device 01 /02/04:
- Device02 发布:topicRoot/floor1
服务器断开连接:
2.3 Device03发布
- Device03 发布:topicRoot/floor1
收到订阅为Device 01 /03:
2.4 Device04发布
Device04 发布:topicRoot/floor1/area1
收到订阅为Device 01 /02/04:
2.5 测试结果
3. 应用场景说明
- 场景一:
避免用广播方式向特定用户发送消息!
在百度智能云创建一个物接入用户,具体配置如下:
项目Endpoint名称 | 用户名称 | 身份名称 | 策略名称 | 主题 | 权限 |
---|---|---|---|---|---|
endpoint01 | thing01 | principal01 | policy01 | topic01 | 发布/订阅 |
如下图所示,在该场景中所有实体设备都通过相同的物接入用户接入,拥有相同的用户名、密码和权限。由于所有用户都订阅了相同的主题,当Device-A向Device-D发布消息时Device-B和Device-C也会收到。这种部署方式会对实体设备造成额外的处理负担,同时也会对当月的物接入消息配额造成不必要的损失。
在不增加额外配置的情况下,可以采取以下部署方式解决上述问题。在百度智能云创建一个物接入用户,具体配置如下:
项目Endpoint名称 | 用户名称 | 身份名称 | 策略名称 | 主题 | 权限 |
---|---|---|---|---|---|
endpoint01 | thing01 | principal01 | policy01 | topic01/# | 发布/订阅 |
由于在主题中使用了“#”通配符,因此每个用户可以订阅两个主题:
- topic01/broadcast:用来订阅广播消息。
- topic01/DeviceName:DeviceName需要替换为用户的实际名称并全局唯一,用来订阅单播消息。
在单播场景下,Device-A向Device-D发送消息,Device-B和Device-C都不会接收到。
在广播场景下,Device-A发布的消息可以同时被Device-B、Device-C和Device-D接收到。
- 场景二:
常见智能家居交互模式框图: