首页 > 其他分享 >MQTT-主题基础

MQTT-主题基础

时间:2023-04-27 16:13:33浏览次数:40  
标签:订阅 层级 匹配 基础 主题 通配符 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/enter/content'
    
    '$SYS/+/content'
    '$SYS/#'
    #不能直接使用通配符匹配$所在层级
    
主题使用的一些建议
  • 主题可以视为发布订阅的核心,所以设计主题是重中之重

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

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

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

  • 建议使用ASCLL字符

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

  • 不在主题中使用空格

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

  • 尽量使用简洁的主题

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

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

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

  • 在主题中包含标识信息

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

标签:订阅,层级,匹配,基础,主题,通配符,MQTT,使用
From: https://www.cnblogs.com/Mickey-7/p/17359231.html

相关文章

  • CSS基础知识大全(值得收藏)
    CSS基础CSS(cascadingstylesheet)汉译为层叠样式表,是用于控制网页样式WEB标准中的表现标准语言,在网页中主要对网页信息的显示进行控制。目前推荐遵循的是W3C发布的CSS3.0版本;用来表现HTML或者XHTML等样式文件的计算机语言。1998年5月21日由w3C正式推出的css2.0HTML+CSS......
  • liunx基础
    ls(-l-ah)cdcpmv111find(/-name"")whichmkdir(直接用)touchpwdmorermgrepwc``>>>sudogetent(passwdgroup查看用户和用户组)chomod(-rr4w2x1)chown(【-r】1:2文件、文件夹)showduplicatessystemctl【stopstartenabledisablestatus】服务名......
  • 【linux】循序渐进学运维-基础篇-mount
    文章目录1.mount命令的讲解1)作用:用来挂载文件系统的命令2)基本格式为:3)常见的文件系统类型有:4)查看当前系统都支持哪些操作系统5)挂载选项详解6)与mount相关的文件7)与mount相关的参数2.mount使用举例1.允许可执行权限和不可执行权限2.sync&&async同步写入和异步写入3.acl的使用4......
  • Linux基础
    Linux基础1课程主要内容1.1Linux在什么地方使用1.2Linux的应用领域1.3Linux入门概述吉祥物创始人Linux和Unix的关系图1.4安装VM,CentosVM和Linux的关系网络连接三种模式虚拟机克隆虚拟机快照新建hello2虚拟机迁移和删除移除之后,文件夹......
  • 基础操作
    这个第二篇使用Newsprint主题这里讲一个问题,下载后写文档的操作步骤。下载没有设置过的打开文件资源管理器,点击察看,后面找到显示,打开显示会出现文件扩展名,勾选上就行(这一步不懂的就跳过,在创建文件的时候一定的会回来重新操作的)创建一个笔记文件夹点击进入,右击创建一个文件,......
  • java 并发编程-基础篇
    java创建线程的三种方法直接使用Thread//创建线程对象Threadt=newThread(){publicvoidrun(){//要执行的任务}};//启动线程t.start();Runable配合Thread把线程和任务分开。Runnablerunnable=newRunnable(){publicvoidrun(......
  • mysql基础练习(二)
    --创建表droptableifexistsemp;createtableemp(empnoint,enamevarchar(50),jobvarchar(50),mgrint,hiredatedate,saldecimal(7,2),commdecimal(7,2),deptnoint)engine=innodbdefaultcharset=utf8;droptableifexistsdept;createtabledept(d......
  • Go入门基础03
    函数高级给类型重命名: 函数的参数和返回值都是类型的一部分,函数可以赋值给一个变量1. 例:typeMyFuncfunc(int,int)intMyFunc就是我们将func(int,int)int重新定义了一下类型,以后在定义函数类型的是时候直接使用MyFunc就是代替了func(int,int)int2.例:typeMyint......
  • Vue3 Hooks 的基础用法
    前言Vue3在API设计上引入了类似于ReactHooks的CompositionAPI,可以更方便地实现逻辑的复用和组合。本文将介绍Vue3Hooks的基础用法。基本使用Vue3Hooks中最简单的Hook就是setup。它是一个在组件创建时执行的函数,可以访问组件实例中的属性和方法,同时可以返回一......
  • 如何用Python画一只狗狗——turtle基础
    这只小狗主要用了turtle库里的circle()头有些方正,比较自然。话不多说,展示代码:fromturtleimport*pensize(5)seth(0)pd()color('black')circle(20,80)circle(200,30)circle(30,60)circle(200,29.5)circle(20,60)circle(-150,22)circle(-50,10)circle(5......