• 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的层级,需要额外匹配,也没有实际意义

    • 建议使用ASCII字符

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

    • 不在主题中使用空格

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

    • 尽量使用简洁的主题

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

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

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

    • 在主题中包含标识信息

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

  • 相关阅读:
    并发编程系列之Lock锁可重入性与公平性
    Google Earth Engine-04(GEE中的JavaScript和原始JavaScript的异同和联系)
    【黄啊码】MySQL入门—9、什么?都2022了,还不知道什么是事务?
    浅谈终端安全接入
    目标检测论文解读复现之十三:改进YOLOv5s的遥感图像目标检测
    5.0 Vue基础入门
    机器学习实战(1)——概览
    集合框架的线程安全问题ArrayList、HashSet、HashMap
    漏洞情报|Jackson-databind反序列化漏洞风险通告(CVE-2020-35490,CVE-2020-35491)
    Git小技巧(持续更新)
  • 原文地址:https://www.cnblogs.com/Mickey-7/p/17359231.html