当前位置: 首页 > news >正文

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.alibcrypto.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_armMakefile_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)
网卡2NAT共享主机WiFi上网

📌 操作步骤

  1. 虚拟机 → 设置 → 网络适配器 → 桥接(绑定主机有线网卡)
  2. 添加第二块网卡 → 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. 平台操作

  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 + OpenSSLfile a.out 显示 ARM 架构
✅ 配置 Ubuntu 双网卡共享开发板 ping www.baidu.com 成功
✅ 开发板上传数据至 OneNETOneNET 控制台可见实时数据
✅ Web 浏览器查看数据无需上位机,直接网页访问

💡 经验总结

  • 网络调试需分层验证:物理 → IP → 路由 → DNS → 应用。
  • 交叉编译务必检查 编译器头文件路径库路径
  • OneNET 强制 TLS,OpenSSL 不可省略

“做技术,要么得到结果,要么得到经验——没有白干的事。”

http://www.dtcms.com/a/541448.html

相关文章:

  • 2024年 5月 每日分享
  • 漯河英文网站建设创建私人网站
  • 网站开发学哪一个好电子商务网站建设模板
  • 5.4 大数据方法论与实践指南-存储-安全合规
  • 凡科建设网站图片怎么删除专门做自由行的网站
  • 车辆智能检索与缉查布控
  • Cesium中如何修改geojson数据的颜色
  • 51c大模型~合集42
  • C++语法—类的声明和定义
  • 企业网站建设方案资讯查询公司的网站
  • 高端企业网站建设公司免费网站代理访问
  • JavaEE初阶——多线程(4)线程安全
  • 杭州网站推广营销服务深圳做美颜相机的公司
  • 什么样 个人网站 备案适合做网站的软件有哪些
  • 做设计在哪个网站上找高清图青岛做物流网站
  • 数据源切换的陷阱:Spring Boot中@Transactional与@DS注解的冲突博弈与破局之道
  • Kubernetes节点资源优化:自托管代理配置实践
  • 1688网站怎样做推广东莞市路桥收费所
  • 做网站需要用到哪些开发软件潜江资讯网信息发布
  • Day2实战-元组的基本操作
  • 01 数学建模中M的取值影响及分析
  • 深入 Actix-web 源码:解密 Rust Web 框架的高性能内核
  • Linux远程控制Windows桌面的cpolar实战指南
  • 焦作网站建设哪家好自己怎么用h5做网站
  • 论坛程序做导航网站photoshop安卓版
  • FP16 vs INT8:Llama-2-7b 昇腾 NPU 精度性能基准报告
  • Steering Llama 2 via Contrastive Activation Addition
  • 座舱出行Agent实战(三):专能化架构如何实现效率与稳定性的双重飞跃
  • 淘宝联盟怎么新建网站网站设计教程
  • 一篇文章深入理解Elasticsearch高级用法