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

news2025/4/12 22:46:10

一、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/1


2、格式:$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 数据库选型指南》

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

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

相关文章

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 内核驱动模型中,设备与驱动的组织方式不是随意堆砌,而是基于清晰的分类…

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

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

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 线性变换本质 视频, 点击观看. 惊为天人 --> 豁然开朗 --> 突然顿悟 --> 开心不已…

用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 查…

【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;用户需要通过一些…