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

git上传流程

git安装网址:https://git-scm.com 如果您要将本地文件夹上传到名为"compiling"的GitHub仓库,可以按照以下步骤进行操作: 1.安装无脑下一步 2.cd到想上传的文件夹的上一级目录 2.初始化Git仓库:git init 设置分支&a…

C++特殊类设计

1.设计不能被拷贝的类 解析:拷贝只会放生在两个场景中 拷贝构造函数赋值运算符重载 因此想要让一个类禁止拷贝, 就需让该类不能调用“拷贝构造函数”以及“赋值运算符重载”,而C11提供的delete重载关键字可以让这件事情变得更加简单。 1.1.C9…

stl库之list链表与例题

stl中的list是双向链表&#xff0c;优点在于插入/删除元素方便&#xff0c;缺点是随机访问元素时间长 所需头文件&#xff1a;#include <list> 初始化 list<类型名> 变量名 定义一个int类型的变量a list<int> a; 在末尾插入元素 a.push_back(i); 在开…

LeetCode 每日一题 Day 8 || 简单枚举

2048. 下一个更大的数值平衡数 如果整数 x 满足&#xff1a;对于每个数位 d &#xff0c;这个数位 恰好 在 x 中出现 d 次。那么整数 x 就是一个 数值平衡数 。 给你一个整数 n &#xff0c;请你返回 严格大于 n 的 最小数值平衡数 。 示例 1&#xff1a; 输入&#xff1a;n …

Error: Cannot find module ‘@npmcli/config‘ 最新解决办法

看了网上许多这个问题的小伙伴&#xff0c;都是降级node版本来解决的。但是降级并不是我想要的结果。 真正的解决办法就是更新nvm&#xff0c;将你的nvm升级到最新版本&#xff0c;然后卸载掉npm报错的node版本&#xff0c;重新安装即可使用。 解决办法&#xff1a;更新nvm nv…

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

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

【开源视频联动物联网平台】J2mod库写一个Modbus RTU 服务器

J2Mod是一个Java编写的Modbus通信库&#xff0c;可以用于实现Modbus RTU服务器。以下是一个简单的示例&#xff0c;演示如何使用J2Mod库创建一个Modbus RTU服务器&#xff1a; 添加J2Mod库依赖项&#xff1a; 首先&#xff0c;确保在项目中包含J2Mod库。你可以将J2Mod库添加到…

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 原文链接 源代码 - 梯度信息重用&#xff08;有别于冗余的梯度信息&#xff09;可以减少计算量和内存占用提高效率&am…

C语言 文件操作

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

【SpringBoot】请求参数

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

EasyExcel之文件导出最佳实践

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

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

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

php 接入 百度编辑器

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

Leetcode 17 电话号码的字母组合

理解题意&#xff1a; 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合 本质上&#xff1a;数字代表着一个字母集合 数字的个数决定了递归的深度&#xff0c;即树的深度 数字代表的字母组合决定了当前树的宽度。 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;当然还不能太假&…

AI全栈大模型工程师(二十二)什么是模型训练

文章目录 💡 这节课会带给你还是写在前面Fine-Tuning 有什么用:先看一个例子我有很多问题一、什么是:二、什么是模型2.1、通俗(不严谨)的说、模型是一个函数:2.2、一个最简单的神经网络三、什么是模型训练3.1、模型训练本质上是一个求解最优化问题的过程3.2、怎么求解3.…