go语言的MQTT服务器(二)
主题topic
发布订阅必须要有主题,当订阅了某个主题后,才能收到这个主题的payload。
MQTT通过“主题”实现将消息从发布者客户端送达至接收者客户端。“主题”是附加在消息上的一个标签,发布者客户端将“主题”和“消息”发送至代理服务器(mqtt broke),代理服务器将该消息转发至每一个订阅了该“主题”的订阅者客户端。
主题通配符
1 . 主题层级分隔符—“/”
主题层级分隔符使得主题名结构化。如果存在分隔符,它将主题名分割为多个主题层级。斜杠(‘/’ U+002F)用于分割主题的每个层级,为主题名提供一个分层结构。当客户端订阅指定的主题过滤器包含两种通配符时,主题层级分隔符就很有用了。主题层级分隔符可以出现在主题过滤器或主题名字的任何位置。相邻的主题层次分隔符表示一个零长度的主题层级
如下面主题:
topic/room
topic/room/contrl/light
topic/room/contrl/computer
topic/air/sensor
2 . 多层通配符—“#”
“#”是用于匹配主题中任意层级的通配符。多层通配符表示它的父级和任意数量的子层级。多层通配符必须位于它自己的层级或者跟在主题层级分隔符后面。不管哪种情况,它都必须是主题过滤器的最后一个字符 .
例如,如果客户端订阅主题 “topic/#”,它可以收到使用下列主题名发布的消息:
topic
topic/room
topic/room/contrl/computer
topic/air/sensor
“#” 是有效的,会收到所有的消息。
“topic/room#” 是无效的
”topic/room/#/computer" 是无效的
3 . 单层通配符—-“+”
加号是只能用于单个主题层级匹配的通配符。在主题过滤器的任意层级都可以使用单层通配符,包括第一个和最后一个层级。然而它必须占据过滤器的整个层级 。可以在主题过滤器中的多个层级中使用它,也可以和多层通配符一起使用。
“topic/+” 只能匹配 china/guangzhou
“topic/+/+/room” 能匹配topic/a/b/room和topic/c/d/room等等类似的主题
通配符 —“ $ ”
通配符“$”表示匹配一个字符,只要不是放在主题的最开头,即:
$ xx
/ $ xx
/xx$
其它情况下都表示匹配一个字符。
如果客户端想同时接受以 “SYS/”开头主题的消息和不以SYS/开头主题的消息, 它需要同时订阅 “#” 和 ““$SYS/#”。
注意
注: 单层通配符和多层通配符只能用于订阅(subscribe)消息而不能用于发布(publish)消息,层级分隔符两种情况下均可使用。
总结
- 所有的主题名和主题过滤器必须至少包含一个字符
- 主题名或主题过滤器以前或后置斜杠 “/” 区分
- 只包含斜杠 “/”的主题名或主题过滤器是合法的
- 主题名和主题过滤器是 UTF-8 编码字符串, 它们不能超过 65535 字节
- 主题名和主题过滤器是区分大小写的
简单应用
‘’/‘’ 可以应用到:部门层级推送、城市层级推送等包含层级关系的场景
配合其它通配符可以实现广播
单独确定的主题可实现单播
常见智能家居交互图(在网上随便找的)
|
请发表评论