MQTT 主题通配符和过滤器Topic Wildcards & Topic Filters

发布时间 2023-10-18 10:20:46作者: aimigi
  • 主题名称中引入了级别分隔符 /, 用于分割主题级别,如果存在,它将主题名称划分为多个“主题级别”。
  • 订阅的主题过滤器可以包含特殊的通配符,可以一次订阅多个主题。
  • 特殊字符的通配符可以用在订阅过滤器中,但是不能用于主题名称

1. 主题级别

  • "/" 用于分割主题级别,并为主题名称提供层次结构。
  • 当订阅客户但指定的主题过滤器中遇到两个通配符中的任意一个时,分隔符的使用非常重要。
  • 级别分隔符可以出现在主题名称的任意位置。
  • 两个相邻的分隔符// 表示0长度的主题级别

1.1 订阅通配符"#"

  • "#"匹配的是分隔符之后的任意级别,且包含父级
  • "#"只能是过滤器的最后一个字符
    例如,如果客户端订阅“sport/tennis/player1/#”,它将收到使用这些主题名称发布的消息:
"sport/tennis/player1”
“sport/tennis/player1/rank”
“sport/tennis/player1/score/wimbledon”

sport/# 可以匹配 sport 主题,因为# 包括父级
单个的 # 也是有效的,这将收到服务端任何消息
sport/tennis/# 有效
sport/tennis# 无效
sport/tennis/#/ranking 无效

1.2 订阅通配符 "+"

  • "+" 表示单级别通配符,可以在过滤器中的任何级别使用,包括第一级和最后一级

例如:
"sport/tennis/+"
匹配
"sport/tennis/payler1" 和 "sport/tennis/payler2"
但是不匹配
“sport/tennis/player1/ranking”
由于单级通配符仅匹配单个级别,因此“sport/+”不匹配“sport”,但它匹配“sport/”

另外

  • 单个 "+" 有效,匹配单级主题
  • “+/tennis/#” 有效
  • “sport+” 无效
  • “sport/+/player1” 有效
  • “/finace” 和 “+/+” 以及 “/+” 匹配,但是和 “+”不匹配

2. $开头的主题

服务器存储的主题名称不能以通配符(#或+)开头。
但是主题名称可以以$开头,$开头的主题已经被广泛采用,作为包含服务器特性信息或控制API的前缀

  • 非规范评论
  1. 应用程序不能用$前缀做业务主题
  2. 订阅“#”将不会收到任何发布到以 $ 开头的主题的消息
  3. 订阅“+/monitor/Clients”将不会收到任何发布到“$SYS/monitor/Clients”的消息
  4. 订阅“$SYS/#”将收到发布到以“$SYS/”开头的主题的消息
  5. 订阅“$SYS/monitor/+”将收到发布到“$SYS/monitor/Clients”的消息
  6. 为了让客户端接收来自以 $SYS/ 开头的主题和不以 $ 开头的主题的消息,它必须同时订阅“#”和“$SYS/#”