《MQTT 从 0 到 1:原理、实战与面试指南全解》
一、MQTT 是什么?
MQTT(Message Queuing Telemetry Transport)是一种 轻量级、基于发布/订阅(Pub/Sub)模式的消息传输协议,适用于物联网(IoT)、实时通信等对 低带宽、高延迟、不稳定网络 友好的场景。
设计特点:
-
协议简单、开销小
-
使用 TCP 进行连接(也支持 WebSocket)
-
支持离线消息、消息保留、QoS 等高级特性
-
客户端与 Broker(服务器)之间是长连接
二、核心概念
名称 | 说明 |
---|---|
Broker(消息中间件) | 类似服务端,负责接收、分发消息(如:EMQX、Mosquitto) |
Client(客户端) | 生产者/消费者,可以发布或订阅消息 |
Topic(主题) | 消息分类,客户端按主题订阅或发布 |
Payload(载荷) | 真正传输的数据内容 |
QoS(服务质量等级) | 表示消息的传输可靠性,有 0/1/2 三种级别 |
Retained(保留消息) | 服务器保存该消息,新订阅者也能收到 |
Will(遗嘱消息) | 客户端异常断开时,由服务器发布的最后一条消息 |
通俗解释
MQTT 就像是一间奶茶店(Broker),你可以:
点奶茶(发布消息)
订奶茶(订阅消息)
然后奶茶店会帮你把奶茶送给你(消息分发)
传统 HTTP:
A 客户端要消息,就得一直问 B:“你有新消息吗?”
很烦、很累、很慢。
MQTT:
A 订阅了一个主题(比如“天气预报”)
B 发布了一条消息到“天气预报”
MQTT 服务器自动把这条消息推送给 A
张三(发布者)对 “新闻频道” 发了消息:
“今天下雨啦 ☔️”中间人(Broker)看到后:
所有订阅了 “新闻频道” 的人(李四、王五)都收到这条信息
角色 | 通俗解释 |
---|---|
Broker(中间人) | 就像快递公司/奶茶店,转发你发的消息 |
Publisher(发布者) | 发消息的人,比如天气预报员 |
Subscriber(订阅者) | 接收消息的人,比如你 |
三、MQTT 官方连接示例(JavaScript/前端 WebSocket)
安装 MQTT.js(浏览器端)
npm install mqtt
示例:浏览器连接 MQTT
import mqtt from 'mqtt'// 1. 创建连接
const client = mqtt.connect('ws://broker.emqx.io:8083/mqtt') // 使用 WebSocket 协议// 2. 连接成功
client.on('connect', () => {console.log('连接成功')// 订阅主题client.subscribe('test/topic')// 发布消息client.publish('test/topic', 'Hello MQTT')
})// 3. 接收消息
client.on('message', (topic, message) => {console.log(`收到来自 ${topic} 的消息: ${message.toString()}`)
})// 4. 错误处理
client.on('error', (err) => {console.error('连接失败:', err)
})
四、QoS(消息质量)
QoS 等级 | 描述 |
---|---|
0 | 最多一次,可能丢失(不保证送达) |
1 | 至少一次,可能重复 |
2 | 只有一次,确保不丢失、不重复(最慢) |
开发中常用 QoS = 0 或 1,实时性优先选 0,可靠性优先选 1。
五、MQTT 实践中常见注意事项
1. 保持长连接
-
MQTT 是基于 TCP 的长连接,需考虑
keepalive
心跳机制,避免断线。
2. 客户端断线重连
-
建议设置
reconnectPeriod
自动重连,或者手动在close
/error
中处理。
3. 多页使用统一连接(UniApp/Vue 等场景)
-
推荐使用全局连接池或 Vuex/Pinia 管理唯一连接,避免重复连接多个 broker。
4. topic 命名规范
-
统一使用小写、正斜杠分隔,例如:
device/123/status
-
支持通配符:
-
+
:单层通配符,例如device/+/status
-
#
:多层通配符,例如device/#
-
5. 安全问题
-
MQTT 本身无加密,建议部署 TLS(wss://)
-
Broker 应启用认证(用户名/密码),避免消息被劫持或滥用
六、面试可能会问的问题(附答案思路)
问题 | 答案提示 |
---|---|
1. MQTT 是什么?和 HTTP 有什么区别? | MQTT 是轻量级、实时性强的消息协议;HTTP 是请求-响应,适合一次性通信 |
2. 发布/订阅模式如何工作? | 客户端发布到某个 topic,所有订阅了这个 topic 的客户端都能收到 |
3. 什么是 QoS?各等级的特点? | 可靠性等级;QoS 0 不保证送达,QoS 1 至少送达一次,QoS 2 保证一次送达 |
4. 如何处理断线重连? | 通过 reconnectPeriod 设置自动重连,或手动监听 close 事件处理 |
5. MQTT 在 Web 前端中如何使用? | 使用 MQTT.js,基于 WebSocket 协议连接 Broker |
6. Retained、Will、Keepalive 分别是什么? | 保留消息、遗嘱消息、心跳机制,都是协议的高级特性 |
7. 多客户端连接同一个主题如何管理消息? | 所有订阅同一主题的客户端都会收到消息,可以通过 topic 搭配 clientId 控制 |
七、推荐开源 MQTT Broker
Broker | 说明 |
---|---|
EMQX | 高性能 MQTT Broker,支持集群、TLS、Dashboard |
Mosquitto | 轻量级,适合嵌入式和本地调试 |
HiveMQ | 商业级方案,界面友好,易于集成 |
八、进阶实践建议
-
UniApp 中使用 MQTT:
-
建议使用
mqtt.min.js
,适配微信小程序或 H5; -
配合 Vuex 或
globalData
管理全局连接; -
监听 onHide/onShow 生命周期控制断开/重连;
-
-
与后端联动:
-
通过 MQTT 接收设备消息,配合 WebSocket 实现 Web 实时看板;
-
可搭建中转服务(如 Node.js + MQTT.js)做协议转换与业务逻辑处理;
-
九、总结一句话
MQTT 是物联网和实时通信的理想选择,轻量、高效,配合前端 WebSocket 使用非常适合做实时状态、设备数据展示等场景。
相关文章:
《MQTT 从 0 到 1:原理、实战与面试指南全解》
一、MQTT 是什么? MQTT(Message Queuing Telemetry Transport)是一种 轻量级、基于发布/订阅(Pub/Sub)模式的消息传输协议,适用于物联网(IoT)、实时通信等对 低带宽、高延迟、不稳定…...
SpringMVC 通过ajax 实现文件的上传
使用form表单在springmvc 项目中上传文件,文件上传成功之后往往会跳转到其他的页面。但是有的时候,文件上传成功的同时,并不需要进行页面的跳转,可以通过ajax来实现文件的上传 下面我们来看看如何来实现: 方式1&…...
图片识别(TransFormerCNNMLP)
目录 一、Transformer (一)ViT:Transformer 引入计算机视觉的里程碑 (二)Swin-Transformer:借鉴卷积改进 ViT (三)VAN:使用卷积模仿 ViT (四)…...
手术机器人行业新趋势:Kinova多机械臂协同系统如何突破复杂场景适应性瓶颈?
机器人手术历经多阶段技术演进,已成为现代医疗重要方向。其需求增长源于医疗机构对高精度低风险手术方案的需求、微创手术普及及技术进步带来的复杂场景适应性提升。Kinova 轻型机械臂凭借模块化设计与即插即用功能,可快速适配不同手术环境,为…...
国酒华夏实业酒水供应链:全品类覆盖打造一站式购销平台
在消费升级与供应链效率双重驱动的酒水行业变革中,国酒华夏实业凭借全品类覆盖与数字化赋能,构建起集采购、品鉴、文化传播于一体的新型酒水供应链体系。其“一站式购销平台”模式不仅重塑了传统酒水流通链路,更通过精准服务与品质保障&#…...
【Qt】:设置hover属性,没有适应到子控件中
#ButtonStyle:hover 是一个 ID 选择器,仅对设置了 objectName"ButtonStyle" 的控件本身生效,不会自动应用到其子控件(如 QLabel 和 QWidget)。 在ButtonForm中,有一个Qwidget控件,在这个Qwidget中…...
缺乏经验的 PCB 过孔建模方法
您是一名背板设计人员,被指派设计一种新的高速、多千兆位串行链路架构,从多个线卡到背板上的多个交换矩阵交换卡。这些链路必须在第一天以 6GB/s 的速度运行,并且为 10GB/s (IEEE 802.3KR) 做好产品演进的准备。时间表很紧,您需要提出一个背板架构,以允许程序的其余部分…...
搭建人工智能RAG知识库的主流平台与特点概述
在2022年末chatgpt和2024年末deepseek的推动下,人工智能应用如雨后春笋,层出不穷,日新月异。现推荐一些截至目前比较主流的用来搭建RAG的平台。 1. Haystack 特点: 模块化架构:支持端到端问答系统构建,集…...
【QT】在界面A打开界面B时,界面A隐藏,界面B关闭时,界面A复现
在Qt6中,可以通过信号与槽机制实现界面A在关闭界面B时重新显示。以下是具体的实现步骤: 方法一:使用自定义关闭信号 在界面B中定义关闭信号:当界面B关闭时发射该信号。连接信号到界面A的显示槽:在界面A中创建界面B时…...
捡漏岗位:国考报名数据和岗位特征分析
2025 年国考官方数据及权威分析,报录比低于 10:1 的岗位主要集中在中西部艰苦边远地区、特殊专业技术岗位及定向招录岗位。 岗位名称招录机关地区招录人数报名人数报录比报考条件示例一级警长及以下(三)新疆出入境边防检查总站新疆3124:1男性…...
qt---命名规范
1、命名规范 1) 类名:单词首字母大写,单词和单词之间直接连接,无需连接字符 如:MyClass,QPushButton class MainWindow { };2) Qt中内置的类型,头文件和类命名同名。 如: #include <QStri…...
信息系统项目管理师考前练习3
项目组合管理 企业战略调整后,项目组合经理应优先: A. 终止所有不符合新战略的项目 B. 重新评估项目优先级与资源分配 C. 要求所有项目加快交付进度 D. 合并相似项目以减少成本 答案:B 解析:项目组合管理的核心是动态对齐战略,优先重新评估项目价值与资源匹配(第5版强调…...
【算法创新+设计】灰狼算法GWO+扰动算子,求解大规模TSP问题利器
目录 1.灰狼算法GWO原理2.连续空间到离散空间3.核心公式处理4.结果展示5.代码获取6.读者交流 1.灰狼算法GWO原理 【智能算法】灰狼算法(GWO)原理及实现 2.连续空间到离散空间 GWO算法是针对连续空间问题设计的优化方法,而旅行商问题&#…...
GPU P-State 模式说明
在 NVIDIA GPU 上,“P-State”(Performance State)用来表示显卡当前的性能/功耗等级,P0 代表最高性能(最高核心频率、最大功耗),数字越大性能越低、功耗越小。不同 P-State 的主要区…...
真实世界中的贝叶斯网络:Bootstrap、模型平均与非齐次动态的科研应用
在生态与环境科学领域,揭示变量间因果机制是理解复杂系统运行规律的核心挑战。传统实验方法受限于高昂成本与生态扰动风险,而经典统计模型仅能刻画变量相关性,难以突破"相关非因果"的认知瓶颈。贝叶斯网络作为融合图论与概率论的前…...
.NET外挂系列:4. harmony 中补丁参数的有趣玩法(上)
一:背景 1. 讲故事 前面几篇我们说完了 harmony 的几个注入点,这篇我们聚焦注入点可接收的几类参数的解读,非常有意思,在.NET高级调试 视角下也是非常重要的,到底是哪些参数,用一张表格整理如下ÿ…...
【VLNs篇】03:VLMnav-端到端导航与视觉语言模型:将空间推理转化为问答
栏目内容论文标题End-to-End Navigation with Vision-Language Models: Transforming Spatial Reasoning into Question-Answering (端到端导航与视觉语言模型:将空间推理转化为问答)核心问题如何利用大型视觉语言模型(VLM)实现端到端的机器人…...
云原生攻防4(Kubernetes基础补充)
什么是K8S? Kubernetes 是做什么的? 什么是 Docker? 什么是容器编排? Kubernetes 一词来自希腊语,意思是“飞行员”或“舵手”。这个名字很贴切,Kubernetes 可以帮助你在波涛汹涌的容器海洋中航行。 Kubernetes 是 Google 基于 Borg 开源的容器编排调度引擎,作为 CNCF最…...
redis--redisJava客户端:Jedis详解
在Redis官网中提供了各种语言的客户端,地址: https://redis.io/docs/latest/develop/clients/ Jedis 以Redis命令做方法名称,学习成本低,简单实用,但是对于Jedis实例是线程不安全的(即创建一个Jedis实例&a…...
SpringBoot-SpringBoot源码解读
SpringBoot-SpringBoot源码解读 一、Spring Boot启动过程概述 Spring Boot通过一系列的类和机制,简化了Spring应用的启动流程。当你执行SpringApplication.run()时,Spring Boot会自动完成应用的初始化、环境配置、组件加载、自动配置等任务,…...
黑马程序员C++2024新版笔记 第4章 函数和结构体
1.结构体的基本应用 结构体struct是一种用户自定义的复合数据类型,可以包含不同类型的成员。例如: struct Studet {string name;int age;string gender; } 结构体的声明定义和使用的基本语法: struct 结构体类型 {成员1类型 成员1名称;成…...
【沉浸式求职学习day46】【华为5.7暑期机试题目讲解】
沉浸式求职学习 题目1题目2 题目1 一个超大智能汽车测试场有多个充电桩,每个充电桩的位置由其在二维平面上的坐标(x,y)表示。给定一辆智能汽车的当前位置(car_x,car_y),请设计一个高效的算法,找出给定智能汽车行驶到充电桩行驶距离最近的k个…...
PDF处理控件Aspose.PDF教程:以编程方式将PDF转换为Word
您是否正在寻找在线将 PDF 转换为 Word 的方法?在本指南中,我们将探索如何使用 C#、Java 和 Python 编码解决方案将 PDF 文档转换为可编辑的 Word 文件。开发人员通过代码将 PDF 文件转换为 Word 格式,从而获得显著优势。这种方法可以轻松实现…...
旋转位置RoPE编码详解
一. 旋转位置编码和正余弦位置编码比对 旋转位置编码(RoPE)和正余弦位置编码(Sinusoidal Position Encoding)是两种常用的位置编码方法,它们在处理序列数据时具有不同的数学形式和特性。以下是对两者优劣的详细说明及…...
canvas(二)-动画(2d)
<canvas> 动画是通过 JavaScript 动态更新画布内容来实现的。它利用 requestAnimationFrame 方法实现平滑的动画效果,适用于游戏、数据可视化、交互式图形等场景。真的需要数据可视化等场景使用,还是直接引入外部模型还原度比较高,但同…...
Dynamics 365 Business Central Azure application registration
本方法适用于 单租户服务器身份验证。 实现方法 在大多数组织里ERP Admin 不一定有权限 Azure Admin权限,在实施过程中你只需要把以下指引发给你的系统管理员。 请注意后面有系统管理员设置好后,你如何检查。 导航到 https://admin.microsoft.com 并登…...
选择合适的Azure数据库监控工具
Azure云为组织提供了众多服务,使其能够无缝运行应用程序、Web服务和服务器部署,其中包括云端数据库部署。Azure数据库能够与云应用程序实现无缝集成,具备可靠、易扩展和易管理的特性,不仅能提升数据库可用性与性能,同时…...
Access链接Azure SQL
Hi,大家好呀! 最近在给大家分享了SQL Server方面的一些视频,那今天我们也来讲讲Azure SQL。 什么是Azure SQL,这里我们就不介绍了,如果你没有用这个数据库,那你可以简单的把它理解成,就是SQL …...
34、React Server Actions深度解析
一、灵魂契约协议(核心机制) 1. 次元融合架构 "use server";async function borrowBook(bookId: number, readerName: string) {// 模拟数据库操作const result await db.execute(UPDATE books SET available false WHERE id ?,[bookId]…...
Azure 应用服务中的异常处理、日志记录和通知:综合指南
简介 Azure 应用服务是基于云的应用程序,使开发人员能够在云上构建、部署和管理应用程序。与任何应用程序一样,制定适当的异常处理、日志记录和通知实践至关重要,以确保应用程序平稳运行,并快速识别和解决任何问题。在本篇博文中&…...
第16天-使用Python Pillow库常见图像处理场景
1. 打开与显示图像 from PIL import Image# 打开图像文件 img = Image.open("input.jpg")# 显示图像基本信息 print(f"格式: {img.format}") # JPEG print(f"尺寸: {img.size}") # (宽度, 高度) print(f"模式: {img.mode}") …...
VUE3+TS实现图片缩放移动弹窗
完整代码 使用VUE3、TS,实现将图片通过鼠标拖拽缩放以及选择缩放比例。 <template><div><el-dialogv-model"dialogVisible"title"查看图片":close-on-click-modal"false":close-on-press-escape"false"fu…...
关于Vue自定义组件封装的属性/事件/插槽的透传问题
// parent.vue <Myinputv-model"keyWords"placeholder"请输入内容"size"small"input"input"change"change"width"320" ><template #prepend><el-select v-model"select" placeholder&qu…...
智能驾驶中的深度学习:基于卷积神经网络的车道线检测
摘要 智能驾驶是人工智能技术的重要应用领域之一,而车道线检测是实现自动驾驶的基础功能。本文介绍了一种基于深度学习的车道线检测方法,使用卷积神经网络(CNN)对道路图像进行实时分析。文章详细阐述了数据预处理、模型构建、训练优化及实际部署的完整流程,并提供了Pytho…...
在 Excel xll 自动注册操作 中使用东方仙盟软件2————仙盟创梦IDE
// 获取当前工作表名称string sheetName (string)XlCall.Excel(XlCall.xlfGetDocument, 7);// 构造动态名称(例如:Sheet1!MyNamedCell)string fullName $"{sheetName}!MyNamedCell";// 获取引用并设置值var namedRange (ExcelRe…...
【每周一个MCP】:将pytdx封装成MCP
文章目录 配置文件MCP代码(其实github上都有)不错不错,星星之火可以燎原。 https://github.com/ddholiday/onedayoneMCP/tree/main/MCPs/tdx-mcp 配置文件 pytdx有两种读取数据的方式,分别是,从API读取,和从本地读取。 其中,从API读取,需要IP和端口。 这个官方文档…...
Vue3中插槽, pinia的安装和使用(超详细教程)
1. 插槽 插槽是指, 将一个组件的代码片段, 引入到另一个组件。 1.1 匿名插槽 通过简单的案例来学习匿名插槽,案例说明,在父组件App.vue中导入了子组件Son1.vue,父组件引用子组件的位置添加了一个片段,比如h2标签,然…...
【Java高阶面经:微服务篇】5.限流实战:高并发系统流量治理全攻略
一、限流阈值的三维度计算模型 1.1 系统容量基准线:压测驱动的安全水位 1.1.1 压力测试方法论 测试目标:确定系统在资源安全水位(CPU≤80%,内存≤70%,RT≤500ms)下的最大处理能力测试工具: 单机压测:JMeter(模拟10万并发)、wrk(低资源消耗)集群压测:LoadRunner …...
学习黑客了解密码学
5分钟了解密码学:从古老艺术到现代科学 🔐 作者: 海尔辛 | 发布时间: 2025-05-21 08:36:35 UTC 密码学简介:保护信息的艺术与科学 📜 密码学是研究如何安全传递和存储信息的学科。它不仅仅是加密和解密,更包含了身份…...
【UE5】环形菜单教程
效果 步骤 1. 下载图片资源:百度网盘 请输入提取码 提取码:fjjx 2. 将图片资源导入工程,如下 3. 新建3个控件蓝图,这里分别命名为“WBP_CircularMenu”、“WBP_Highlight”、“WBP_Icon” 4. 打开“WBP_Icon”,设置“所需” 添加…...
【JVM】学习笔记
1. JVM概述 JVM是一个抽象的计算机,用于运行Java程序。它将Java字节码转化为特定平台的机器代码,确保Java程序具有跨平台性。 2. JVM架构 JVM的架构通常包括以下几个主要部分: 类加载子系统(ClassLoader)ÿ…...
物流项目第五期(运费计算实现、责任链设计模式运用)
前四期: 物流项目第一期(登录业务)-CSDN博客 物流项目第二期(用户端登录与双token三验证)-CSDN博客 物流项目第三期(统一网关、工厂模式运用)-CSDN博客 物流项目第四期(运费模板列…...
PrintStream PrintWriter Java 打印流
使用场景: 代替 System.out 输出日志(比如 System.setOut(printStream))需要输出各种类型(如 println(123)、println("hello")) 常用方法: print(), println() → 支持所有基本类型和对象pr…...
前端excel表格解析为json,并模仿excel显示
前端环境:elementUI vue2 <style lang"scss" scoped> 页面效果 jsondata为mock数据,为方便调试其内容可清空,首行(字母坐标)随数据内容自动变化,首列也是一样,模拟excel …...
NumPy 2.x 完全指南【十六】分割数组
文章目录 1. 数组分割1.1 split1.2 array_split1.3 vsplit1.4 hsplit1.5 dsplit1.6 unstack 1. 数组分割 数组分割是指将一个数组拆分为多个子数组的操作,常用于数据处理、并行计算、分块处理等场景。NumPy 提供了多种分割函数,允许用户沿不同方向&…...
vue3 + vite 使用tailwindcss
第一步:安装依赖 vite版本较低(“vite”: “^4.0.0”)所以就使用低版本的tailwindcss npm install -D tailwindcss3.4.1 postcss autoprefixer第二步:配置文件生成 npx tailwindcss init -p会自动生成两个文件postcss.config.js和…...
K个一组链表翻转
目录 1. 题意 2. 解题思路 3. 代码 1. 题意 给一个链表,按 k 进行翻转,也就是 k 2 ,两两进行翻转,如果不够2则不动。 2. 解题思路 首先思考怎么翻转一个链表,反转链表:https://leetcode.cn/problems…...
逆向音乐APP:Python爬虫获取音乐榜单 (1)
1. 引言 在数字音乐时代,许多平台如音乐有榜单,限制非付费用户访问高音质或独家内容。然而,从技术研究的角度来看,我们可以通过逆向工程和Python爬虫技术解音乐的API接口,获取付费音乐的播放链接。 2. 技术准备 在当…...
STM32之串口通信WIFI上云
一、W模块的原理与应用 基本概念 如果打算让硬件设备可以通过云服务器进行通信(数据上报/指令下发),像主流的云服务器有阿里云、腾讯云、华为云,以及其他物联网云平台:巴法云.......,硬件设备需要通过TCP…...
Python爬虫实战:获取天气网最近一周北京的天气数据,为日常出行做参考
1. 引言 随着互联网技术的发展,气象数据的获取与分析已成为智慧城市建设的重要组成部分。天气网作为权威的气象信息发布平台,其数据具有较高的准确性和实时性。然而,人工获取和分析天气数据效率低下,无法满足用户对精细化、个性化气象服务的需求。本文设计并实现了一套完整…...