• MQTT--topic


    1、topic

     定阅与发布必须要有主题,只有当定阅了某个主题后,才能收到相应主题的payload,才能进行通信。

    2、 主题层级分隔符—“/”

     主题层级分隔符使得主题名结构化。如果存在分隔符,它将主题名分割为多个主题层级。斜杠(‘/’ U+002F)用于分割主题的每个层级,为主题名提供一个分层结构。当客户端订阅指定的主题过滤器包含两种通配符时,主题层级分隔符就很有用了。主题层级分隔符可以出现在主题过滤器或主题名字的任何位置。相邻的主题层次分隔符表示一个零长度的主题层级。

    如主题:

    room212/electric
    room212/tv/contrl/sensor
    room212/tv/contrl/light
    room212/air/sensor
    

      

    3、 多层通配符—“#”

    “#”是用于匹配主题中任意层级的通配符。多层通配符表示它的父级和任意数量的子层级。多层通配符必须位于它自己的层级或者跟在主题层级分隔符后面。不管哪种情况,它都必须是主题过滤器的最后一个字符 .

    例如,如果客户端订阅主题 “china/xiangtan/#”,它会收到使用下列主题名发布的消息:

    china/xiangtan
    china/xiangtan/yuhu
    china/xiangtan/yuetan/hnie
    china/xiangtan/jiuhua/jiakao/kemusan
    

      

    定阅主题示例

    school/#                //也匹配单独的 “school” ,因为 # 包括它的父级。
    #                       //是有效的,会收到所有的应用消息。
    school/teacher/#        //有效的。
    school/teacher#         //无效的。
    school/teacher/#/lever  //无效的,必须是主题过滤器的最后一个字符
    

     

    4、 单层通配符—-“+”

    加号是只能用于单个主题层级匹配的通配符。在主题过滤器的任意层级都可以使用单层通配符,包括第一个和最后一个层级。然而它必须占据过滤器的整个层级 。可以在主题过滤器中的多个层级中使用它,也可以和多层通配符一起使用。

    china/+ 只能匹配 china/guangzhou
    
    china/+/+/zhongshanlu 能匹配china/guangzhou/tianhe/zhongshanlu和china/shenzhen/nanshan/zhongshanlu
    

      

    5、 通配符 —-“$”

    通配符“$”表示匹配一个字符,只要不是放在主题的最开头,即:

    $xx
    /$xx
    /xx$
    

      

    其它情况下都表示匹配一个字符。

    如果客户端想同时接受以 “SYS/”开头主题的消息和不以 开头主题的消息, 它需要同时订阅 “#” 和 ““$SYS/#”。

    6、 总结

    1、所有的主题名和主题过滤器必须至少包含一个字符

    2、主题名或主题过滤器以前置或后置斜杠 “/” 区分

    3、只包含斜杠 “/” 的主题名或主题过滤器是合法的

    4、主题名和主题过滤器是 UTF-8 编码字符串, 它们不能超过 65535 字节

    5、主题名和主题过滤器是区分大小写的

    主题层级分隔符 / : 用于分割主题层级,/分割后的主题,这是消息主题层级设计中很重要的符号。 比方说: aaa/bbb和 aaa/bbb/ccc 和aaa/bbb/ccc/ddd ,这样的消息主题格式,是一个层层递进的关系,可通过多层通配符同时匹配两者,或者单层通配符只匹配一个。 这在现实场景中,可以应用到:公司的部门层级推送、国家城市层级推送等包含层级关系的场景。

    单层通配符 +: 单层通配符只能匹配一层主题。比如: aaa/+ 可以匹配 aaa/bbb ,但是不能匹配aaa/bbb/ccc。 单独的+号可以匹配单层的所有推送

    多层通配符 #: 多层通配符可以匹配于多层主题。比如: aaa/# 不但可以匹配aaa/bbb,还可以匹配aaa/bbb/ccc/ddd。 也就是说,多层通配符可以匹配符合通配符之前主题层级的所有子集主题。单独的#匹配所有的消息主题.

    注: 单层通配符和多层通配符只能用于订阅(subscribe)消息而不能用于发布(publish)消息,层级分隔符两种情况下均可使用。

  • 相关阅读:
    bzoj1084
    bzoj1088 [SCOI2005]扫雷
    [LUOGU] 1892 团伙
    [普及组] 2017 成绩
    [LUOGU] P2661 信息传递
    [LUOGU] P1339 [USACO09OCT]热浪Heat Wave
    [LUOGU] P1828 香甜的黄油 Sweet Butter
    [模板] 单源最短路径
    [LUOGU] 1717 钓鱼
    [UVA] 704 Colour Hash
  • 原文地址:https://www.cnblogs.com/saryli/p/8962710.html
Copyright © 2020-2023  润新知