当前位置 博文首页 > 主题_putiancaijunyu的专栏:MQTT协议

    主题_putiancaijunyu的专栏:MQTT协议

    作者:[db:作者] 时间:2021-09-05 22:11

    主题

    MQTT是通过主题对消息进行分类的,本质上就是一个UTF-8的字符串,不过可以通过反斜杠表示多个层级关系。主题并不需要创建,直接使用就是了。

    主题可能是管理员在服务端预先定义好的,也可能是服务端收到第一个订阅或使用那个主题名的应用消息时动态添加的。服务端也可以使用一个安全组件有选择地授权客户端使用某个主题资源。

    2.2.2.1 主题通配符

    订阅的主题过滤器可以包含特殊的通配符,允许你一次订阅多个主题。

    主题过滤器中可以使用通配符,但是主题名不能使用通配符。

    主题名和主题过滤器中,使用(/)作为主题层级分隔符,可以出现在这两者的任何位置。相邻的主题层次分隔符表示一个零长度的主题层级。

    目前版本支持的主题通配符有两个:

    n? #

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

    比如:


    n? +

    加号 (‘+’ U+002B) 是只能用于单个主题层级匹配的通配符。

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

    2.2.2.2 主题名

    每一个主题都有一个主题名。主题名是附加在应用消息上的一个标签,服务端已知且与订阅匹配。服务端发送应用消息的一个副本给每一个匹配的客户端订阅。

    主题名(Topic Name)用于识别有效载荷数据应该被发布到哪一个信息通道。主题名不可以使用通配符。斜杠(‘/’ U+002F)用于分割主题的每个层级,为主题名提供一个分层结构。

    主题名必须是PUBLISH报文可变报头的第一个字段。它必须是 1.5.3节定义的UTF-8编码的字符串。 PUBLISH报文中的主题名不能包含通配符。

    服务端发送给订阅客户端的PUBLISH报文的主题名必须匹配该订阅的主题过滤器(根据 4.7节定义的匹配过程)。

    下面是PUBLISH报文可变报头非规范示例,示例中的主题名为 “a/b”,长度等于3,报文标识符为“10” 。

    2.2.2.3 主题过滤器

    订阅中包含的一个表达式,用于表示相关的一个或多个主题。主题过滤器可以使用通配符。

    订阅SUBSCRIBE报文的有效载荷包含了一个主题过滤器列表,它们表示客户端想要订阅的主题。SUBSCRIBE报文有效载荷中的主题过滤器列表必须是1.5.3节定义的UTF-8字符串。服务端应该支持包含通配符(4.7.1节定义的)的主题过滤器。如果服务端选择不支持包含通配符的主题过滤器,必须拒绝任何包含通配符过滤器的订阅请求 [MQTT-3.8.3-2]。每一个过滤器后面跟着一个字节,这个字节被叫做服务质量要求(Requested QoS)。它给出了服务端向客户端发送应用消息所允许的最大QoS等级。

    订阅与单个会话(Session)关联。会话可以包含多于一个的订阅。会话的每个订阅都有一个不同的主题过滤器。




    版权所有,转载请注明出处:http://www.junsion.icoc.bz/ by 小丑

    cs