RK3506 嵌入式 MQTT 双向客户端完整实现(支持发布/订阅/单次发送\+固件打包开机自启)
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加密连接、账号密码认证等工业级功能。
更多推荐



所有评论(0)