MQTT 通配符
一个订阅可能包含特殊字符,允许你一次定义多个主题。
主题层次分隔符被用来在主题中引入层次。多层的通配符和单层通配符可以被使用,但他们不能被使用来做发布者的消息。
主题层级分隔符 /
/
被用来分割主题树的每一层,并给主题空间提供分等级的结构。当两个通配符在一个主题中出现的时候,主题层次分隔符的使用是很重要的。
多层通配符 #
#
是一个匹配主题中任意层次数的通配符。比如说,如果你订阅了finance/stock/ibm/#
,你就可以接收到以下这些主题的消息。
finance/stock/ibm
finance/stock/ibm/closingprice
finance/stock/ibm/currentprice
多层通配符有可以表示大于等于0的层次。因此,finance/#
也可以匹配到单独的 finance
,在这种情况下 #
代表0层。在这种语境下主题层次分隔符/就没有意义了。因为没有可以分的层次。
多层通配符只可以确定当前层或者下一层。因此,#
和 finance/#
都是有效的,但是finance#
不是有效的。多层通配符一定要是主题树的最后一个字符。比如说,finance/#
是有效的,但是 finance/#/closingprice
是无效的。
单层通配符 +
+
只匹配主题的一层。比如说,finance/stock/+
匹配 finance/stock/ibm
和 finance/stock/xyz
,但是不匹配 finance/stock/ibm/closingprice
。另外,因为单层通配符只匹配1层,finance/+
不匹配 finance
。
单层通配符可以被用于主题树的任意层级,连带多层通配符。它必须被用在主题层级分隔符/的右边,除非它是指定自己。因此,+
和 finance/+
都是有效的,但是 finance+
无效。单层通配符可以用在主题树的末端,也可以用在中间。比如说,finance/+
和 finance/+/ibm
都是有效的。
以 $
开头的,服务器保留
服务端不能将 $
字符开头的 Topic 匹配通配符 (#
或+
) 开头的 TopicFilter
服务端应该阻止客户端使用这种 Topic
与其它客户端交换消息。服务端实现可以将 $
开头的主题名用作其他目的。
$SYS/
被广泛用作包含服务器特定信息或控制接口的主题的前缀。
客户端不特意订阅 $
开头的 Topic
,就不会收到对应的消息。
订阅 "#"
的客户端不会收到任何发布到以 "$"
开头主题的消息。
订阅 "+/A/B"
的客户端不会收到任何发布到 "$SYS/A/B"
的消息。
订阅 "$SYS/#"
的客户端会收到发布到以 "$SYS/"
开头主题的消息。
订阅 "$SYS/A/+"
的客户端会收到发布到 "$SYS/A/B"
主题的消息。
如果客户端想同时接受以 "$SYS/"
开头主题的消息和不以 $
开头主题的消息,它需要同时 订阅 "#"
和 "$SYS/#"
。
主题语法和用法
当你建立一个应用,设计主题树的时候应该考虑以下的主题名字的语法和语义:
1、主题至少有一个字符长。
2、主题名字是大小写敏感的。比如说,ACCOUNTS和Accounts是两个不同的主题。
3、主题名字可以包含空格。比如,Accounts payable是一个有效的主题。
4、以/
开头会产生一个不同的主题。比如说,/finnace
与finance
不同。/finance
匹配"+/+"
和/+
,但不匹配+
5、不要在任何主题中包含null(Unicode \x0000)字符。