Day71 MQTT数据上传与ARM端交叉编译部署全链路实践
day71 MQTT数据上传与ARM端交叉编译部署全链路实践
一、项目目标与通信架构
1. 功能目标
实现ARM开发板通过MQTT协议将采集数据上传至远程服务器(如中国移动 OneNET),并通过Web浏览器实时查看,无需专用上位机。
2. 通信架构图
ARM开发板 (ATK-IMX6U)
│
├─ MQTT推送 → MQTT服务器(如 OneNET) → topic: abc / aabbcc
│
├─ 上位机(PC)← MQTT订阅(监测及控制软件)
│
└─ Web浏览器 ← Web服务器 ← 数据库 ← MQTT服务器
✅ 前提条件:
- 所有设备处于同一局域网或通过公网IP/中间服务器可达。
- 开发板具备联网能力(通过PC共享网络)。
二、MQTT客户端程序逻辑解析
核心流程(约40–50行代码)
| 步骤 | 功能说明 |
|---|---|
| ① 创建客户端对象 | 初始化 MQTT 客户端结构体指针 |
| ② 设置连接参数 | Broker地址、端口(8883)、Client ID、用户名、API Key |
| ③ 注册回调函数 | 连接断开回调、消息接收回调 |
| ④ 建立连接 | 调用 connect() 发起 TLS 安全连接 |
| ⑤ 发布消息 | 指定 topic、QoS=1、retain=false、payload(JSON格式) |
| ⑥ 等待确认 | 可选:检查发布结果 |
| ⑦ 断开连接 & 释放资源 | 避免内存泄漏 |
✅ 关键点:
- OneNET 要求 TLS 加密(端口 8883),必须链接 OpenSSL。
- payload 建议使用 JSON 格式,如
{"temp": 25.6},便于 Web 端解析。
三、PC端MQTT依赖库编译(验证逻辑)
1. OpenSSL 编译(PC版)
# 进入OpenSSL源码目录
./config enable-shared -fPIC # 启用动态库 + 位置无关代码
make
sudo make install # 安装到 /usr/local/ssl/
💡 作用:生成
/usr/local/ssl/lib/libssl.so和/usr/local/ssl/include/openssl/,供 Paho 链接。
2. Paho MQTT C 库编译(PC版)
# 修改 Paho Makefile(关键行)
CC ?= gcc
CFLAGS += -I /usr/local/ssl/include
LDFLAGS += -L /usr/local/ssl/lib
CCFLAGS_SO += -fPIC # 必须包含 -fPIC
FLAGS_EXES += -L /usr/local/ssl/lib
make
sudo make install # 安装到 /usr/local/lib 和 /usr/local/include
✅ 理想结果:生成
libpaho-mqtt3c.so,可被gcc main.c -lpaho-mqtt3c -lssl -lcrypto -lrt正确链接。
⚠️ 常见报错:
relocation R_X86_64_PC32 ... recompile with -fPIC→ 确保 OpenSSL 和 Paho 都加-fPIC。undefined reference to 'clock_gettime'→ 链接时加-lrt。
四、ARM开发板端交叉编译
1. 交叉编译环境准备
# Ubuntu 64位需安装32位兼容库
sudo apt-get install lib32ncurses5 lib32z1
💡 作用:使
arm-linux-gcc工具链能在64位系统运行。
2. OpenSSL ARM版编译
# 配置(指定安装路径 + 禁用汇编)
./config no-asm shared --prefix=$(pwd)/__install
# 修改 Makefile
CC = arm-linux-gcc
AR = arm-linux-ar $(ARFLAGS) r
RANLIB = arm-linux-ranlib
# 删除 -m64、-march=pentium 等x86专属选项
make
make install # 生成 ARM 库到 ./__install/
✅ 理想结果:
./__install/lib/libssl.a、libcrypto.a为 ARM 架构。
3. Paho ARM版编译(关键修改)
# 在 .PHONY 行下方添加
INCLUDES = -I/home/linux/code_test/mqtt_src/openssl-1.0.0s/__install/include
LIBSDIR = -L/home/linux/code_test/mqtt_src/openssl-1.0.0s/__install/lib# 修改链接行(如第181、187、203、215行)
${CC} $(INCLUDES) -g -o $@ $< -l${MQTTLIB_CS} ${FLAGS_EXES} $(LIBSDIR)# 若报 clock_gettime 错误,在 FLAGS_EXE 中加 -lrt
FLAGS_EXE = $(INCLUDES) $(LDFLAGS) -I ${srcdir} -lpthread -lrt -L ${blddir} $(LIBSDIR)
make CC=arm-linux-gcc
✅ 理想结果:
build/output/下生成libpaho-mqtt3c.so(ARM架构)。
💡 提示:Paho 源码中通常提供
Makefile_arm和Makefile_PC,可直接重命名使用:cp Makefile_arm Makefile
五、ARM端应用程序编译示例
示例 Makefile(~/mqtt_Lib/mqtt)
# 目标文件名
DST=all
# 源文件列表
SRC=mqtt.c main.c csv.c fb.c recv.c font_8x16.c
# 编译标志(-lrt 解决 clock_gettime)
FLAG=-g -Lpaho-mqtt3cs -lrt
# 默认编译器
CC=gcc
# 库路径(注意路径大小写)
LIBS+=-L/home/Linux/mqtt_Lib/paho.mqtt.c-master/build/output
LIBS+=-L/home/Linux/nqtt_Lib/openssl-1.0.0s/arm/Lib
# 头文件路径
INC+=-I/usr/Local/include# PC编译目标
$(DST):$(SRC)$(CC) $(SRC) $(FLAG)# ARM交叉编译目标
arm:$(SRC)arm-Linux-gcc $(SRC) $(FLAG) $(LIBS) $(INC) -lssl -lcryptocp a.out /home/Linux/nqtt_lib# 清理
clean:rm $(DST)
🔍 代码逐行解释:
arm-Linux-gcc:使用 ARM 交叉编译器(注意大小写,应为arm-linux-gcc,但部分环境接受此写法)。-L...:指定 Paho 和 OpenSSL 的 ARM 库路径。-lssl -lcrypto:链接 OpenSSL 加密库。cp a.out ...:将生成的可执行文件拷贝到指定目录。
✅ 理想结果:
file a.out # 输出:a.out: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), ...
六、开发板联网:Ubuntu 双网卡共享上网
1. 虚拟机网卡设置(VMware)
| 网卡 | 模式 | 用途 |
|---|---|---|
| 网卡1 | 桥接(Bridge) | 连接局域网(如 192.168.1.x) |
| 网卡2 | NAT | 共享主机WiFi上网 |
📌 操作步骤:
- 虚拟机 → 设置 → 网络适配器 → 桥接(绑定主机有线网卡)
- 添加第二块网卡 → NAT 模式
2. Ubuntu 网卡配置(/etc/network/interfaces)
auto lo
iface lo inet loopbackauto ens33 # 桥接网卡(连开发板)
iface ens33 inet static
address 192.168.1.3
netmask 255.255.255.0
gateway 192.168.1.1auto ens36 # NAT网卡(连外网)
iface ens36 inet dhcp
💡 作用:ens33 作为开发板网关(192.168.1.3),ens36 获取外网IP(如 192.168.110.129)。
3. 开启IP转发与NAT
# 加载内核模块
sudo modprobe ip_tables
sudo modprobe ip_nat_ftp# 关闭防火墙(调试用)
sudo ufw disable# 开启IP转发(临时)
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward# 永久生效
sudo vim /etc/sysctl.conf
# 取消注释:net.ipv4.ip_forward = 1
sudo sysctl -p# 设置NAT规则(192.168.1.0/24 → ens36的IP)
sudo iptables -t nat -A POSTROUTING -s 192.168.1.0/255.255.255.0 -j SNAT --to 192.168.110.129# 允许转发
sudo iptables -P FORWARD ACCEPT
✅ 理想结果:开发板可通过 Ubuntu 访问外网。
4. 开发板网络配置(ATK-IMX6U)
# 设置IP(与Ubuntu ens33同网段)
ifconfig eth0 192.168.1.100# 设置默认网关(指向Ubuntu ens33)
route add default gw 192.168.1.3# 配置DNS(解决域名解析)
echo "nameserver 8.8.8.8" > /etc/resolv.conf
echo "nameserver 114.114.114.114" >> /etc/resolv.conf
🔍 测试命令:
ping 192.168.1.3 # 通Ubuntu ping 8.8.8.8 # 通外网IP ping www.baidu.com # 通域名(验证DNS)
⚠️ 常见问题:
ping 8.8.8.8通但ping baidu.com不通 → 未配置 DNS。Destination Host Unreachable→ 路由或NAT未生效。
七、OneNET 平台接入流程
1. 平台操作
- 访问 https://open.iot.10086.cn/
- 创建产品 → 添加设备 → 获取 Device ID 和 Master APIKey
- 记录 MQTT 接入点(如
mqtts://mqtt.heclouds.com:8883)
2. 客户端连接参数
- Client ID:Device ID
- Username:空 或 Product ID
- Password:Master APIKey
- Topic:
$dp(OneNET 默认数据点主题)或自定义
✅ 成功标志:OneNET 控制台 “设备详情” → “数据流” 中可见上传数据。
八、终端调试工具
- Minicom:串口调试
- 版本:2.7.1
- 波特率:115200
- 数据格式:8N1
- 离线提示:
VT102 Offline - 快捷键:
CTRL-A Z查看帮助
九、荣誉与认证(OneNET平台)
中国移动 OneNET 平台已获:
- “绽放杯”5G创新应用大赛二等奖
- 中国电子学会科技进步奖
- 中国信息通信研究院 CNAS 认证
- 中国通信学会科技奖
- 可信云安全认证
十、总结与行动项
| 任务 | 验收标准 |
|---|---|
| ✅ 编译 ARM 版 Paho + OpenSSL | file a.out 显示 ARM 架构 |
| ✅ 配置 Ubuntu 双网卡共享 | 开发板 ping www.baidu.com 成功 |
| ✅ 开发板上传数据至 OneNET | OneNET 控制台可见实时数据 |
| ✅ Web 浏览器查看数据 | 无需上位机,直接网页访问 |
💡 经验总结:
- 网络调试需分层验证:物理 → IP → 路由 → DNS → 应用。
- 交叉编译务必检查 编译器、头文件路径、库路径。
- OneNET 强制 TLS,OpenSSL 不可省略。
“做技术,要么得到结果,要么得到经验——没有白干的事。”
