目录
MQTT Publish / Subscribe Architecture
MQTT
介绍
MQTT:物联网消息传递标准
MQTT是用于物联网(IoT)的OASIS标准消息传递协议。它被设计为一种极其轻量级的发布/订阅消息传输,非常适合以较小的代码占用和最小的网络带宽连接远程设备。MQTT如今被广泛应用于各种行业,如汽车、制造业、电信、石油和天然气等。
MQTT Publish / Subscribe Architecture
参考:
官网:MQTT - The Standard for IoT Messaging
MQTTX
是由 EMQ 开发的一款开源跨平台 MQTT 5.0 桌面客户端,它兼容 macOS,Linux 以及 Windows 系统。
MQTTX 的用户界面 UI
采用聊天式设计,使得操作逻辑更加简明直观。它支持用户快速创建和保存多个 MQTT 连接,便于测试 MQTT/MQTTS
连接,以及 MQTT
消息的订阅和发布。
在下载和安装前,请访问我们的 官网 或者 GitHub 页面了解最新的版本信息。使用最新版本能帮助提升使用体验。如果你对本项目有一定了解,你也可以直接克隆 MQTTX 的源码仓库,自行构建并使用。如果在使用过程中遇到任何问题,欢迎前往 GitHub issues 提出问题或者建议,或者 Fork 我们的项目并提交你修改后的 PR,我们将会认真查阅并及时回复。
预览
主要功能
- 采用聊天界面设计,使得操作更加简单明了
- 跨平台兼容,支持在 Windows,macOS,Linux 系统上运行
- 100% 兼容 MQTT v5.0,v3.1.1 和 v3.1 协议
- 订阅的 MQTT 主题支持自定义颜色标签
- 支持单向和双向 SSL 认证,同时支持 CA 和自签名证书
- 支持通过 WebSocket 连接 MQTT 服务器
- 支持 Hex, Base64, JSON, Plaintext 等 Payload 格式转换
- 自定义脚本支持模拟 MQTT 发布/订阅测试
- 提供完整的日志记录功能
- 多语言支持:简体中文、英语、日语、土耳其语及匈牙利语 🇨🇳 🇯🇵 🇺🇸 🇹🇷 🇭🇺
- 自由切换 Light、Dark、Night 三种主题模式
关系
MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,而 EMQ X(现在称为 emqx)则是一个开源的 MQTT 消息代理服务器(Broker)。它们的关系类似于 HTTP 协议 与 Nginx/Apache 服务器 的关系:MQTT 定义通信规则,EMQ X 实现这些规则并提供具体服务。
一、核心区别与联系
MQTT | EMQ X (emqx) |
---|---|
协议标准 | 软件实现 |
定义消息格式、通信流程和语义 | 提供服务器软件,处理客户端连接、消息路由和协议实现 |
不依赖特定技术栈 | 基于 Erlang/OTP 构建,支持高并发和分布式 |
无状态(协议层面) | 有状态(维护会话、订阅关系等) |
常见版本:3.1.1、5.0 | 最新版本:v5.0(兼容 MQTT 3.1/3.1.1/5.0) |
二、EMQ X 对 MQTT 的增强
EMQ X 作为 MQTT Broker,不仅实现了协议规范,还提供了一系列企业级功能:
1. 高性能与扩展性
- 百万级并发连接:单节点支持 100 万 + 设备连接(基于 Erlang 的轻量级进程模型)。
- 分布式集群:支持多节点集群,通过 Raft 算法实现数据一致性(如共享订阅状态)。
2. 协议扩展
- 多协议支持:除 MQTT 外,还支持 MQTT-SN(适用于低功耗设备)、CoAP、HTTP、WebSocket 等。
- 桥接功能:与其他 MQTT Broker 或 Kafka、RabbitMQ 等消息系统集成。
3. 安全与认证
- TLS/SSL 加密:支持双向认证(客户端证书)。
- 多种认证方式:内置数据库认证、LDAP、JWT、外部 HTTP 服务认证等。
- 细粒度 ACL:基于用户名、客户端 ID、IP 地址控制主题访问权限。
4. 规则引擎与数据集成
- SQL 风格规则:通过规则引擎过滤和转换消息(如将 JSON 数据存入数据库)。
- 数据桥接:将 MQTT 消息转发至 MySQL、PostgreSQL、Redis、Kafka 等后端系统。
5. 监控与管理
- 可视化 Dashboard:实时查看连接数、流量、主题统计等指标。
- Prometheus + Grafana 集成:支持企业级监控和告警。
三、典型应用场景
物联网平台
- MQTT 作为设备与平台的通信协议,EMQ X 作为核心 Broker 处理百万级设备连接。
边缘计算
- 在边缘节点部署 EMQ X 轻量级版本(如 Nano 版本),本地处理设备数据,减少云端压力。
微服务通信
- 用 MQTT 替代 HTTP 作为微服务间的异步通信协议,EMQ X 实现服务间消息路由。
实时数据推送
- 如金融行情推送、社交消息通知,利用 EMQ X 的持久会话和保留消息特性。
四、如何选择 Broker?
根据场景需求选择合适的 MQTT Broker:
特性 | EMQ X | Mosquitto | HiveMQ |
---|---|---|---|
开源 / 商业 | 开源(社区版)+ 商业 | 开源 | 商业(含社区版) |
单机并发 | 100 万 + 连接 | 10 万级连接 | 100 万 + 连接 |
分布式集群 | 支持 | 不支持(需手动桥接) | 支持 |
企业级功能 | 规则引擎、数据集成、监控 | 基础功能 | 企业级安全、管理工具 |
适合场景 | 大规模 IoT、分布式系统 | 小型项目、测试环境 | 金融、电信等高可靠场景 |
五、快速上手 EMQ X
1. 安装与启动
# Docker 快速启动(单节点)
docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 emqx/emqx:5.0
# 访问 Dashboard:http://localhost:18083(默认用户:admin,密码:public)
2. 使用命令行测试
# 订阅主题
mosquitto_sub -h localhost -p 1883 -t "test/topic"
# 发布消息
mosquitto_pub -h localhost -p 1883 -t "test/topic" -m "Hello from EMQ X!"
3. Python 客户端示例
import paho.mqtt.client as mqtt
def on_connect(client, userdata, flags, rc):
print(f"连接结果: {rc}")
client.subscribe("test/topic")
def on_message(client, userdata, msg):
print(f"收到消息: {msg.topic} {msg.payload.decode()}")
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect("localhost", 1883, 60)
client.loop_forever()
六、总结
通过组合使用 MQTT 协议和 EMQ X Broker,开发者可以快速构建可靠、高效的物联网或实时通信系统。
- MQTT 是基础:定义消息如何在客户端和 Broker 之间传输。
- EMQ X 是实现:提供高性能、可扩展的 MQTT 消息服务,简化开发并增强功能。
- 选择依据:根据项目规模和需求,小型场景可选择 Mosquitto,大规模分布式系统建议使用 EMQ X 或 HiveMQ。
MQTT 是一种轻量级的通信协议,用于在物联网设备之间进行消息传递,它通过发布 / 订阅模式实现消息的传递,具有低带宽、低功耗和可靠性的特点。
EMQX 是一款开源的大规模分布式 MQTT 消息服务器,功能丰富,专为物联网和实时通信应用而设计,能处理大量的 MQTT 连接和消息,支持多种协议,采用无主分布式的结构确保高可用性和水平扩展性。
Protocol Buffers(Protobuf)是一种由 Google 开发的用于序列化结构化数据的语言无关、平台无关、可扩展且高效的机制,通过定义消息的结构和格式来实现数据的序列化和反序列化,能生成多种编程语言的代码,可提供更高效的数据传输和更小的数据存储空间。
三者的关系是,在物联网等应用场景中,常常会将它们结合使用。EMQX 作为 MQTT 消息代理服务器,可接收和处理使用 MQTT 协议传输的消息。而 Protobuf 可用于对 MQTT 消息中的数据进行序列化和反序列化,以更高效地传输和存储结构化数据。例如,在一些物联网项目中,设备可能会使用 MQTT 协议将数据发布到 EMQX 服务器,而这些数据可以采用 Protobuf 格式进行编码,这样可以在保证数据准确性的同时,减少数据传输的带宽占用和存储成本。EMQX 的规则引擎也支持对 Protobuf 格式消息的编解码,方便对这类数据进行处理和验证