go语言的MQTT服务器(二)----- 主题(1) - Go语言中文社区

go语言的MQTT服务器(二)----- 主题(1)


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 字节
  • 主题名和主题过滤器是区分大小写的

简单应用
‘’/‘’ 可以应用到:部门层级推送、城市层级推送等包含层级关系的场景
配合其它通配符可以实现广播
单独确定的主题可实现单播

常见智能家居交互图(在网上随便找的)
在这里插入图片描述

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_41257365/article/details/104733598
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢