MQTT主题、通配符和最佳实践

MQTT主题在MQTT生态系统非常重要,因为代理(broker)依赖主题确定哪个客户端接收指定的主题。本文我们将聚集MQTT主题、MQTT通配符,详细讨论使用它们的最佳实践,也会探究SYS主题,提供给代理(broker)本身的见解。

什么是MQTT主题及它们在消息过滤中的角色?

在MQTT中,主题,代理一个UTF-8编码的字符串,为连接的客户端过滤消息。一个主题由一或多个斜杠分割的层级组成。
在这里插入图片描述

和消息队列相比,MQTT主题是非常轻量级的。客户端在发布或订阅之前不需要创建期望的主题。代理(broker)接受合法的主题,不需要提前初始化。

MQTT主题例子

下面是一些MQTT主题例子:

  1. myhome/groundfloor/livingroom/temperature:这个主题代表一个家庭第一层起居室的温度。
  2. USA/California/San Francisco/Silicon Valley:此主题层级结构可以跟踪或交换与美国加得福尼亚旧金山的硅谷区域相关的事件或数据信息。
  3. 5ff4afdad-d324-fdaf-dfas-f2jaddjfjtd/status:这个主题可以用来监控一个被唯一标识符指定的设备或系统的状态。
  4. Germany/Bavaria/car/34935932/latitude:此主题结构可用于共享德国巴伐利亚地区特定汽车的纬度坐标。

使用MQTT主题的最佳实践

下面是一些使用MQTT主题的最佳实践:

  • 每个主题必须包含至少一个字符。
  • 主题字符串可以包括空格,以允许更具可读性或描述性的主题。
  • 主题是大小写敏感的,意味着“myhome/temperature”和“MyHome/Temperature”是两个不同的主题。
  • 斜杠本身就是一个有效的主题,可用于表示广泛的主题或用作同时订阅多个主题的通配符。

MQTT主题是MQTT代理(broker)和客户端建立通信的关键。依据主题内容,能够有效过滤和路由消息。在基于MQTT的系统中,确保高效交换、处理数据,合适的定义、组织主题至关重要。

MQTT通配符及主题订阅中如何使用

在MQTT中,通配符提供了一种有力的机制来同时订阅多个主题。当一个客户端订阅一个主题,它即可以订阅已发布消息的确切的主题,也可以使用通配符来扩展它的订阅。要注意的是,通配符只能用在订阅上,而不能用在发布消息上。有两类通配符:单层级和多层级。

单层级通配符:+

单层级通配符由+号表示,允许替换单个主题层级。通过订阅一个使用单层级通配符的主题,将匹配任何包含任意字符串代替通配符的主题。
在这里插入图片描述

比如,一个“myhome/groundfloor/+/temperature”的订阅能产生以下结果:
在这里插入图片描述

多层级通配符:#

多层级通配符覆盖多个主题层级,由#号表示,必须放在主题字符的最后,前面有一个斜杠。
在这里插入图片描述

当一个客户端订阅了使用多层级通配符的主题时,它会接收以通配符之前的模式开头的主题的所有消息,无论主题的长度和深度。如果主题只有单独的“#”,则该客户端接收所有代理(broker)发送的消息。
在这里插入图片描述

但是,重要的是要考虑到,如果期望高吞吐量,仅使用一个“#”进行订阅可能是一种反模式。订阅一个宽泛的主题会导致大量的消息被发送到客户端,潜在的影响系统性能和带宽使用。遵循优化主题订阅最佳实践,避免不必要的消息负载。

为什么及何时使用$开头的主题

在MQTT中,主题命名灵活性很广,允许你选择符合需要的任何名称。但是,有一个重要的例外需要注意:以$符号开头的主题有专门的目的。使用多层级通配符(#)作为主题时,这些主题(以$开头的)不包括在订阅中。相反,以$开头的主题保留用于MQTT代理(broker)的内部统计信息。
发布消息到以$开头的主题是不被允许的,因为这些主题用来提供一些途径给MQTT代理(broker)来暴露内部信息和统计给客户端。但是,现在这些主题没有官方标准,通常使用前缀$SYS/来表示此类信息,尽管代理(broker)的具体实现可能有所不同。
MQTT GitHub wiki中提供了用于理解$SYS主题的推荐资源。
下面是一些$SYS主题的例子和这些主题能够提供的信息:

  1. $SYS/broker/clients/connected:指示当前连接到MQTT代理(broker)客户端的数量。
  2. $SYS/broker/clients/disconnected:显示从MQTT代理(broker)已断开连接的客户端数量。
  3. $SYS/broker/clients/total:代表所有和MQTT代理(broker)交互的客户端的数量,包括连接的和断开连接的。
  4. $SYS/broker/messages:提供MQTT代理(broker)发送的所有消息的数量。
  5. $SYS/broker/uptime:反映了MQTT代理(broker)持续运行的时间。

这些$SYS主题提供了有关MQTT代理(broker)内部工作和性能的宝贵信息,使管理员和开发人员能够监控和分析关键统计信息。

通过理解以$开头主题的目的和意义,就可以有效的更深入的了解MQTT基础设施的行为和性能。

探究MQTT主题的动态性质

这些是MQTT主题的基础,正如能看到的,MQTT主题是动态的,提供了很好的灵活性。当在现实应用中使用通配符时,有一些挑战要注意。在重多广泛使用MQTT的项目中,我们已经收集了请多最佳实践。

MQTT最佳实践

避免斜杠开头

虽然MQTT允许主题以斜杠开头(如何/myhome/groundfloor/temperature),但引入了一个不必要的主题级别,前面是一个零字符。会导致歧义,而没有任何好处。所以,建议排除斜杠开头。

在MQTT主题中不要使用空格

空格是每个程序员的天然敌人,主题中的空格可能会妨碍可读性和调度,特别是在异常处理场景中。另外,UTF-8有许多不同的空格类型。在MQTT主题中,建议抵制使用空格和其他不常用在字符。

保持MQTT主题简明扼要

记住,每个主题都被包含在使用它的每条消息中。为了优化网络流量并节省宝贵资源,请使主题尽可能简明扼要。在资源有限的设备中,会显得特别重要,每个字节都被计算其中。

只使用ASCII字符,避免使用不可打印字符

为了确保主题的连贯性和明确性,建议使用ASCII字符。非ASCII的UTF-8字符可能会显示异常,使识别拼写错误或字符集相关总是变得难以处理。除非必要,在你的MQTT主题中避免使用非ASCII字符。

在主题里嵌入一个唯一标识符或客户端ID

要增强消息标识并强制执行授权,考虑在主题中嵌入发布客户端的唯一标识或客户端ID。这样,允许你确定消息的发送方,控制发布的权限。例如,有client1 ID的客户端能够发布消息到client1/status,而不是client2/status.

避免订阅通配符#

有时候,订阅所有通过代理(broker)的消息是有必要有。比如,为了将所有消息持久到数据库。不要使用MQTT客户端订阅代理(broker)上的所有消息并订阅多层级通配符。通常情况下,订阅的客户端无法处理所有消息的负载(尤其是在吞吐量很大的情况下)。

拥抱可扩展性

MQTT主题提供天然的灵活性,允许将来的扩展和新功能。考虑如何设计主题的结构能够适应未来的扩展或新增传感器或新增功能。设计主题以提高扩展性,而无需大幅更改整体主题层次结构。比如,如果你的智能家居方案增加了新的传感器,添加这些到你的主题树,而无需修改整体主题的层级,应该是可能的。

使用明确的主题,而不是能用的

区别你的主题来反映特定的数据流或实体。避免尝试用一个主题代表多个类型的消息。比如,在你的起居室有三个传感器,创建主题myhome/livingroom/temperatur,myhome/livingroom/brightness,myhome/livingroom/humidity,而不是使用一个类似myhome/livingroom的主题。这种做法提高了清晰度,并允许使用高级的MQTT功能,比如保留消息。后面文章中会详细介绍。

文档化

维护详细说明MQTT主题的文档,包括它们的目的、期望的消息负载和任何相关的约定和指导。有有助于扩展新的团队成员,有利于更好的合作。

持续改进

根据需求的改进、MQTT系统的反馈,经常检查、优化主题的结构。拥抱持续改进心态以确保高效且可扩展的MQTT通信。

安全

确保的你主题名称和命名约定不会无意间泄漏敏感信息。应用合适的接入控制和认证机制来保护MQTT通信。

结论

在MQTT传输消息中,MQTT主题是高效性和灵活性的基石。通过理解其复杂性和最佳实践,可以优化MQTT应用,为了最大化性能和扩展。
整篇文章,探究了MQTT主题的动态特性,深入通配符的使用、技术注意事项。讨论了避免使用斜杠开头和空格在主题中的重要性,使用ASCII字符和嵌入唯一标识符或客户端ID。同样强调了不要使用通配符订阅所有的消息的重要性,在主题设计中扩展性的意义。
遵循这些最佳实践,可以增加MQTT基础设施的可读性、可维护性和安全性。
接下来的文章中,会深入了解QoS

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/209896.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【npm | npm常用命令及镜像设置】

npm常用命令及镜像设置 概述常用命令对比本地安装全局安装--save (或 -S)--save-dev (或 -D) 镜像设置设置镜像方法切换回npm官方镜像选择镜像源 主页传送门:📀 传送 概述 npm致力于让 JavaScript 开发变得…

iOS——UIPickerView选择器

UIPickerView UIPickerView是 iOS 开发中常用的用户界面组件之一,用于在垂直方向上显示一个滚动的列表,用户可以通过滚动选择其中的一项。 UIPickerView的协议方法 UIPickerView和UItableView差不多,UIPickerView也要设置代理和数据源。UI…

fl studio2024试用版本如何汉化中文?

fl studio2024全称Fruity Loops Studio2024,这款软件也被人们亲切的称之为水果,它是一款功能强大的音乐创作编辑软件,拥有全功能的录音室,大混音盘以及先进的音乐制作工具,用户通过使用该软件,就可以轻松制…

2020年第九届数学建模国际赛小美赛B题血氧饱和度的变异性解题全过程文档及程序

2020年第九届数学建模国际赛小美赛 B题 血氧饱和度的变异性 原题再现: 脉搏血氧饱和度是监测患者血氧饱和度的常规方法。在连续监测期间,我们希望能够使用模型描述血氧饱和度的模式。   我们有36名受试者的数据,每个受试者以1 Hz的频率连…

CSPNet: A New Backbone that can Enhance Learning Capability of CNN(2019)

文章目录 -Abstract1 Introduction2 Related workformer work 3 Method3.1 Cross Stage Partial Network3.2 Exact Fusion Model 4 Experiments5 Conclusion 原文链接 源代码 - 梯度信息重用(有别于冗余的梯度信息)可以减少计算量和内存占用提高效率&am…

C语言 文件操作

文章目录 前言文件概念文件名数据文件&程序文件文本文件&二进制文件文件缓冲区 文件操作FILE结构体文件指针文件打开&关闭文件输入/输出文件指针控制 前言 主要需要看的是概念部分、以及FILE结构体、文件指针部分。其余函数使用,知道其功能存在即可&am…

【SpringBoot】请求参数

1. BS 架构 BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 在SpringBoot进行web程序开发时,它内置了一个核心的Servlet程序 DispatcherServlet,称之为 核…

EasyExcel之文件导出最佳实践

文件导出 官方文档:写Excel | Easy Excel (alibaba.com) 引言 当使用 EasyExcel 进行 Excel 文件导出时,我最近在工作中遇到了一个需求。因此,我决定写这篇文章来分享我的经验和解决方案。如果你对这个话题感兴趣,那么我希望这篇…

c语言插入排序算法(详解)

插入排序是一种简单直观的排序算法,其主要思想是将一个待排序的元素插入到已经排好序的部分的合适位置。 插入排序的原理如下: 将序列分为两部分:已排序部分和未排序部分。初始时,已排序部分只包含第一个元素,未排序…

php 接入 百度编辑器

按照github上的操作下载百度编辑器的包后,根据文档上的步骤操作(可能会遇到报错): 1、git clone 仓库 2、npm install 安装依赖(如果没有安装 grunt , 请先在全局安装 grunt) 我的是报了下面的错&#…

Leetcode 17 电话号码的字母组合

理解题意: 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合 本质上:数字代表着一个字母集合 数字的个数决定了递归的深度,即树的深度 数字代表的字母组合决定了当前树的宽度。 1.暴力回溯 这里没有什么剪枝…

387.字符串中的第一个唯一字符 —> `size()`

解答&#xff1a; int firstUniqChar(string s) {int size s.size();// char count[26] { 0 };// error.1int count[26] { 0 };// for (int i 0; i < s.size() - 1; i) // error.2for (int i 0; i < size; i){count[s[i] - a] 1;}for (int i 0; i < size; i){…

Android 幸运转盘实现逻辑

一、前言 幸运转盘在很多app中都有&#xff0c;也有很多现实的例子&#xff0c;不过这个难度并不是如何让转盘转起来&#xff0c;真正的难度是如何统一个方向转动&#xff0c;且转到指定的目标区域&#xff08;中奖概率从来不是随机的&#xff09;&#xff0c;当然还不能太假&…

人类的耳朵:听觉的动态范围

作者&#xff1a;听觉健康 听觉的动态范围即可用的听力范围。在坐标系中&#xff0c;它可以表示为以听阈和最大舒适级为界形成的区域&#xff0c;其坐标轴分别为频率和声压级&#xff08;刺激持续时间在某种程度上对其产生影响&#xff09;。是什么因素决定了人类听力的极限&am…

Compilation failureFailure executing javac, but could not parse the error

记一次maven编译错误导致的打包失败问题。错误如下 Compilation failure Failure executing javac, but could not parse the error: javac: Ч ı :  ? : javac <options> <source files> -help г ܵ ѡ 排查路径如下&#xff1a; 1&#xff…

【MySQL】MySQL的varchar字段最大长度是65535?

在MySQL建表sql里,我们经常会有定义字符串类型的需求。 CREATE TABLE `user` ( `name` varchar(100) NOT NULL DEFAULT COMMENT 名字) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ; 比方说user表里的名字,就是个字符串。MySQL里有两个类型比较适合这个场景。 char和varchar。…

我尝试用 AI 来做数据分析,结果差强人意!

大家好&#xff0c;我是木川 工作中经常会需要分析数据 1、统计分析&#xff0c;计算某项指标的均值、分位数、标准差等 2、相关性分析&#xff0c;比如分析销售额与顾客年龄、顾客性别、促销活动等的相关性 3、可视化分析&#xff0c;比如绘制柱状图、折线图、散点图等 有了 A…

几种排序的实现

直接插入排序 直接插入排序是一种简单的插入排序法&#xff0c;其基本思想是&#xff1a; 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新的有序序列 。 实际中我们玩扑克牌时&#xff…

交付《啤酒游戏经营决策沙盘》的项目

感谢首富客户连续两年的邀请&#xff0c;交付《啤酒游戏经营决策沙盘》的项目&#xff0c;下周一JSTO首席学习官Luna想让我分享下系统思考与投资理财&#xff0c;想到曾经看过的一本书《深度思维》&#xff0c;看到一些结构来预判未来。不仅仅可以应用在企业经营和组织发展上&a…

Uncaught SyntaxError: Unexpected end of input (at manage.html:1:21) 的一个解

关于Uncaught SyntaxError: Unexpected end of input (at manage.html:1:21)的一个解 问题复现 <button onclick"deleteItem(${order.id},hire,"Orders")" >delete</button>报错 原因 函数参数的双引号和外面的双引号混淆了&#xff0c;改成…