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

软件工程(七):MQTT协议

概念

特性描述
协议类型应用层协议(基于 TCP/IP)
通信模式发布/订阅(Publish/Subscribe)
网络开销小报文头仅 2 字节起,非常轻量
保持长连接使用 Keep Alive 机制,适合持续连接的设备
面向物联网广泛用于智能家居、传感器网络、车联网、工业自动化等

通信模型

三个核心角色:

角色说明
Client(客户端)连接到Broker,发布消息或订阅消息
Broker(消息代理)中心节点,负责接收、过滤、分发消息
Topic(主题)类似于路径字符串,如 home/temperature,用于消息分类

通信过程:

+---------+        publish(msg)        +--------+         deliver(msg)        +---------+
| ClientA | -------------------------> | Broker | -------------------------> | ClientB |
|         |      topic: /sensor/temp   |        |      topic: /sensor/temp   |         |
+---------+                            +--------+                            +---------+
  • ClientA 发布消息到主题 /sensor/temp
  • Broker 接收到消息后,将其转发给所有订阅该主题的客户端(如ClientB)

消息结构

MQTT 报文头部非常小,典型的报文格式包括:

+-----------+-------------+----------------+
| FixedHeader | VariableHeader | Payload      |
+-----------+-------------+----------------+
  • FixedHeader:消息类型、QoS 等信息,占 2 字节起
  • VariableHeader:可选,如 Topic 名称、消息标识符
  • Payload:消息实际内容

报文类型(固定14种)

报文类型描述
CONNECT客户端请求建立连接
CONNACK连接确认
PUBLISH发布消息
PUBACK/PUBREC/…QoS确认机制相关报文
SUBSCRIBE订阅主题
SUBACK订阅确认
UNSUBSCRIBE取消订阅
PINGREQ/PINGRESP保活机制
DISCONNECT客户端断开连接

QoS 服务质量等级(Quality of Service)

等级含义说明
0至多一次(at most once)不保证送达,可能丢失
1至少一次(at least once)保证至少送达一次,可能重复
2仅一次(exactly once)保证仅送达一次,最安全但最慢

MQTT 保持连接机制

  • 使用 PINGREQPINGRESP 消息定期心跳检查
  • Keep Alive 超时时,Broker 可以主动断开连接

安全机制

机制说明
用户名密码Client可在 CONNECT 报文中提供
TLS/SSL支持基于 TLS 加密的连接
ACLAccess Control List 控制发布/订阅权限

与其他协议比较

协议优点缺点
MQTT轻量、低带宽、实时性好需要保持长连接
HTTP易用、成熟、兼容性强不适合实时推送
CoAP更轻、更适合资源受限设备兼容性差、不如MQTT通用
AMQP企业级功能强复杂、开销大

常用工具/服务器

名称类型说明
MosquittoBroker轻量级、开源、高性能 MQTT Broker
EMQXBroker支持百万级连接,功能强大
HiveMQ商业/企业级可视化管理、集群支持
MQTT.fx客户端工具测试 MQTT 连接、发布、订阅
http://www.xdnf.cn/news/7883.html

相关文章:

  • WebGPU 图形计算
  • 【iOS(swift)笔记-10】利用类的继承来实现不同地区语言的显示
  • Serverless爬虫架构揭秘:动态IP、冷启动与成本优化
  • 【嵌入式人工智能产品开发实战】(二十二)—— 政安晨:改造小智AI开发智能体硬件(案例:移植PowerManager后麦克风不工作)
  • 栈和队列的实现
  • 如何在PyCharm2025中设置conda的多个Python版本
  • 如何利用 Conda 安装 Pytorch 教程 ?
  • 深入解析AI中的Prompt工程:从理论到实践
  • 网络世界的“变色龙“:动态IP如何重构你的数据旅程?
  • 【iOS】分类、扩展、关联对象
  • OneDrive登录,账号跳转问题
  • 【Java高阶面经:数据库篇】13. MySQL 并发控制秘籍:MVCC 协议与隔离级别深度解析
  • 在实际网络部署中,静态路由的优先级通常高于RIP
  • 缺乏经验的 PCB 过孔建模方法
  • Java Collection(集合) 接口
  • Xilinx 7Series\UltraScale FPGA MultiBoot Fallback
  • bi工具是什么意思?bi工具的主要功能有哪些?
  • Spark SQL 原理与开发
  • transformer归一化层优化:深度解读 RMSNorm (Root Mean Square Layer Normalization,均方根层归一化)
  • Git 提交大文件 this exceeds GitHub‘s file size limit of 100.00 MB
  • MCP和 AI agent 有什么区别和联系
  • 什么是 Agent 的 Message
  • 现代数据库系统的九大类别解析
  • Socket编程——TCP
  • 振动分析 - 献个宝
  • AI人工智能——Matplotlib绘制各种数据可视化图表的基础方法
  • ThinkPHP 根据路由文件获取路由列表
  • Python60日基础学习打卡D32
  • 如何使用两块硬盘作为 Ubuntu24 的系统盘,实现坏掉一块不影响系统运行。
  • 变电站综合自动化系统