6

MQTT-主题基础 - 木子七

 1 year ago
source link: https://www.cnblogs.com/Mickey-7/p/17359231.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

MQTT-主题基础

MQTT主题#
  • MQTT的主题是一个utf-8编码的字符串,最大长度65535字节,严格区分大小写

  • MQTT主题支持分层结构,主题分隔符用'/'表示,主题的层级长度可以为0

    # 将主题划分为3个层级
    'level1/level2/level3'
    # 第二层级长度为0
    'level1//level3	'
    # 下面三个level 实际属于三个不同的主题 , /前后如果没有内容视为一个长度为0的层级
    '/level' 
    'level' 
    'level/'
    
  • 主题层级的一个作用是和通配符配合使用消息分发和主题订阅,可以使用通配符实现一次订阅多个主题的效果

主题通配符#
  • 单层通配符: 用 '+'表示,可以匹配当前层级主题下的任意内容,不能同时匹配多个层级,单层通配符可以在一个主题中多次使用

  • # 三个主题,楼层下有三个房间,房间里面有对应的信息,第三个房间区分大房间标识
    topic1 = 'floor/room1/info'
    topic2 = 'floor/room2/info'
    topic3 = 'floor/room3/big/info'
    # 使用#匹配 楼下下 任意房间 的info
    # 单层通配符每次只匹配一个层级,所有无法匹配到topic3的主题
    'floor/+/info' # 匹配主题1和主题2
    
    # 同一主题中使用多个单层通配符
    'floor/+/+/info' #匹配主题3,每个通配符匹配一个层级
    
    
    # 特殊主题
    # 这种主题需要视为/前有长度为0的层级
    topic = '/floor'
    #匹配模式
    '+/floow' 
    '+/+'
    
  • 多层通配符: 用'#'表示,如果主题层级数量不固定,那么单层通配符想做某一模式的通用匹配就失去了效果,可以使用多层通配符,多层通配符可以匹配任意数量个层级,包括0个层级,因为多层通配符匹配层级的不确定性,多层通配符必须是主题的最后一个字符

  • topic1 = 'home/'
    topic2 = 'home/floor'
    topic3 = 'home/floor/room'
    
    # 匹配home下的所有层级
    'home/#'
    
    
  • 单层和多层通配符可以同时使用,主题通配符必须完全的占用一个层级

  • '''
    home/+/#
    +/+/#
    +/#
    '''
    
  • 只有在订阅和取消订阅的时候,才支持使用主题通配符,达到一次订阅/取消订阅多个主题的目的,在发布消息的时候,不支持使用主题通配符,必须要明确发送消息的主题,所以在订阅和取消订阅时候的主题称为主题过滤器,发布的时候的主题称为主题名

特殊主题#
  • 特殊主题概述

mqtt对主题没有过多限制,可以任意命名,但是在主题中有一种特殊主题,是以$开头的主题,被保留为仅供服务端使用,客户端被禁止使用,不能发布消息,如果设置允许订阅的话,可以订阅$系统主题接收系统消息,比如客户端上线、下线等

  • 订阅$开头的主题

    订阅$开头的主题,$所在层级不能使用通配符匹配,但是$之后的层级可以使用通配符匹配

    topic = '$SYS/'
    
    '$SYS/+'
    '$SYS/#'
    #不能直接使用通配符匹配$所在层级
    
主题使用的一些建议#
  • 主题可以视为发布订阅的核心,所以设计主题是重中之重

  • 不建议以/开头或者结尾

    以/开头或者结尾是协议允许的用法,但是并没有什么实际意义,还容易造成混淆,所以不建议主题以/开头或者结尾

    比如 /a 和a/ ,在前后有对应的长度为0的层级,需要额外匹配,也没有实际意义

  • 建议使用ASCLL字符

    mqtt主题定义只要是utf8字符串即可,但是在实际应用中,非ascll字符可能会遇到无法打印或者打印错误的问题,对于一些问题定位不太友好

  • 不在主题中使用空格

    如果主题中在层级中包含空格,但是使用过程中,我们肉眼很难区分是否有空格,所有也不建议使用空格

  • 尽量使用简洁的主题

    主题存在于我们订阅和收发消息的所有场景,使用不会引起歧义的缩写,简洁明了,缩短主题长度,对单个消息影响不大,如果消息量级特别大,带来的收益就比较可观了,简短的主题都有助于我们减少带宽消耗和提升处理效率

  • 不建议使用#订阅所有主题

    单独用#订阅所有主题,会订阅所有消息,很可能消息量庞大或者接收一些意外的消息,影响性能和实际效果,最好是配合前置层使用#匹配

  • 在主题中包含标识信息

    在主题中包含一些标识信息,比如客户端ID 、所属组、位置等,可以实现更灵活和精确的控制


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK