7.0 KiB
7.0 KiB
Avaota F1 开发日志 - Day 2:网络模块与库依赖
版本:v1.0
日期:2024-11-24
主机环境:Ubuntu 24.04 LTS
目标平台:Avaota F1 (全志 V821 / 32-bit RISC-V)
第一部分:阶段 2 - 网络基础设施开发
1. UDP 通信模块(✅ 完成)
1.1 代码实现
创建了无外部依赖的 UDP 测试程序 test_udp_only.cpp:
- 使用 POSIX sockets(标准库,无需额外依赖)
- 可完全静态链接
- 发送 JSON 格式的模拟 IMU 数据
1.2 编译
使用定制的编译脚本 build_custom.sh:
# 32位 RISC-V 交叉编译器
~/ProgramFiles/avaota_sdk/tina-v821-release/out/toolchain/nds32le-linux-glibc-v5d/bin/riscv32-unknown-linux-g++
# 静态链接(关键)
-static test_udp_only.cpp -o test_udp
# 验证
file test_udp
# 输出:ELF 32-bit LSB executable, UCB RISC-V, ... statically linked
1.3 板端测试
# SD 卡部署
cp /mnt/extsd/test_udp /tmp/
chmod +x /tmp/test_udp
# 运行
/tmp/test_udp
测试结果:
- ✅ Socket 创建成功
- ✅ 服务器配置正确 (192.168.110.188:12345)
- ✅ 成功发送 5 个数据包 (每个 109 bytes)
- ✅ 验证了网络连接和 UDP 通信
2. 网络库依赖解决(✅ 完成)
2.1 问题:SSH 工具缺失
目标:启用 SSH 以便网络传输,避免频繁插拔 SD 卡。
尝试方案:
-
❌ OpenSSH - menuconfig 中可选,但编译失败
- 错误:
No rule to make target 'package/network/services/openssh/compile' - 原因:SDK 中无 openssh 包源码
- 错误:
-
❌ Dropbear - 在 menuconfig 菜单中不存在
- SDK feeds 未包含此包
解决方案:暂时保留 SD 卡传输方式,SSH 问题待后续解决
2.2 网络库编译
libuwsc (WebSocket 客户端):
# menuconfig 配置
Libraries --->
Networking --->
<*> libuwsc-nossl ...... A lightweight WebSocket client library
# 编译(全量编译)
make -j8
libcurl (HTTP 客户端):
# menuconfig 配置
Libraries --->
<*> libcurl .............. A client-side URL transfer library
# 自动编译(默认已选)
2.3 编译结果验证
# 检查 libuwsc (版本 3.3.4)
find ./out -name "libuwsc*.so*"
# 输出:./out/v821/avaota_f1/openwrt/staging_dir/target/usr/lib/libuwsc.so
# 检查 libcur
l (版本 4.7.0)
find ./out -name "libcurl*.so*"
# 输出:./out/v821/avaota_f1/openwrt/staging_dir/target/usr/lib/libcurl.so
# 头文件位置
# uwsc.h: ./out/v821/avaota_f1/openwrt/staging_dir/target/usr/include/uwsc/uwsc.h
# curl.h: ./out/v821/avaota_f1/openwrt/staging_dir/target/usr/include/curl/curl.h
第二部分:踩坑与解决方案
1. SDK 包管理问题
❌ 错误:feeds 包无法单独编译
现象:
make package/feeds/libs/libuwsc/compile V=s -j1
# 错误:No rule to make target 'package/feeds/libs/libuwsc/compile'
原因:
- Tina SDK 的 feeds 包路径与标准 OpenWrt 不同
- SDK 缺少
./scripts/feeds工具 - feeds 包通常需要通过全量编译
✅ 解决:
# 放弃单独编译,直接全量编译
make -j8
# 编译成功,所有选中的包都会被编译
2. 库选择问题
❌ 误区:libwebsockets vs libuwsc
背景:
- 最初计划使用
libwebsockets(标准 WebSocket 库) - 但 SDK 中只有
libuwsc(轻量级 WebSocket 客户端)
区别:
- libwebsockets:功能完整,体积大,API 复杂
- libuwsc:轻量级,适合嵌入式,API 简洁
- API 完全不兼容:需要重写代码
✅ 解决:
- 选择
libuwsc-nossl(无 SSL 依赖) - 后续需要重写 WebSocket 客户端代码以适配 libuwsc API
3. menuconfig 配置注意事项
⚠️ 注意:取消失败的包配置
编译某个包失败后,必须在 menuconfig 中取消其选择,否则后续编译会重复失败:
make menuconfig
# 取消所有 openssh-* 相关选项
# 保存退出
# 然后再编译其他包
make -j8
第三部分:项目状态总结
阶段 2 完成度:约 75%
✅ 已完成:
-
UDP 通信模块 - 100% 完成
- 代码实现
- 编译成功
- 板端测试通过
- 可用于 IMU 数据上报
-
网络库准备 - 100% 完成
- libuwsc (WebSocket) 编译成功
- libcurl (HTTP) 编译成功
- 头文件和库文件准备就绪
-
HTTP Client 代码 - 100% 完成
- 使用 libcurl API 实现
- 支持 chunked transfer encoding
- 代码无需修改
⚠️ 待完成:
-
WebSocket Client 代码适配 - 0% 完成
- 当前代码使用 libwebsockets API
- 需要重写为 libuwsc API
- 预计耗时 1-2 小时
-
完整网络测试 - 0% 完成
- WebSocket 视频/音频流测试
- HTTP 音频下行测试
- 与服务器联调
第四部分:关键经验与教训
1. 编译策略
❌ 错误做法:
- 尝试单独编译 feeds 包
- 使用错误的编译路径
✅ 正确做法:
- 在 menuconfig 中选择所需的包
- 使用
make -j8全量编译 - SDK 会自动处理所有依赖和路径
2. 库依赖选择
原则:
-
优先选择 无 SSL 版本(如 libuwsc-nossl)
- 依赖少,编译简单
- 内网开发不需要加密
-
检查库是否默认已选
- libcurl 在 SDK 中默认勾选
- 不要盲目取消默认配置
3. 开发部署流程
当前验证的工作流:
- PC 端编写代码
- 交叉编译(32位 RISC-V,静态链接)
- 复制到 SD 卡
- 板端:SD 卡 →
/tmp/→chmod +x→ 运行
后续优化方向:
- 启用 SSH/telnet,实现网络传输
- 减少 SD 卡插拔次数
第五部分:下一步计划
阶段 3:音频系统(Day 2-4)
优先级:高(核心功能)
任务清单:
- Device Tree 配置(启用 PDM 麦克风和 I2S 扬声器)
- ALSA 音频采集实现
- ALSA 音频播放实现
- 与网络模块集成测试
为何跳过 WebSocket 适配:
- UDP 已经可用,不阻塞 IMU 开发
- 音频系统是核心功能,优先级更高
- 网络库已准备好,随时可以回来适配
🏆 Day 2 成果
核心成就:
- ✅ 成功验证了 UDP 网络通信
- ✅ 编译完成所有必需的网络库
- ✅ 建立了完整的交叉编译到部署流程
- ✅ 掌握了 Tina SDK 的包管理机制
技术栈确认:
- UDP: POSIX sockets(已验证可用)
- WebSocket: libuwsc 3.3.4(库已准备,代码待适配)
- HTTP: libcurl 4.7.0(库和代码都已准备)
开发路径验证:
- 编写代码
- 32位交叉编译 + 静态链接
- SD 卡传输
- 板端
/tmp/运行
这套流程已经稳定可靠,可以继续用于后续开发!