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版)

bash 复制代码
# 进入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版)

makefile 复制代码
# 修改 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
bash 复制代码
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. 交叉编译环境准备

bash 复制代码
# Ubuntu 64位需安装32位兼容库
sudo apt-get install lib32ncurses5 lib32z1

💡 作用 :使 arm-linux-gcc 工具链能在64位系统运行。


2. OpenSSL ARM版编译

bash 复制代码
# 配置(指定安装路径 + 禁用汇编)
./config no-asm shared --prefix=$(pwd)/__install
makefile 复制代码
# 修改 Makefile
CC = arm-linux-gcc
AR = arm-linux-ar $(ARFLAGS) r
RANLIB = arm-linux-ranlib
# 删除 -m64、-march=pentium 等x86专属选项
bash 复制代码
make
make install    # 生成 ARM 库到 ./__install/

理想结果./__install/lib/libssl.alibcrypto.a 为 ARM 架构。


3. Paho ARM版编译(关键修改)

makefile 复制代码
# 在 .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)
bash 复制代码
make CC=arm-linux-gcc

理想结果build/output/ 下生成 libpaho-mqtt3c.so(ARM架构)。
💡 提示 :Paho 源码中通常提供 Makefile_armMakefile_PC,可直接重命名使用:

bash 复制代码
cp Makefile_arm Makefile

五、ARM端应用程序编译示例

示例 Makefile(~/mqtt_Lib/mqtt

makefile 复制代码
# 目标文件名
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 -lcrypto
	cp 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 ...:将生成的可执行文件拷贝到指定目录。
    理想结果
bash 复制代码
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上网

📌 操作步骤

  1. 虚拟机 → 设置 → 网络适配器 → 桥接(绑定主机有线网卡)
  2. 添加第二块网卡 → NAT 模式

2. Ubuntu 网卡配置(/etc/network/interfaces

conf 复制代码
auto lo
iface lo inet loopback

auto ens33          # 桥接网卡(连开发板)
iface ens33 inet static
address 192.168.1.3
netmask 255.255.255.0
gateway 192.168.1.1

auto ens36          # NAT网卡(连外网)
iface ens36 inet dhcp

💡 作用:ens33 作为开发板网关(192.168.1.3),ens36 获取外网IP(如 192.168.110.129)。


3. 开启IP转发与NAT

bash 复制代码
# 加载内核模块
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)

bash 复制代码
# 设置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

🔍 测试命令

bash 复制代码
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. 平台操作

  1. 访问 https://open.iot.10086.cn/
  2. 创建产品 → 添加设备 → 获取 Device IDMaster APIKey
  3. 记录 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 不可省略
    "做技术,要么得到结果,要么得到经验------没有白干的事。"
相关推荐
wa的一声哭了15 小时前
WeBASE管理平台部署-WeBASE-Web
linux·前端·网络·arm开发·spring boot·架构·区块链
Shylock_Mister15 小时前
ARM与x86交叉编译实战排错指南
linux·c语言·arm开发
ai_xiaogui1 天前
Mac苹果版Krita AI一键安装教程:AIStarter+ComfyUI零基础部署全流程(X86/ARM双架构)
arm开发·人工智能·macos·comfyui·一键部署·ai绘画教程·kritaai
brave and determined1 天前
可编程逻辑器件学习(day22):“让ARM穿上FPGA的马甲“:赛灵思Zynq的命名哲学与技术革命
arm开发·嵌入式硬件·fpga开发·zynq·fpga设计·嵌入式设计·fpga开发流程
wa的一声哭了2 天前
Linux服务器配置ssh免密登陆多台服务器、服务器别名配置
linux·运维·服务器·网络·arm开发·python·ssh
蓁蓁啊2 天前
ARM交叉编译中编译与链接参数不一致导致的问题
开发语言·arm开发·嵌入式硬件
青柚~3 天前
【鲲鹏服务器麒麟系统arm架构部署docker】
服务器·arm开发·docker·架构
应用市场3 天前
ARM编译器深度解析:从Keil到VSCode的STM32开发之
arm开发·vscode·stm32
代码AI弗森3 天前
为什么 AI 推理天然更偏向 ARM(而不是 x86)
arm开发·人工智能
亿道电子Emdoor4 天前
【Arm】Encountered an improper argument
arm开发·stm32·单片机