RK3506 嵌入式 MQTT 双向客户端完整实现(支持发布/订阅/单次发送+固件打包开机自启)

文章摘要

本文基于RK3506 + Buildroot交叉编译环境,使用mosquitto库实现纯C MQTT多模式客户端,支持持续发布、订阅、单次发消息,自带命令行参数解析、信号优雅退出。重点讲解简易快速固件打包方案:本地编译APP后直接复制到Buildroot根文件系统,搭配开机自启脚本,刷机上电自动运行,操作简单、适合调试与产品快速落地。

标签:#RK3506 #Buildroot #嵌入式Linux #MQTT #mosquitto #开机自启

一、开发环境

  • 硬件:RK3506 MiniEVM

  • 构建系统:Buildroot

  • 交叉工具链:Buildroot内置 arm-linux-gcc

  • MQTT依赖:mosquitto C客户端库(仅编译libmosquitto客户端,不编译broker服务端)

二、项目简要说明

1. 目录结构

mqtt_demo/
├── inc/
├── lib/
├── src/MqttDualClient.c  # MQTT客户端源码
└── Makefile

2. 程序能力简述

  • 三种工作模式:周期持续发布、纯订阅监听、单次发送消息

  • 支持长短命令行参数解析、参数合法性校验

  • 支持 Ctrl+C 信号捕获,主动断开MQTT、优雅释放资源

  • 全套mosquitto事件回调:连接/断开/消息接收/消息发送完成

完整源码可自行替换,本文重点讲解编译后APP打包进固件 + 开机自启实战流程。

3. 精简版 Makefile

CC = /home/dan/HZ-RK3506_MiniEVM_LINUX_SDK/buildroot/output/rockchip_rk3506/host/bin/arm-linux-gcc
SYSROOT = /home/dan/HZ-RK3506_MiniEVM_LINUX_SDK/buildroot/output/rockchip_rk3506/host/arm-buildroot-linux-gnueabihf/sysroot
SYSROOT_FLAG = --sysroot=$(SYSROOT)

INC_DIR = ./inc
LIB_DIR = ./lib
SRC_DIR = ./src
SOURCES := $(wildcard $(SRC_DIR)/*.c)
TARGET = mqtt_dual_client

CFLAGS = $(SYSROOT_FLAG) -g -Wall -I$(INC_DIR)
LDFLAGS = $(SYSROOT_FLAG) -lmosquitto -lpthread

.PHONY: all clean rebuild
all: $(TARGET)
rebuild: clean all
clean:
	rm -f $(TARGET) *.o *~

$(TARGET): $(SOURCES)
	$(CC) $(CFLAGS) $(SOURCES) $(LDFLAGS) -o $@

三、前置配置:Buildroot 开启 Mosquitto 客户端库

必须先配置,否则编译缺库、运行缺库。

1. 进入配置界面

cd /home/dan/HZ-RK3506_MiniEVM_LINUX_SDK/buildroot
make rockchip_rk3506_defconfig
make menuconfig

2. Mosquitto 关键配置

路径:Target packages -> Networking applications -> mosquitto

  • ✅ 勾选 [*] mosquitto (编译出 libmosquitto.so 客户端库)

  • ❌ 取消 install the mosquitto broker (无需MQTT服务端,减小固件体积)

3. 完整编译一次固件基础系统

./build.sh

编译完成后,根文件系统自带 ARM 架构 mosquitto 动态库,刷机不会报缺库。

四、最简方案:本地编译 APP + 直接打包进固件

本方案为最简调试方案,无需写MK、无需新增包配置,适合快速迭代、日常调试。

1. 本地交叉编译 MQTT 客户端

cd ~/Documents/rk3506/mqtt_demo
make rebuild

生成可执行文件:mqtt_dual_client

2. 将程序放入固件根文件系统

Buildroot 最终固件文件系统目录:

buildroot/output/rockchip_rk3506/target/usr/bin/

cp mqtt_dual_client /home/dan/HZ-RK3506_MiniEVM_LINUX_SDK/buildroot/output/rockchip_rk3506/target/usr/bin/
chmod 755 /home/dan/HZ-RK3506_MiniEVM_LINUX_SDK/buildroot/output/rockchip_rk3506/target/usr/bin/mqtt_dual_client

五、配置开机自启(永久固化)

Buildroot 使用 /etc/init.d/ 启动机制,Sxx 开头脚本开机自动执行。

1. 创建自启脚本 S99mqttclient

路径:buildroot/output/rockchip_rk3506/target/etc/init.d/S99mqttclient

#!/bin/sh

case "$1" in
start)
    echo "启动MQTT双向客户端..."
    # 自行修改 broker IP、运行模式
    /usr/bin/mqtt_dual_client -h 192.168.1.100 -S device/cmd &
    ;;
stop)
    echo "停止MQTT客户端"
    killall mqtt_dual_client
    ;;
restart)
    $0 stop
    $0 start
    ;;
*)
    echo "用法: $0 {start|stop|restart}"
    exit 1
esac
exit 0

2. 添加可执行权限

chmod 755 /home/dan/HZ-RK3506_MiniEVM_LINUX_SDK/buildroot/output/rockchip_rk3506/target/etc/init.d/S99mqttclient

六、重新打包固件(无需全量编译)

放入程序和脚本后,只打包镜像即可,速度极快:

cd /home/dan/HZ-RK3506_MiniEVM_LINUX_SDK
./build.sh

打包完成后使用 RK 工具烧录固件即可。

七、开机验证自启效果

1. 查看进程

ps | grep mqtt_dual_client

2. 手动启停命令

/etc/init.d/S99mqttclient stop
/etc/init.d/S99mqttclient restart

八、拓展优化(可选)

1. 日志落地保存

/usr/bin/mqtt_dual_client -h 192.168.1.100 -S device/cmd > /data/mqtt_run.log 2>&1 

2. 切换为持续发布模式

/usr/bin/mqtt_dual_client -h 192.168.1.100 -P sensor/data -f 1 

九、常见问题踩坑汇总

1. 刷机提示找不到 mqtt_dual_client

确认文件放入 target/usr/bin,权限 755,重新打包镜像。

2. 开机不自动启动

脚本必须以 S+数字 开头、权限 755,放置在/etc/init.d/

3. 运行提示缺少 libmosquitto.so.1

menuconfig 开启 mosquitto,重新完整编译一次 buildroot。

4. make clean 后程序消失

本方案为临时覆盖方案,清理后会重置,重新复制 APP 再打包即可。

十、文末总结

本文使用最简方式完成 MQTT客户端编译 - 固件固化 - 开机自启 全流程,无需复杂自定义包配置,非常适合嵌入式开发者日常调试、功能验证、快速部署物联网终端程序。

后续可在此基础上拓展:断线重连、心跳保活、TLS加密连接、账号密码认证等工业级功能。

更多推荐