20251224 - 嵌入式 Linux 开发中的MQTT指南

这是一份 MQTT 从零到一 的详细指南。

本文侧重于 MQTT 在嵌入式和物联网(IoT)场景中的核心逻辑与应用。


1. 什么是 MQTT?

MQTT (Message Queuing Telemetry Transport) 是一种基于 发布/订阅(Publish/Subscribe) 模式的轻量级通讯协议。它构建于 TCP/IP 协议之上。

  • 一句话概括:它是物联网界的"快递系统"。设备不需要直接对话,而是通过一个中转站(Broker)来交换信息。
  • 核心特点:极轻量(代码量少、带宽占用极低)、低功耗、适合网络不稳定的环境(如无人机通信、移动网络)。

2. 核心架构:三个角色

理解 MQTT,只需理解这三个角色:

  1. Publisher(发布者):发消息的人。比如你的 I.MX6ULL 开发板采集到了温度数据,它就是发布者。
  2. Subscriber(订阅者):收消息的人。比如你的电脑上的上位机软件,或者手机 APP,想要看温度,它就是订阅者。
  3. Broker(代理/服务器):中转站。它负责接收发布者的消息,并根据"地址"分发给所有感兴趣的订阅者。

注意:在 MQTT 中,客户端(Client)既可以是发布者,也可以是订阅者,甚至同时都是。


3. 核心机制:它是如何工作的?

MQTT 不像 HTTP 那样是"请求-响应"模式(A 问 B,B 回答 A),而是基于 Topic(主题) 的事件驱动模式。

3.1 Topic(主题)------ 消息的"地址"

消息通过 Topic 进行分类。Topic 类似于文件路径,用斜杠 / 分隔。

  • 例子

    • uav/001/battery (001号无人机的电量)
    • factory/sensor/temp (工厂传感器的温度)
  • 通配符(非常重要):

    订阅者可以使用通配符一次订阅多个主题:

    • + (单层通配符):uav/+/battery ------ 订阅所有无人机的电量(如匹配 uav/001/battery,但不匹配 uav/001/gps/lat)。
    • # (多层通配符):uav/# ------ 订阅无人机下的所有数据。
3.2 Payload(负载)------ 消息的"内容"

这是实际传输的数据。MQTT 对数据格式不限制

  • 你可以发纯文本 "Hello"
  • 你可以发 JSON 字符串 {"temp": 25.5, "hum": 60}(最常用)。
  • 你可以发二进制数据(如图片数据、固件包)。
3.3 QoS(服务质量)------ 消息的"可靠性"

这是 MQTT 最强大的功能之一,适合不稳定的网络(如无人机远距离通信)。你可以设定 3 个等级:

  • QoS 0 (At most once / 至多一次)
    • "发后即忘"。我就发出去,不管你收没收到。
    • 场景:传感器高频数据,丢几个包无所谓。
  • QoS 1 (At least once / 至少一次)
    • 确保你肯定收到,但可能会收到重复的消息(需要去重)。
    • 场景:关键报警信息。
  • QoS 2 (Exactly once / 恰好一次)
    • 确保你收到且只收到一次。机制最复杂,开销最大。
    • 场景:计费系统、支付指令。

4. 两个关键的高级特性

对于嵌入式开发,这两个特性极其有用:

4.1 Retained Messages(保留消息)
  • 问题:如果你的温度传感器每 10 分钟发一次数据,而我在 10:01 分上线订阅,难道我要等到 10:10 才能看到当前温度吗?
  • 解决 :发布消息时设为 Retain。Broker 会保留该主题的最后一条 消息。新上线的订阅者会立即收到这条旧消息==(即当前状态)==。
4.2 LWT (Last Will and Testament / 遗嘱消息)
  • 问题:如果无人机突然断电或断网,Broker 怎么知道它掉线了?
  • 解决:客户端连接时,预先在 Broker 存一条"遗嘱"。如果客户端非正常断开(没有发 DISCONNECT 包),Broker 会自动把这条遗嘱发给其他订阅者。
  • 应用:上位机立刻弹窗 "设备已离线"。

5. 实战演示:在 Linux 下体验 MQTT

使用 Linux 开发板,我们可以直接用命令行工具 mosquitto 来体验全过程。

环境准备(在你的 Ubuntu 虚拟机或 I.MX6ULL 板子上):

Bash 复制代码
sudo apt-get install mosquitto mosquitto-clients
# mosquitto 是 Broker 服务
# mosquitto-clients 包含 mosquitto_pub 和 mosquitto_sub 两个工具
场景模拟

假设你的 终端A 是无人机(发布者),终端B 是地面站(订阅者)。

第一步:开启 Broker

通常安装后服务会自动运行。如果没有,执行 mosquitto -v 启动。

第二步:终端B 订阅(监听)

Bash 复制代码
# -h localhost: 连接本地 Broker
# -t "uav/data": 订阅的主题
mosquitto_sub -h localhost -t "uav/data"
# 此时终端B会进入阻塞状态,等待消息

第三步:终端A 发布(发送)

Bash 复制代码
# -m: 消息内容
mosquitto_pub -h localhost -t "uav/data" -m "Height: 100m"

结果:

你会看到 终端B 瞬间打印出了 Height: 100m。


6. 嵌入式 C 语言开发指引

对于 I.MX6ULL 开发(或论文研究),不能只用命令行,而是需要写 C 代码。

  • 标准库Eclipse Paho MQTT Clibmosquitto
  • 开发流程
    1. 交叉编译库 :下载 Paho MQTT 源码,用交叉编译器(arm-linux-gnueabihf-gcc)编译出动态库 .so
    2. 编写代码
      • MQTTClient_create(): 创建客户端对象。
      • MQTTClient_connect(): 连接 Broker。
      • MQTTClient_subscribe(): 定义回调函数处理接收到的数据。
      • MQTTClient_publishMessage(): 发送数据。

7. 总结:为什么它适合你的项目?

特性 传统 Socket / HTTP MQTT 对你的价值
带宽 协议头大,包含大量无用元数据 最小仅 2 字节头 无人机远距离传输通常带宽受限,MQTT 更省流量。
连接 短连接为主,服务器不知道设备是否在线 长连接,有心跳保活 你可以实时监控无人机的在线/离线状态。
模型 1对1 1对多 一个无人机发数据,你的电脑、手机、数据库可以同时收到,无需无人机发送多次。
相关推荐
TEC_INO2 小时前
STM32_4:TIM
stm32·单片机·嵌入式硬件
会编程是什么感觉...2 小时前
单片机 - STM32HAL库常用API
stm32·单片机
逐梦之程14 小时前
STM32的串口通讯--DMA接收和CPU接收不定长数据帧对比
stm32·单片机·嵌入式硬件
梁下轻语的秋缘18 小时前
I2S与I2C
运维·stm32·单片机·51单片机
Zeku19 小时前
20251222 - 韦东山Linux开发板I.MX6ULL连接无线WiFi
stm32·freertos·linux驱动开发·linux应用开发
许商19 小时前
【stm32】cmake脚本(二)
stm32·单片机·嵌入式硬件
Zeku19 小时前
20251222 - 常用命令“source etcprofile”的详细解析
stm32·freertos·linux驱动开发·linux应用开发
TEC_INO20 小时前
STM32_4:ESP8266-WIFI模块
stm32·单片机·嵌入式硬件
Moshow郑锴21 小时前
什么是 ACPI Bridge Device
stm32·单片机·嵌入式硬件