当前位置: 首页 > article >正文

MQTT的构成、使用场景、工作原理介绍

一、MQTT内容简介

        MQTT(Message Queuing Telemetry Transport)是一种轻量级、基于发布-订阅模式的消息传输协议适用于资源受限的设备和低带宽、高延迟或不稳定的网络环境】它在物联网应用中广受欢迎,能够实现传感器、执行器和其它设备之间的高效通信。

MQTT相关内容简介
序号MQTT组成内容说明
1MQTT Broker

1、负责管理客户端请求内容(建立连接、断开连接、消息订阅、取消、转发等操作)的关键组件,可轻松应对海量连接与百万级消息吞吐量。

2、常用到的MQTT Broker服务端有如下四种:

EMQX是一款开源的大规模分布式物联网MQTT服务器,能够以亚毫米级的延迟在一秒钟内处理百万级的MQTT消息。

Mosquitto是一款开源的MQTT服务器,体积小巧,即可运行在低功耗单板计算机上,也可部署在企业级服务器上,采用C语言编写,支持多种平台。

NanoMQ是一款位物联网边缘设计的轻量级MQTT服务器,以纯C语言编写,在独立的Broker环境中有较高性能,优势在于多平台的可移植性。

VerneMQ是采用Erlang/OTP开发的MQTT服务器,使用Apache2.0开源协议,支持将MQTT消息持久化到LevelDB中。

2MQTT 客户端

1、任何运行MQTT客户端库的应用与设备都是MQTT客户端(如:使用MQTT上报数据的各种传感器、使用MQTT进行通讯的程序应用、各种MQTT测试工具)
 

2、常用到的MQTT客户端有如下五种:

MQTTX是开源跨平台的MQTT5.0桌面客户端;

MQTTX Web是开源的MQTT5.0浏览器客户端,可直接在线使用;

MQTTX CLI是开源、功能强大、易用的MQTT5.0客户端工具;

NanoMQ是用于物联网边缘的超轻量MQTT服务器,也包含MQTT测试客户端与MQTT协议性能测试工具bench。

EasyMQTT仅适用于苹果设备的MQTT客户端;

emqx/README-CN.md at master · emqx/emqx · GitHubhttps://github.com/emqx/emqx/blob/master/README-CN.mdMQTT 协议快速入门 2025:基础知识和实用教程 | EMQhttps://www.emqx.com/zh/blog/the-easiest-guide-to-getting-started-with-mqttMQTT 客户端库 & SDK 大全 | EMQhttps://www.emqx.com/zh/mqtt-client-sdkMQTTX:全功能 MQTT 客户端工具MQTTX 是一款强大的全功能 MQTT 5.0 客户端工具,适用于桌面、命令行和 WebSocket。它使得开发和测试 MQTT 应用更加简单高效。https://mqttx.app/zh

博客 - 车联网 | EMQEMQ 博客包含了 MQTT 协议、MQTT 客户端使用指南,EMQX 产品技术指南,EMQX 产品最佳实践,以及物联网行业解决方案。 - 车联网https://www.emqx.com/zh/blog/category/internet-of-vehicles

# EMQX Broker服务器的默认端口内容 
EMQX Broker服务器Web管理界面的端口是:18083
TCP端口:1883
WebSocket端口:8083
SSL/TLS端口:8883
Secure WebSocket端口:8084#EMQX的默认账号密码是
账号:admin
密码:public

 

二、MQTT工作原理

        MQTT基于【发布-订阅模式】的通信协议,由MQTT客户端使用主题(Topic)进行消息的发布或订阅;通过MQTT Broker集中管理消息路由,并依据预设的服务质量等级(Qos)确保端到端消息传递的可靠性

MQTT的主题与通配符说明
序号通配符类型说明
1+

单层通配符,用于单个主题层级匹配【使用单层通配符时,单层通配符必须占据整个层级】

+        有效sensor/+        有效sansor/+/temperature        有效sansor+        无效(没有占据整个层级)
# 如客户端订阅了 sensor/+/temperature,则会接收到如下主题的消息:
sensor/1/temperature
sensor/2/temperature
sensor/3/temperature
...
sensor/n/temperature# 但是不会匹配如下主题
sensor/temperature
sensor/bedroom/1/temperature
2#

多层通配符,用于匹配主题中任意层级;表示它的父级和任意数量的子层级【使用多层通配符必须占据整个层级且必须是主题的最后一个字符

#        有效sensor/#        有效sensor/bedroom#        无效(没有占据整个层级)sensor/#/temperature        无效(不是主题的最后一个字符)
# 若客户端订阅主题 senser/#,则会收到以下主题的消息
sensor
sensor/bedroom
sensor/bedroom/1
sensor/bedroom/1/temperature
3$

以$SYS/开头的主题为系统主题,主要用于获取MQTT Broker服务器自身的状态、消息统计、客户端上下线事件等数据

# 如EMQX Broker服务器的主题集群状态有:
$SYS/#                                  获取到系统的所有主题消息
$SYS/brokers                            EMQX集群节点列表
$SYS/brokers/emqx@127.0.0.1/version     EMQX 版本
$SYS/brokers/emqx@127.0.0.1/uptime      EMQX 运行时间
$SYS/brokers/emqx@127.0.0.1/datetime    EMQX 系统时间
$SYS/brokers/emqx@127.0.0.1/sysdescr    EMQX 系统信息
4$share

共享订阅,是多个订阅者之间实现负载均衡的订阅方式【原理是:在原有主题的基础上添加 $share 前缀即可为一组订阅端启用共享订阅】

#EMQX Broker服务器支持如下两种格式的共享订阅前缀1、格式:$share/任意组名称/topic【若多个订阅者订阅该共享主题,
那么多个订阅者之间会实现负载均衡的订阅方式获取到消息】示例1:$share/g/test      前缀是:$share/g/    真实主题是:test示例2:$share/g/test/1    前缀是:$share/g/    真实主题是:test/12、格式:$share/任意组名称/topic【若多个订阅者订阅一个共享主题的组、
又有多个订阅者订阅另一个共享主题组,则共享主题组内的订阅者以负载均衡的方式接收消息,
而两个不同组名的共享主题组都会接收到同一个主题消息】示例1:$share/g1/test  有s1,s2,s3订阅该共享组  会有s1,s2,s3中任意一个接收到test主题消息示例1:$share/g2/test  有s4,s5订阅该共享组会有s4,s5中任意一个接收到test主题消息

注意:主题的通配符只能用于订阅,不能用于发布

        关于共享订阅的负载均衡策略可以在EMQX Broker服务器的配置文件(emqx.conf)修改,查找EMQX Broker服务器的配置文件操作如下

# Linux查找EMQX Broker的配置文件所在路径命令
find / -name emqx.conf

其中

全局策略可在配置文件的【broker.shared_subscription_strategy】配置;

局部的组策略可在配置文件的【broker.shared_subscription_group.$group_name.strategy】配置

共享订阅主题的负载均衡策略模式
序号共享订阅主题负载均衡策略说明
1random在所有订阅者中随机选择
2round_robin按照订阅顺序选择
3round_robin_per_group在每个共享订阅组中按照订阅顺序进行选择
4local随机在本地订阅中进行选择,如无法找到,则在集群范围内随机选择
5sticky选定订阅者后,始终向其进行发送,直到该订阅者断开连接
6hash_clientid通过对发送者的客户端 ID 进行 Hash 处理来选择订阅者
7hash_topic通过对源主题进行 Hash 处理来选择订阅者
# 均衡策略
broker.shared_subscription_strategy = random# 当设备离线,或者消息等级为 QoS1、QoS2,因各种各样原因设备没有回复 ACK 确认,消息会被重新派发至群组内其他的设备。
broker.shared_dispatch_ack_enabled = false

三、MQTT工作流程与服务质量

 3.1、MQTT的一般工作流程

        《1》客户端使用TCP/IP协议与MQTT Broker服务器建立连接(也可选择TLS/SSL加密来实现安全通信)客户端提供对应的认证信息,且指定会话类型(Clean Session【清除会话】或Persistent Session【持久会话】);

        《2》客户端可以向特定的主题发布消息,也可以订阅主题以接收消息。当客户端发布消息时,它是将消息发送给MQTT Broker服务器;而当客户端订阅主题消息时,它会连接到MQTT Broker服务器接收到与订阅主题相关的消息。

        《3》MQTT Broker服务器接收客户端发布的消息,然后再将消息转发给订阅了对应主题的客户端。消息的发布与订阅根据设定的服务质量(Qos)等级确保消息可靠传递,并根据会话类型为断开连接的客户端存储消息。

 3.2、MQTT的三种服务质量

        MQTT的三种服务质量,只要是用在不同网络环境下保证消息传递的可靠性,可根据项目实际情况选择。

MQTT的三种服务质量说明
序号MQTT的质量类型说明
1Qos 0 At most once

消息【最多传递一次】如果客户端不可用,则丢失这条消息

(消息即发即弃,不需要等待确认,不需要存储重传,接收方永远不担心收到重复消息)

2Qos 1 At least once

消息【至少传递一次】可以保证收到消息,但消息可能会重复

(为保证消息可达,Qos1加入了应答与重传机制,发送方只有在收到接收方的puback报文后,才会确认消息投递成功;在消息确认投递成功前,发送方都需要存储该publis报文以便重传)

3Qos 2 Exactly once

消息【只传送一次】可以保证消息不丢失也不重复

(需要解决消息可达与重复问题,相应地带来了最复杂的交互流程与最高开销,没一次Qos2消息传递,都要求发送方与接收方进行至少两次请求/响应流程)

注意:Oos等级从低到高,不仅意味着消息传递可靠性提升,也意味着传输复杂度的提升

 3.3、MQTT的遗嘱消息

        遗嘱消息是 MQTT 协议中的一个重要功能,它解决了只有服务端才能知道客户端是否在线的问题,使我们能够为意外离线的客户端优雅地完成善后事宜(即:在 MQTT 中,客户端可以在连接时在服务端中注册一个遗嘱消息,与普通消息类似,我们可以设置遗嘱消息的主题、有效载荷等等。当该客户端意外断开连接,服务端就会向其他订阅了相应主题的客户端发送此遗嘱消息。这些接收者也因此可以及时地采取行动,例如向用户发送通知、切换备用设备等等)。

关于遗嘱消息的介绍与使用方法请查看《遗嘱消息(Will Message)介绍与示例 | MQTT 5.0 特性详解 | EMQ》

四、MQTT协议与其他协议对比

  • MQTT vs HTTP
  • MQTT vs WebSocket
  • MQTT vs CoAP
  • MQTT vs AMQP

五、MQTT的安全认证

        MQTT在物联网应用中占有重要地位(涉及处理各种实时敏感数据)若缺乏防护,则会被攻击者利用漏洞拦截消息、篡改数据或破坏关键系统,甚至造成严重损害,为确保MQTT的安全性,通常采用如下方式来提升安全性:

  • 认证
    • 用户名/密码认证
    • SCRAM 增强认证
    • 其他认证方法
  • 授权
  • 流量控制
  • TLS/SSL

六、MQTT数据存储

        MQTT Broker 服务器本身并不具备数据存储功能。因此,必须将其与适当的数据库解决方案集成,才能有效管理和利用这些数据。选择合适的数据库不仅能优化数据存储效率,还能提升物联网应用的扩展性(用于后续数据的分析,体现商业价值)。请参考《MQTT 数据库选型指南》

相关文章:

MQTT的构成、使用场景、工作原理介绍

一、MQTT内容简介 MQTT(Message Queuing Telemetry Transport)是一种轻量级、基于发布-订阅模式的消息传输协议【适用于资源受限的设备和低带宽、高延迟或不稳定的网络环境】它在物联网应用中广受欢迎,能够实现传感器、执行器和其它设备之间的…...

RESTful API以及使用它构建 web 应用程序的方法

RESTful API是一种基于REST(Representational State Transfer)架构风格的应用程序接口,通过HTTP协议传输数据并使用标准的HTTP方法(GET、POST、PUT、DELETE)来对资源进行操作。 RESTful API 遵循一系列约定和规范&…...

Vanna + qwq32b 实现 text2SQL

Vanna 是一个开源的 Text-2-SQL 框架,主要用于通过自然语言生成 SQL 查询,它基于 RAG(Retrieval-Augmented Generation,检索增强生成)技术。Vanna 的核心功能是通过训练一个模型(基于数据库的元数据和用户提…...

电脑知识 | TCP通俗易懂详解 <一>

目录 一、👋🏻前言 二、🚍什么是TCP/TCP协议 三、🧍‍♂为什么TCP可靠 1.🥰关于可靠 2.🤠哪里可靠 3.🎓️图片的三次握手,四次挥手 4.📚️知识点总结 四、&…...

精品推荐-最新大模型MCP核心架构及最佳实践资料合集(18份).zip

精品推荐-最新大模型MCP核心架构及最佳实践资料合集,共18份。 1、2025年程序员必学技能:大模型MCP核心技术.pdf 2、MCP 架构设计剖析:从 Service Mesh 演进到 Agentic Mesh.pdf 3、MCP 架构设计深度剖析:使用 Spring AI MCP 四步…...

Linux 线程:从零构建多线程应用:系统化解析线程API与底层设计逻辑

线程 线程的概述 在之前,我们常把进程定义为 程序执行的实例,实际不然,进程实际上只是维护应用程序的各种资源,并不执行什么。真正执行具体任务的是线程。 那为什么之前直接执行a.out的时候,没有这种感受呢&#xf…...

VMware虚拟机Ubuntu磁盘扩容

VMware中操作: 选择要扩容的虚拟机,点击编辑虚拟机设置 打开后点击磁盘——>点击扩展(注意:如果想要扩容的话需要删除快照) 调整到你想要的容量 点击上图的扩展——>确定 然后我们进到虚拟机里面 首先&#…...

游戏引擎学习第217天

运行游戏并在 FreeVariableGroup 中遇到我们的断言 其实在美国,某些特定的小糖果(例如小糖蛋)只在圣诞节和复活节期间出售,导致有些人像我一样在这段时间吃得过多,进而增加体重。虽然这种情况每年都会发生&#xff0c…...

Day 8 上篇:深入理解 Linux 驱动模型中的平台驱动与总线驱动

B站相应的视屏教程: 📌 内核:博文视频 - 总线驱动模型实战全解析 —— 以 PCA9450 PMIC 为例 敬请关注,记得标为原始粉丝。 在 Linux 内核驱动模型中,设备与驱动的组织方式不是随意堆砌,而是基于清晰的分类…...

freertos内存管理简要概述

概述 内存管理的重要性 在嵌入式系统中,内存资源通常是有限的。合理的内存管理可以确保系统高效、稳定地运行,避免因内存泄漏、碎片化等问题导致系统崩溃或性能下降。FreeRTOS 的内存管理机制有助于开发者灵活地分配和释放内存,提高内存利用…...

Dify问题记录 (一)

问题背景 Dify智能体将含有中文的JSON参数传递到Java后端时出现乱码。 解决办法 在HTTP节点前添加代码执行节点,将参数强制编码为UTF-8格式。在Java后端代码中进行解码操作,以确保参数的正确性。 代码如下: 代码执行节点中代码 function main({arg…...

全新突破 | 更全面 · 更安全 · 更灵活

xFile 高可用存储网关 2.0 重磅推出,新增多空间隔离功能从根源上防止数据冲突,保障各业务数据的安全性与独立性。同时支持 NFS、CIFS、FTP 等多种主流文件协议,无需繁琐的数据拷贝转换,即可与现有系统无缝对接,降低集成…...

使用Python建立双缝干涉模型

引言 双缝干涉实验是物理学中经典的实验之一,它展示了光的波动性以及量子力学的奇异性。实验结果表明,当光或粒子通过两条狭缝时,它们会产生干涉现象,形成明暗相间的条纹图案。这种现象不仅说明了光的波动性,还揭示了量子力学的核心思想——粒子具有波动性。今天,我们将…...

T-Box车载系统介绍及其应用

定义 T-Box汽车系统,全称为Telematics - BOX,也常简称为车载T - BOX,是汽车智能系统及车联网系统中的核心组成部分,是安装在车辆上的一种高科技远程信息处理器。 工作原理 T-Box的核心功能主要通过MPU和MCU实现。MPU负责应用程序功…...

SQLyog使用教程

准备工作 链接本地数据库 准备 1:安装mySQL数据库 2:安装SQLyong 连接本地数据库 打开SQLyong应用,将会出现下面的页面 点击新建,输入链接名 输入密码,点击 连接 按钮 如果出现连接错误,且错误号为2058…...

for循环的优化方式、循环的种类、使用及平替方案。

本篇文章主要围绕for循环,来讲解循环处理数据中常见的六种方式及其特点,性能。通过本篇文章你可以快速了解循环的概念,以及循环在实际使用过程中的调优方案。 作者:任聪聪 日期:2025年4月11日 一、循环的种类 1.1 默认有以下类型 原始 for 循环 for(i = 0;i<10;i++){…...

使用 Python 扫描 Windows 下的 Wi-Fi 网络实例演示

使用 Python 扫描 Windows 下的 Wi-Fi 网络 代码实现代码解析 1. 导入库2. 解码混合编码3. 扫描 Wi-Fi 网络4. 运行函数 这是我当前电脑的 wifi 连接界面。 这个是运行的效果图&#xff1a; 代码实现 我们使用了 Python 的 subprocess 模块来调用 Windows 的内置命令 netsh…...

python manimgl数学动画演示_微积分_线性代数原理_ubuntu安装问题[已解决]

1.背景 最近调研python opencv, cuda加速矩阵/向量运算, 对于矩阵的线性变换, 秩, 转秩, 行列式变化等概概念模糊不清. 大概课本依旧是天书, 于是上B站搜索线性代数, 看到 3Blue1Brown 线性变换本质 视频, 点击观看. 惊为天人 --> 豁然开朗 --> 突然顿悟 --> 开心不已…...

【vue3】@click函数传动态变量参数

根据java的学习&#xff0c;摸索了一下vue3 函数传参的方式。以此作为记录。有更好的其它方式&#xff0c;可以评论区补充。 <script> const tmpref(); </script><button click"tmpFunction(传递参数:tmp)">按钮</button> // 直接【字符串…...

用matplotlib生成一个炫酷的爱心

下面是结合数学方程和可视化技巧&#xff0c;生成一个炫酷的爱心效果&#xff1a; import numpy as np import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation # 创建画布 fig plt.figure(figsize(8, 8)) ax plt.axes(xlim(-2.5, 2.5), ylim(-3,…...

【leetcode hot 100 300】最长递增子序列

错误解法&#xff1a;在每次更新db[i]时&#xff0c;如果当前nums[i]>nums[i-1]就db[i-1]1&#xff0c;否则db[i-1] class Solution {public int lengthOfLIS(int[] nums) {int n nums.length;int[] db new int[n]; // db[i]表示到i的最长严格递增子序列的长度db[0] 1;f…...

oracle 12c密码长度,复杂度查看与设置

一 密码长度和复杂度 Oracle 数据库通过 PASSWORD_VERIFY_FUNCTION 来控制密码复杂度。 1.1 查看当前的密码复杂度设置 SELECT * FROM dba_profiles WHERE resource_name PASSWORD_VERIFY_FUNCTION; LIMIT表示分配给该 PROFILE 的密码验证函数名称。如果为 NULL&#xff0c;…...

数据结构——哈希技术及链地址法

目录 一、哈希的定义 二、哈希冲突定义 三、构造哈希函数的方法 四、四种解决哈希冲突的方法 4.1 开放地址法 4.2 链地址法 4.3 再散列函数法 4.4 公共区溢出法 五、链地址法结构体设计 六、基本操作的实现 6.1 哈希函数 6.2 初始化 6.3 插入值 6.4 删除值 6.5 查…...

开源CMS的模块化设计和API接口如何具体影响其扩展性?

优秀的CMS系统都有自己主打的特点&#xff0c;开源CMS凭借其灵活性和低成本优势占据了市场主流地位&#xff0c;而模块化设计与API接口正是其扩展性的两大基石。本文将深入探讨这两大技术特性是如何影响cms的扩展性的。 一、模块化设计&#xff1a;功能解耦与生态繁荣的引擎 …...

【Docker】快速部署 Certbot 并为 Nginx 服务器配置 SSL/TLS 证书

【Docker】快速部署 Certbot 并为 Nginx 服务器配置 SSL/TLS 证书 引言 Certbot 是一个免费的开源工具&#xff0c;用于自动化管理和获取 SSL/TLS 证书&#xff0c;主要用于与 Let’s Encrypt 证书颁发机构交互。 步骤 Nginx 挂载 certbot 文件夹。 docker run -d \--name…...

Redis下载稳定版本5.0.4

https://www.redis.net.cn/download/ Redis下载 Redis 版本号采用标准惯例:主版本号.副版本号.补丁级别,一个副版本号就标记为一个标准发行版本,例如 1.2,2.0,2.2,2.4,2.6,2.8,奇数的副版本号用来表示非标准版本,例如2.9.x发行版本是Redis 3.0标准版本的非标准发行版本…...

Google Chrome下载受限制的解决方案【方法指南】

在国内使用网络时&#xff0c;部分用户在尝试访问Google Chrome官网下载谷歌浏览器时&#xff0c;常常遇到网页无法打开或文件下载失败的情况。这种下载受限制的问题多由网络访问政策或DNS解析异常导致。为了正常获取Google Chrome的最新版安装程序&#xff0c;用户需要通过一些…...

Linux关于git上传大文件的解决方案:使用Git LFS

最近想要上传sdk到gitlab仓库上&#xff0c;但是使用git push的时候发现限制文件上传的大小限制到了100MB。 保持当前仓库的干净&#xff0c;要么重新拉取&#xff0c;要么git reset HEAD^ --hard这个命令来重新进行commit&#xff0c;直到撤回到代码上显示没有commit的地方为止…...

JAVA后端八股面试经验总结-前言篇

1️⃣个人暑期实习面试情况 暑期实习面试告一段段落了 陆陆续续大小厂有20&#xff0b;Java后端开发的面经 2️⃣为什么要写这个呢&#xff1f; ①首先&#xff0c;了解最重点的面试最爱问的题型有哪些&#xff1f; 我会整理出我面到过至少2次的题目和回答方式&#xff0…...

《计算机名人堂》专栏介绍:先驱之路

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 &#x1f31f;引言&#xff1a;先驱之路一、出发点&#xff1a;讲述数字世界的缔…...