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

MQTT快速入门

MQTT通信:为什么物联网设备“话少、事多、网还差”,偏偏最适合它?

如果让一台服务器和一万个设备聊天,你会发现一个很残酷的现实:

设备并不会像浏览器那样“老老实实”配合你。

有些设备性能很弱,内存小得可怜;
有些设备网络很差,时断时续;
有些设备甚至挂在 2G、弱 Wi-Fi、蜂窝网络、边缘网关后面;
可业务却一点也不客气:

  • 状态要实时上报
  • 指令要及时下发
  • 掉线还得自动恢复
  • 消息最好别乱丢

这时候,如果你还拿传统“请求一次、响应一次”的思路去硬套,系统很快就会变得又重、又脆、又难维护。

于是 MQTT 出场了。

它不是那种“功能看起来很多”的协议,恰恰相反,它的魅力就在于四个字:

轻、稳、准、够用。

也正因为这样,MQTT 才会成为物联网、智能硬件、车联网、工业采集、边缘通信里出镜率极高的协议之一。

这篇文章,我们不讲空洞概念,直接把 MQTT 最核心的东西讲透:

  • MQTT 到底是什么
  • 它为什么适合通信场景复杂的设备系统
  • 发布/订阅到底是怎么工作的
  • QoS 0、1、2 到底有什么区别
  • 它和 HTTP、WebSocket 的思路差在哪
  • 实际项目里什么时候该用 MQTT

看完之后,你至少会真正理解一件事:

MQTT 不是“物联网专属黑话”,而是一套专门为“不稳定通信环境”设计出来的高效消息协议。


先说结论:MQTT 到底是什么?

官方对 MQTT 的定义可以概括为一句话:

MQTT 是一种轻量级、开放、简单、易实现的客户端/服务器发布-订阅消息传输协议。

这句话不长,但信息量很大。

你可以直接拆成四层来理解:

关键词它的意思
轻量级报文头小、协议开销低,适合资源受限设备和带宽有限网络
发布/订阅发送方和接收方不直接强绑定,通过 Broker 中转消息
客户端/服务器设备或应用作为客户端连接 Broker,Broker 负责路由消息
易实现很适合嵌入式、IoT、网关、移动端等通信环境复杂的场景

MQTT 最经典的使用环境,就是下面这类场景:

  • 智能家居设备上报状态
  • 工业传感器周期性采集数据
  • 车载设备持续推送遥测信息
  • 服务端向海量终端广播控制指令
  • 弱网环境下保证消息尽可能送达

一张图看懂 MQTT 的工作方式

很多人第一次学 MQTT,会被“主题”“订阅”“Broker”“QoS”这些词绕晕。

其实先别急着记名词,你只要先把下面这张图看懂,整体就通了。

Publish 到 topic: home/livingroom/temp

Subscribe: home/livingroom/temp

Subscribe: home/livingroom/temp

Subscribe: home/livingroom/temp

设备A
温度传感器

MQTT Broker

设备B
空调控制器

手机App
监控界面

云端服务
告警系统

这张图说明了一件特别重要的事:

发布者不需要知道订阅者是谁,订阅者也不需要知道发布者是谁。

大家只需要约定同一个Topic即可。

这就是 MQTT 最核心的设计思想:

解耦。


MQTT 里最重要的 4 个角色

1. Publisher:发布者

发布者负责发送消息,比如:

  • 温湿度传感器上报数据
  • 摄像头上报在线状态
  • 网关上报设备心跳

它只管“发到某个主题”,不需要关心是谁在接收。

2. Subscriber:订阅者

订阅者负责接收自己感兴趣的消息,比如:

  • 手机 App 订阅设备状态
  • 云端平台订阅传感器数据
  • 告警服务订阅故障事件

它只需要订阅某个主题即可。

3. Broker:消息代理

Broker 是 MQTT 的核心枢纽,可以理解为“消息中转站”。

它主要负责:

  • 接收客户端连接
  • 接收发布消息
  • 按主题转发给订阅者
  • 处理会话、保活、QoS、离线消息等能力

常见的 MQTT Broker 有:

  • EMQX
  • Mosquitto
  • HiveMQ
  • VerneMQ

4. Topic:主题

Topic 是 MQTT 消息路由的关键。

比如:

factory/line1/motor/temp factory/line1/motor/status home/bedroom/light/state car/001/location

你可以把 Topic 理解成“消息的地址”或者“消息的分类路径”。

谁订阅了某个 Topic,谁就能收到这个 Topic 的消息。


为什么 MQTT 比“请求响应”更适合设备通信?

我们先拿最常见的 HTTP 思路做个对比。

对比项MQTTHTTP
通信模型发布/订阅请求/响应
连接方式长连接为主通常短连接或半持久连接
适合场景高频状态上报、实时消息推送页面访问、接口调用、资源请求
协议开销更轻相对更重
解耦程度低,调用关系更直接
弱网适应性更好一般

这也是为什么很多设备系统里会出现一种经典组合:

  • 控制台/管理后台接口用 HTTP
  • 实时状态推送和设备通信用 MQTT

因为它们解决的问题,压根就不完全一样。

HTTP 更像“我主动问你一次,你回我一次”。
MQTT 更像“你只要把消息发到这里,谁关心谁就去收”。


MQTT 最值钱的地方,不是快,而是“省”

很多文章一提 MQTT,就只说“轻量级”“低开销”。

但真正做过设备通信的人会知道,MQTT 真正值钱的地方,不只是快一点,而是它能帮你省掉很多系统复杂度。

它通常能省掉这些麻烦:

  • 发布者和接收者之间的强依赖
  • 设备端频繁轮询服务端的开销
  • 服务端主动追踪每台设备状态的复杂逻辑
  • 在弱网下反复重建请求带来的成本

换句话说:

MQTT 不是单纯“更轻”,而是它把很多通信问题提前抽象掉了。


MQTT 的消息到底怎么走?

下面用一个非常典型的流程来理解。

场景

智能家居里,温度传感器每 5 秒上报一次温度,空调控制器和手机 App 都想看到这个值。

流程

1. 温度传感器连接 Broker 2. 空调控制器订阅 home/livingroom/temp 3. 手机 App 订阅 home/livingroom/temp 4. 传感器向 home/livingroom/temp 发布 26.5 5. Broker 收到后,把消息分发给空调控制器和手机 App

注意看,这个过程中:

  • 传感器不知道 App 存在
  • App 也不知道传感器的 IP
  • 空调控制器和 App 之间也没有直接耦合

它们都只和 Broker 打交道。

这就是 MQTT 的核心通信模型。


QoS 是 MQTT 最容易被问到的知识点

如果你面试、做项目、看文档,经常会遇到一个词:

QoS

它的全称是Quality of Service,也就是消息服务质量。

你可以简单理解为:

一条消息,Broker 和客户端要“多认真”地保证它送达。

MQTT 里最常见的是 3 个级别。

QoS 级别含义特点适合场景
QoS 0最多发送一次不确认,不重发,最快传感器高频上报、允许偶尔丢包
QoS 1至少送达一次会确认,可能重复普通业务消息、状态同步
QoS 2只送达一次流程最严谨,开销最大不能重复、不能丢失的重要消息

QoS 0:最快,但不保证一定到

这种模式很像:

“我发了,至于你收没收到,我不反复确认。”

适合高频、低价值数据,比如:

  • 温度每秒上报一次
  • 电压采样持续推送
  • GPS 实时位置流

因为这类数据的特点是:

下一条消息很快就来了,偶尔丢一条问题不大。

QoS 1:至少到一次

这种模式会要求接收方确认。

如果确认没回来,发送方会重发。

好处是更可靠,坏处是可能出现重复消息,所以业务侧要考虑幂等处理。

QoS 2:只到一次

这是 MQTT 最严格的消息保证级别。

它通过更完整的交互流程来避免重复和丢失,但代价就是更复杂、更慢一些。

所以项目里不要一上来就全用 QoS 2。

真正合理的做法是:

按消息价值选择 QoS,而不是盲目选最高级。


保留消息、遗嘱消息、持久会话,这些词到底什么意思?

这几个词特别像“看起来很高级,但第一次读完还是懵”的知识点。

我们一个个讲。

1. Retained Message:保留消息

如果某个 Topic 的最后一条消息被设置为保留消息,那么新订阅者一订阅这个 Topic,就能立刻拿到最近一次的值。

这在设备状态类场景里特别好用,比如:

  • 灯当前是开还是关
  • 门锁当前是锁定还是解锁
  • 设备当前在线还是离线

不然新客户端一连上来,还得等下一次上报才知道状态。

2. Last Will:遗嘱消息

这个名字听起来有点戏剧化,但很实用。

你可以在客户端连接时告诉 Broker:

“如果我异常断开了,你帮我向某个 Topic 发一条消息。”

比如设备掉线了,Broker 可以自动发布:

{"deviceId":"dev001","status":"offline"}

这样监控系统、App、平台服务就能第一时间感知设备异常离线。

3. Persistent Session:持久会话

持久会话的核心价值在于:

客户端临时掉线后,Broker 可以帮你保留一部分会话状态。

比如:

  • 订阅关系不丢
  • 某些 QoS 消息可以在重连后继续投递

这对弱网、移动设备、边缘设备都非常关键。


MQTT 为什么特别适合物联网?

因为物联网场景通常同时满足下面几个特征:

  • 设备多
  • 网络差
  • 带宽贵
  • 消息频繁
  • 终端能力弱
  • 需要低成本持续在线

而 MQTT 几乎就是围绕这些问题设计的。

下面这个表非常能说明问题:

物联网常见问题MQTT 对应思路
设备资源有限协议轻量、报文小
网络不稳定长连接、会话机制、QoS 支持
一条消息要发给很多端发布/订阅天然适合广播分发
设备和平台解耦困难Topic 路由减少强依赖
设备掉线难感知保活机制 + 遗嘱消息

所以你会发现,MQTT 本质上不是“为某个行业定制”的协议,而是:

它非常适合那些通信环境不理想、但消息交互又很频繁的系统。


MQTT 和 WebSocket 是什么关系?

这个问题也非常常见。

很多人会误以为它们是竞争关系,其实不准确。

更合适的理解是:

  • WebSocket更偏“传输通道”
  • MQTT更偏“消息协议”

也就是说,MQTT 可以跑在 TCP 之上,也常见于跑在 WebSocket 之上。

比如浏览器端接入 MQTT 时,很多 Broker 就会提供 WebSocket 接入方式。

所以它们不是简单替代关系,而是可能叠在一起使用。


一个真实项目里,MQTT 通常怎么落地?

下面给你一个很常见的工程结构:

传感器/设备

MQTT Broker

手机App

Web管理后台

设备控制服务

数据处理服务

时序数据库/业务数据库

典型流程通常是:

  1. 设备通过 MQTT 上报状态、遥测、告警
  2. Broker 把消息分发给数据处理服务
  3. 数据处理服务做解析、清洗、入库
  4. App 或后台订阅相关 Topic,实时显示设备状态
  5. 控制服务向设备下发命令,再由设备执行并回传结果

这套模式最大的价值在于:

设备通信层和业务层被自然分开了。


MQTT 适合什么,不适合什么?

适合

  • 物联网设备通信
  • 智能硬件状态上报
  • 工业采集与边缘网关
  • 实时推送和广播通知
  • 弱网环境下的持续连接通信

不太适合

  • 典型 REST 风格接口调用
  • 文件上传下载这类大块数据传输
  • 强事务型业务主链路
  • 只需要偶发请求、不需要持续在线的简单系统

别把 MQTT 神化。

它不是“任何实时系统都该上”的银弹,而是特别擅长处理“海量终端 + 高频消息 + 不稳定网络”这类问题。


面试或项目里,怎么用一句话讲清 MQTT?

如果你想用最短的话把 MQTT 解释清楚,可以直接说:

MQTT 是一种轻量级的发布/订阅消息协议,通过 Broker 在发布者和订阅者之间转发消息,特别适合弱网、低带宽、设备资源受限但需要持续通信的场景。

如果还想再加一句工程理解,可以补上:

它的核心优势不是“能通信”,而是能在复杂网络环境下,以较低成本把通信做得更稳定、更解耦。


最后总结

很多协议之所以难学,不是因为它真的复杂,而是因为第一次接触时,没有抓住它真正解决的问题。

MQTT 也是一样。

如果你只把它看成几个名词:

  • Broker
  • Topic
  • QoS
  • Retain
  • Will

那它会显得零碎、抽象、难记。

但如果你从问题出发,你会发现 MQTT 其实很“务实”:

设备弱、网络差、消息多、还想稳定通信。

于是它给出了一套非常工程化的答案:

  • 用发布/订阅解耦通信双方
  • 用 Broker 统一消息流转
  • 用 QoS 控制可靠性
  • 用会话、保活、遗嘱消息处理不稳定连接

这就是 MQTT 能长期活跃在物联网和设备通信领域的原因。

说到底,它不是最花哨的协议,但它确实是非常能打的协议。

http://www.cnnetsun.cn/news/1792699.html

相关文章:

  • 以太网和CAN,WIFI
  • 美团推荐算法研究员面试题精选:10道高频考题+答案解析(附PDF)
  • Codeforces Round 1091 (Div. 2) and CodeCraft 26 2217
  • 实时行情系统设计:从协议选择到高可用架构,再到数据源选型钩
  • 【Hot 100 刷题计划】 LeetCode 17. 电话号码的字母组合 | C++ 回溯算法经典模板
  • GitHub 推送该用 SSH 还是 HTTPS?一篇讲透两种登录方式的区别
  • 余弦调度策略
  • [Linux][虚拟串口]x一个特殊的字节露
  • 打理多个微信不用慌,告别切换内耗很简单
  • 深度解码:华为IPD流程管理体系L1-L5最佳实践与数字化转型架构全景(PPT)
  • 【无标题】鑫博XB931M wifi模块
  • WPF新手村教程(七)—— 终章(MVVM架构初见杀)疾
  • 把握 AI 时代核心:孩子自主能力的脑能构建路径
  • 面向对象 方法重写 继承 多态 final 相关案例
  • Linux I/O 演进史:从管道到零拷贝,一篇串起个服务端核心原语纠
  • Kiro IDE remote extension host terminated unexpectedly #4231 官方状态:**未修复**(2026最新实测)
  • OpenClaw安装使用指南
  • 2026届最火的六大AI辅助论文网站解析与推荐
  • plog嵌入式C++日志库:轻量、零开销与跨平台实践
  • 嵌入式网络接口设计:硬件选型与软件优化实践
  • M5StickC-Plus嵌入式开发全指南:ESP32-PICO-D4硬件解析与低功耗实践
  • PCSEL(光子晶体表面发射激光器)技术首次展示
  • 基于组件化架构的Bilibili-Evolved性能优化实战:实现60fps流畅播放与40%内存占用降低
  • 阻抗匹配原理与工程实践全解析
  • Omdia:受社交视频广告推动,2030年全球在线视频和电视收入将超过1万亿美元
  • 2026年怎么安装OpenClaw?腾讯云5分钟喂奶级部署+大模型APIKey配置、Skill集成流程
  • ESP32轻量级Google OAuth 2.0 JWT签名库
  • .NET 诊断技巧 | 日志框架原理、手写日志框架学习咸
  • 微软发布的《生成式人工智能初学者.NET 第二版》课程辰
  • Keil MDK中printf输出配置与优化指南