通配符
在MQTT Version 5.0的4.7节中,提到了关于主题名称和主题过滤器的内容。主题通配符可以用在主题过滤器中,从而实现订阅多个主题,但不得在主题名称中使用通配符。MQTT中的通配符目前只有两个:‘#’和‘+’。
- 层级分隔符(‘/’)
MQTT中使用正斜杠(‘/’)作为每一级主题的分隔符,从而为主题名称提供层级结构。连续的正斜杠(“//”)表示长度为0的主题。
多级通配符(‘#’)
可以匹配包括父级和下属的多个子层级。字符可以单独存在,也可以作为匹配子主题存在,但无论哪种情况,‘#’必须为过滤器的最后一个字符。
-
当‘#’单独存在时,将匹配所有的主题。
- “#”(匹配所有的主题,后文会提到,’$'开头的除外)
-
在匹配子主题时,例如订阅“sport/tennis/player1/#”,下列主题的信息都将收到:
- “sport/tennis/player1”(该话题本身,因为包含父级)
- “sport/tennis/player1/ranking”(该话题的下属层级)
- “sport/tennis/player1/score/yesterday”(所有间接下属层级)
-
在匹配子主题时,‘#’前面的字符必须是‘/’,下列书写方式将不被通过:
- “sport/tennis/#/player”(不是最后一个字符)
- “sport/tennis/player#”(是最后一个字符,但前一位不是‘/’)
单级通配符(‘+’)
- 单级匹配符只能匹配所在层级,且在使用时,必须占满整个层级。比如下列书写方式是被允许的:
- “sport/+/player1”
- “sport/+/#”(可以和其他通配符搭配使用)
- “+/tennis”(匹配任意顶级主题)
- “sport/tennis/+”(匹配tennis下一级的主题)
- 在匹配主题时,例如订阅“sport/tennis/+”,下列主题的新信息都将被收到:
- “sport/tennis/player1”
- “sport/tennis/player2”
- “sport/tennis/player3”
- “sport/tennis/”(空主题,可以被匹配)
但下列的话题将无法被订阅:- “sport/tennis”(父级主题不在当前层级,无法被匹配)
- “sport/tennis/player1/score”(间接子主题不在当前层级,无法被匹配)
- 下列书写方式是不被允许的:
- “sport+/”(没有占满整个层级)
特殊符号:系统保留主题(‘$’)
在‘#’或‘/’进行匹配时,以‘$’开头的主题将不会被匹配到。 换言之,服务器将禁止客户端使用此类话题与其他客户端通信,以‘$’开头的话题作为系统保留主题,供内部使用,这些主题的消息不会被客户端所发布或订阅。在MQTT中,“$SYS/”被广泛用作包含特定于服务器的信息或控件API的主题的前缀。在下列例子中,展示了‘$’和两种通配符共存时的一些情况:
- “#”(匹配不到以‘$’开头的主题)
- “ + / monitor / Clients”将匹配不到“ $ SYS / monitor / Clients”
- “ $ SYS / monitor / +”可以匹配到“ $ SYS / monitor / Clients”