🧠 一,MQ 与 MQTT 简介(概念理解)
1.1 什么是消息中间件(Message Queue, MQ)?
- 本质:解耦、异步、削峰、缓冲、通信中介
- 类比:像快递转运中心,发件人与收件人不需同时在线
✅ 常见 MQ 协议或实现:
名称 | 类型 | 说明 |
Kafka | 分布式日志/流平台 | 高吞吐,适合大数据 |
RabbitMQ | AMQP 协议 | 功能全,支持多种协议 |
RocketMQ | 阿里开源 | 面向金融,可靠性高 |
MQTT | 超轻量协议 | 面向物联网设备 |
✅ MQTT 是什么?
MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,专门设计用于低带宽、高延迟或者不稳定网络环境中的通信。它基于发布/订阅模式,特别适合于物联网(IoT)应用,因为它能够在设备之间高效地传输数据,且对带宽的消耗较低。
MQTT 的核心特点包括:
- 轻量级:协议本身非常简单,消息头只有几个字节,能够最大限度地减少带宽的使用。
- 发布/订阅模型:客户端通过订阅主题(Topic)来接收消息,而通过发布消息到指定主题来向其他客户端发送数据。
- 可靠性:支持三种消息质量服务(QoS):QoS 0(至多一次)、QoS 1(至少一次)和 QoS 2(只有一次),能够确保消息的传递可靠性。
- 持久化:支持“持久化会话”,即即使客户端断开连接,它也能保留一些状态,重新连接后继续会话。
物联网(IoT)是指通过互联网将物理设备、传感器、控制器等对象连接在一起,以实现智能化管理和数据传输。由于 IoT 环境中设备种类繁多且分布广泛,通信协议必须具备高效、可靠、节能等特点,MQTT 协议正是因其优势成为物联网中广泛应用的标准协议。
以下是 MQTT 在 IoT 中的主要应用场景:
1. 智能家居
MQTT 可以使家庭中的各种设备(如智能灯泡、门锁、温控器、家电等)通过一个中央平台进行连接和控制。用户可以通过手机应用或语音助手来控制这些设备。例如,用户通过 MQTT 协议的智能家居系统可以远程开启或关闭空调、调节灯光、监控家庭安全设备。
2. 工业物联网(IIoT)
在工业领域,MQTT 使得不同的机器设备和传感器能够高效地进行数据交换。通过实时监控生产线上的温度、湿度、压力等数据,操作员可以及时做出反应,确保生产过程的安全和高效。例如,工厂可以通过 MQTT 来监控设备的运行状态,提前检测到设备故障,避免生产中断。
3. 智慧城市
MQTT 在智慧城市应用中也起着重要作用,特别是在交通管理、能源管理、环境监测等方面。通过部署传感器网络,MQTT 协议能够帮助城市管理者实时获取各种数据,如交通流量、空气质量、噪音水平等,进而优化城市管理和决策。例如,智能交通系统可以使用 MQTT 协议实时传输交通灯状态、车速、路况等信息,帮助调度中心进行智能调度。
4. 健康医疗
MQTT 在健康医疗领域也得到了广泛应用,尤其是用于远程健康监测。医疗设备(如心率监测仪、血糖仪、血压计等)通过 MQTT 将患者的健康数据实时发送到医院或诊所的系统中,医生可以在远程对患者的健康状况进行监控和评估。通过 MQTT 的高效数据传输,确保患者信息及时、准确地传递到医护人员手中。
5. 农业物联网
在农业领域,MQTT 被用于实时监控农业环境(如温度、湿度、土壤湿度等),并控制自动灌溉系统或温室环境调节设备。农业传感器收集的数据通过 MQTT 协议传输到云平台,农民可以根据实时数据调整农业生产过程,提高生产效率和产量。例如,温室内的气候控制系统可以通过 MQTT 来调节温度和湿度,以保持最佳的种植环境。
6. 智能电网与能源管理
MQTT 也被用于智能电网和能源管理系统中。通过 MQTT,能源管理系统可以实时监控和管理不同区域的能源消耗,并在需求波动时做出调节。例如,电力公司可以通过 MQTT 协议监控各个变电站的设备状态、电力流量等数据,确保电网稳定运行。
总结
MQTT 作为一种轻量级、灵活且可靠的消息传输协议,已经在众多物联网应用中得到了广泛采用。它帮助设备和系统之间高效地交换数据,解决了带宽低、延迟高和网络不稳定等问题。因此,MQTT 成为物联网应用中的首选协议之一,推动了智能家居、工业自动化、智慧城市等领域的快速发展。
🌍 二,MQTT 协议简史与发展
✅ 协议历史:
- 1999 年:IBM 初次设计用于油田传感器通信
- 2013 年:提交 OASIS 成为开放标准
- 2019 年:发布 MQTT 5.0,更强扩展性与错误报告机制
✅ 当前主流版本:
- 3.1.1:广泛使用,工业标准
- 5.0:增强了错误处理、元数据、共享订阅等
🔁 三,MQTT 的核心特点(和其他 MQ 区别)
特性 | MQTT | Kafka / RabbitMQ |
协议 | 轻量 TCP + 自定义二进制 | TCP + AMQP / 自定义 |
消息模型 | 发布-订阅(Pub/Sub) | Pub/Sub / 队列模型 |
QoS 支持 | ✅(0/1/2级) | 一般支持 |
保持连接(心跳) | ✅ | Kafka 不适合长期连接 |
离线消息 | ✅(保留消息、持久会话) | 有,但配置复杂 |
适用场景 | 物联网、边缘计算、低功耗设备 | 金融、日志收集、大数据处理 |
🧰 四,MQTT 软件生态现状
✅ Broker 实现(服务端):
名称 | 特点 |
Mosquitto | 最常用,轻量级,C语言编写 |
EMQX | 高性能国产选手,支持集群和企业级功能 |
HiveMQ | 商业级支持 + 插件系统 |
VerneMQ | Erlang 写的,适合高并发 |
NanoMQ | 超轻量,适合嵌入式系统(EMQ开源) |
✅ 客户端工具:
名称 | 说明 |
MQTTX | 图形化客户端,简单易用 |
MQTT Explorer | 可视化 Topic 树结构,调试强大 |
mqtt-cli | 纯命令行,适合脚本 |
Paho(Python/Java) | Eclipse 提供的多语言库 |
Eclipse Mosquitto Clients | 自带命令行工具(mosquitto_pub / _sub) |
🚀 五、典型应用场景和架构设计
✅ 场景一:智能家居设备控制
- 每个设备作为 MQTT Client 连接至 Broker
- 订阅
/home/livingroom/light
等主题 - 手机 App 发布开关命令即可远程控制
✅ 场景二:工业传感器数据采集
- 传感器每 10s 采集一次数据并发布到
/factory/line1/temp
- 数据服务订阅后直接入库或处理
✅ 架构建议
- 小规模:Mosquitto + 本地部署 + MQTTX 测试
- 中大型:EMQX 集群部署 + 多客户端 SDK(Python/Java/Go)
- 云原生:云 MQTT 服务(如 AWS IoT Core, EMQX Cloud)
🧠 六,MQTT的Demo 案例
✅ 第一步:通过 Docker 安装 Mosquitto
🐳 1.1 启动 Mosquitto Broker 容器
docker run -it --name mosquitto \
-p 1883:1883 \
-p 9001:9001 \
eclipse-mosquitto
1883
是 MQTT 默认端口(TCP)9001
是 WebSocket 端口(可选)- 容器名称为
mosquitto
📦 可选:后台运行 + 数据持久化
[root@localhost ~]# docker run -d --name mosquitto \
-p 1883:1883 \
-p 9001:9001 \
eclipse-mosquitto
9746da4fce8e8bddf0312957cf03e27ff6edb206ab32270bbeca37312e154ec6
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9746da4fce8e eclipse-mosquitto "/docker-entrypoint.…" 6 seconds ago Up 5 seconds 0.0.0.0:1883->1883/tcp, [::]:1883->1883/tcp, 0.0.0.0:9001->9001/tcp, [::]:9001->9001/tcp mosquitto
小编这边通过后台运行的方式进行启动
✅ 第二步:下载并准备 MQTT CLI 工具
☕ 2.1 下载 mqtt-cli
mqtt-cli GitHub 地址 直接下载自己需要的版本,小编这边使用的是:mqtt-cli-4.38.0.jar
[root@localhost mqtt-demo]# ll
total 32512
-rw-r--r--. 1 root root 33288206 Apr 24 19:18 mqtt-cli-4.38.0.jar
[root@localhost mqtt-demo]# pwd
total 32512
✅ 第三步:通过 MQTT CLI 进行发布/订阅
📥 3.1 订阅一个主题
由于我们通过 docker 启动一个MQTT的服务端 mosquitto 。
[toast@localhost mqtt-demo]$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9746da4fce8e eclipse-mosquitto "/docker-entrypoint.…" 15 hours ago Up 29 minutes 0.0.0.0:1883->1883/tcp, [::]:1883->1883/tcp, 0.0.0.0:9001->9001/tcp, [::]:9001->9001/tcp mosquitto
小编这边的是JDK21
[toast@localhost mqtt-demo]$ java -version
java version "21.0.6" 2025-01-21 LTS
Java(TM) SE Runtime Environment (build 21.0.6+8-LTS-188)
Java HotSpot(TM) 64-Bit Server VM (build 21.0.6+8-LTS-188, mixed mode, sharing)
现在我们订阅一个主题名为 hello/world
java -jar mqtt-cli-4.38.0.jar sub \
-t hello/world \
-h localhost \
-p 1883
sub
:表示订阅-t
:订阅主题-h
:Broker 主机地址(这里是localhost
)-p
:端口号(默认为 1883)
运行后你将进入监听状态,等待该主题下的消息。
📥 3.2 MQTT 默认本地运行模式
[toast@localhost mqtt-demo]$ java -jar mqtt-cli-4.38.0.jar sub \
-t hello/world \
-h localhost \
-p 1883
Unable to connect. Reason: 'Server closed connection without DISCONNECT.'
Use '-d' or 'v' option to get more detailed information.
当你执行订阅命令之后,发现 Unable to connect. Reason: 'Server closed connection without DISCONNECT.' 无法连接MQTT的问题。
原因就是MQTT默认使用本地运行模式,也就是说只能在本地才能访问。查看 eclipse-mosquitto 容器的启动日志
在启动日志里面看到一句 仅在本地模式启动。只有在这台机器上运行的客户端才能进行连接。尤其是通过容器化的方式运行比如(docker)
# 仅在本地模式启动。只有在这台机器上运行的客户端才能进行连接
Starting in local only mode. Connections will only be possible from clients running on this machine
需要从配置文件进行配置一下,允许远程订阅。由于小编这边启动容器的时候并没有将配置文件给映射出来,所以这边小编同学直接进入docker的 eclipse-mosquitto 容器里面修改配置文件。如果有将配置文件给映射出来的则可以直接在真实主机进行修改配置文件。
进入容器进行修改。
[toast@localhost mqtt-demo]$ sudo docker exec -it mosquitto /bin/sh
/ # ls
bin home mosquitto root sys
dev lib mosquitto-no-auth.conf run tmp
docker-entrypoint.sh media opt sbin usr
etc mnt proc srv var
/ # ls mosquitto
config data log
/ # ls mosquitto/config/
mosquitto.conf
/ # cd mosquitto/config/
/mosquitto/config # ls
mosquitto.conf # 配置文件的位置
/mosquitto/config # vi mosquitto.conf
修改的配置内容如下:
# 开启匿名连接
allow_anonymous true
# 显式启用端口监听服务
listener 1883
之后再往下翻
重新启动
[toast@localhost mqtt-demo]$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9746da4fce8e eclipse-mosquitto "/docker-entrypoint.…" 16 hours ago Up 29 minutes 0.0.0.0:1883->1883/tcp, [::]:1883->1883/tcp, 0.0.0.0:9001->9001/tcp, [::]:9001->9001/tcp mosquitto
[toast@localhost mqtt-demo]$ sudo docker restart 9746da4fce8e
9746da4fce8e
[toast@localhost mqtt-demo]$
现在重新订阅消息
📤 3.3 发布一条消息
另开一个终端,运行:
java -jar mqtt-cli-4.38.0.jar pub \
-t hello/world \
-m "Hello MQTT from CLI!" \
-h localhost \
-p 1883
pub
:表示发布-m
:消息内容
✅ 第四步:结果验证
- 你在订阅端会看到输出:
恭喜你完成了通过 mqtt-cli
和 Mosquitto 的 MQTT 消息传输测试!