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

深入理解 MQTT 协议:物联网通信的核心

目录

一、什么是 MQTT?

二、MQTT 的核心特点

2.1 轻量级

2.2 发布/订阅模式

2.3 可靠传输

2.4 安全性

三、MQTT 协议架构 

3.1 核心组件

3.2 通信流程

四、MQTT 协议详解

4.1 消息格式

4.2 消息类型

4.3 QoS 级别

五、MQTT 的应用场景

六、MQTT 的实现

6.1 常用 Broker

6.2 客户端库

6.3 示例代码

6.3.1 Python 发布消息

 6.3.2 Python 订阅消息


一、什么是 MQTT?

MQTT(Message Queuing Telemetry Transport)是一种轻量级的发布/订阅消息传输协议,专为低带宽、不稳定网络环境下的物联网设备设计。它由 IBM 在 1999 年开发,现已成为物联网(IoT)领域最流行的通信协议之一。

二、MQTT 的核心特点

2.1 轻量级

  • 协议头小:MQTT 协议头最小只有 2 字节,适合资源受限的设备。
  • 低带宽消耗:通过二进制格式传输数据,减少网络流量。

2.2 发布/订阅模式

  • 解耦通信:发布者和订阅者通过主题(Topic)进行通信,无需直接连接。
  • 灵活扩展:支持一对多、多对多的通信模式。

2.3 可靠传输

  • 三种 QoS 级别:提供不同级别的消息可靠性保证。
  • 持久会话:支持断线重连后恢复未接收的消息。

2.4 安全性

  • 支持 TLS/SSL:加密通信内容,防止数据泄露。
  • 用户名和密码认证:确保只有合法客户端可以连接。

三、MQTT 协议架构 

3.1 核心组件

1. Broker(代理服务器):

  • 负责接收和转发消息。
  • 维护客户端连接和订阅关系。

2. Client(客户端):

  • 发布消息或订阅主题。
  • 可以是设备、应用程序或服务。

3.2 通信流程

1. 客户端连接到 Broker。

2. 客户端订阅感兴趣的主题。

3. 客户端发布消息到指定主题。

4. Broker 将消息转发给订阅该主题的客户端。

四、MQTT 协议详解

4.1 消息格式

MQTT 消息由固定头、可变头和有效载荷三部分组成:

  • 固定头:包含消息类型、QoS 级别等信息。
  • 可变头:包含主题名、消息 ID 等。
  • 有效载荷:实际传输的数据。

4.2 消息类型

MQTT 定义了 14 种消息类型,常用的包括:

  • CONNECT:客户端连接请求。
  • CONNACK:Broker 确认连接。
  • PUBLISH:发布消息。
  • SUBSCRIBE:订阅主题。
  • UNSUBSCRIBE:取消订阅。
  • PINGREQ/PINGRESP:心跳检测。

4.3 QoS 级别

MQTT 提供三种消息服务质量(QoS)级别:

  • QoS 0:最多一次,消息可能丢失。
  • QoS 1:至少一次,消息可能重复。
  • QoS 2:恰好一次,消息不丢失且不重复。

五、MQTT 的应用场景

  • 智能家居:设备通过 MQTT 协议与云端通信,实现远程控制。
  • 工业物联网:传感器数据通过 MQTT 传输到监控系统,实现实时监控。
  • 车联网:车辆通过 MQTT 与云端通信,实现远程诊断和控制。
  • 移动应用:移动设备通过 MQTT 接收实时通知和消息。

六、MQTT 的实现

6.1 常用 Broker

  • Eclipse Mosquitto:开源的 MQTT Broker,轻量且易用。
  • EMQX:高性能的分布式 MQTT Broker,支持大规模设备连接。
  • HiveMQ:企业级 MQTT Broker,提供商业支持。

6.2 客户端库

  • C/C++:Paho MQTT C/C++ 库。
  • Python:Paho MQTT Python 库。
  • JavaScript:MQTT.js。
  • Java:Paho MQTT Java 库。

6.3 示例代码

6.3.1 Python 发布消息
import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, rc):
    print("Connected with result code " + str(rc))
    client.publish("test/topic", "Hello, MQTT!")

client = mqtt.Client()
client.on_connect = on_connect

client.connect("broker.hivemq.com", 1883, 60)
client.loop_forever()
 6.3.2 Python 订阅消息
import paho.mqtt.client as mqtt

def on_message(client, userdata, msg):
    print(f"Received message: {msg.payload.decode()} on topic {msg.topic}")

client = mqtt.Client()
client.on_message = on_message

client.connect("broker.hivemq.com", 1883, 60)
client.subscribe("test/topic")
client.loop_forever()

相关文章:

  • VS Code User和System版区别【推荐使用System版本】and VSCode+Keil协同开发之Keil Assistant
  • 常用查找算法整理(顺序查找、二分查找、插值查找、斐波那契查找、哈希查找、二叉排序树查找、平衡二叉树查找、红黑树查找、B树和B+树查找、分块查找)
  • 国产编辑器EverEdit - 如虎添翼的功能:快速选择
  • pycharm社区版有个window和arm64版本,到底下载哪一个?还有pycharm官网
  • Qt——连接MySQL数据库之编译数据库驱动的方法详细总结(各版本大同小异,看这一篇就够了)
  • CentOS系统docker配置镜像加速registry-mirrors,配置阿里云和道客
  • IDEA通过Contince接入Deepseek
  • QT 互斥锁
  • 初识React
  • 2025年 Java 技术的新趋势
  • FreeRTOS第3篇:链表的“精密齿轮”——列表与列表项
  • ubuntu桌面东西没了,右键只有更换壁纸,显示设置和设置
  • Ubuntu 下 nginx-1.24.0 源码分析 - ngx_ssl_init 函数
  • 常用的网络安全设备
  • 我的docker随笔46:在x86平台构建龙芯镜像
  • (三)Axure制作转动的唱片
  • 牛客刷题自留-机械学习基础
  • 【LeetCode】438.找到字符串中所有的字母异位词
  • 【MySQL】# Windows下安装(压缩包、msi);Linux下安装(压缩包、命令、docker);设置连接数、binlog日志;修改时区
  • HTML之JavaScript循环结构
  • 演员刘美含二手集市被曝售假,本人道歉
  • 湖南华容县通报“大垱湖水质受污染”,爆料者:现场已在灌清水
  • 人到中年为何腰围变粗?科学家发现腹部脂肪增加的细胞元凶
  • 张译、惠英红分获第二十届中国电影华表奖优秀男、女演员奖
  • 王羲之《丧乱帖》在日本流传了1300年,将在大阪展23天
  • 经济日报金观平:充分发挥增量政策的经济牵引力