MQTT 协议 主题及通配符的使用方法

目录

1. 概述

2. 示例说明

2.1 Device01发布

2.2 Device02发布

2.3 Device03发布

2.4 Device04发布

2.5 测试结果

3. 应用场景说明


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接收到。

  • 场景二:

常见智能家居交互模式框图:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章