# 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`: ```bash # 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 板端测试 ```bash # 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 卡。 **尝试方案**: 1. ❌ OpenSSH - menuconfig 中可选,但编译失败 - 错误:`No rule to make target 'package/network/services/openssh/compile'` - 原因:SDK 中无 openssh 包源码 2. ❌ Dropbear - 在 menuconfig 菜单中不存在 - SDK feeds 未包含此包 **解决方案**:暂时保留 SD 卡传输方式,SSH 问题待后续解决 #### 2.2 网络库编译 **libuwsc (WebSocket 客户端)**: ```bash # menuconfig 配置 Libraries ---> Networking ---> <*> libuwsc-nossl ...... A lightweight WebSocket client library # 编译(全量编译) make -j8 ``` **libcurl (HTTP 客户端)**: ```bash # menuconfig 配置 Libraries ---> <*> libcurl .............. A client-side URL transfer library # 自动编译(默认已选) ``` #### 2.3 编译结果验证 ```bash # 检查 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 包无法单独编译 **现象**: ```bash 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 包通常需要通过全量编译 **✅ 解决**: ```bash # 放弃单独编译,直接全量编译 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 中**取消其选择**,否则后续编译会重复失败: ```bash make menuconfig # 取消所有 openssh-* 相关选项 # 保存退出 # 然后再编译其他包 make -j8 ``` --- ## 第三部分:项目状态总结 ### 阶段 2 完成度:约 75% **✅ 已完成**: 1. UDP 通信模块 - **100% 完成** - 代码实现 - 编译成功 - 板端测试通过 - 可用于 IMU 数据上报 2. 网络库准备 - **100% 完成** - libuwsc (WebSocket) 编译成功 - libcurl (HTTP) 编译成功 - 头文件和库文件准备就绪 3. HTTP Client 代码 - **100% 完成** - 使用 libcurl API 实现 - 支持 chunked transfer encoding - 代码无需修改 **⚠️ 待完成**: 1. WebSocket Client 代码适配 - **0% 完成** - 当前代码使用 libwebsockets API - 需要重写为 libuwsc API - 预计耗时 1-2 小时 2. 完整网络测试 - **0% 完成** - WebSocket 视频/音频流测试 - HTTP 音频下行测试 - 与服务器联调 --- ## 第四部分:关键经验与教训 ### 1. 编译策略 **❌ 错误做法**: - 尝试单独编译 feeds 包 - 使用错误的编译路径 **✅ 正确做法**: - 在 menuconfig 中选择所需的包 - 使用 `make -j8` 全量编译 - SDK 会自动处理所有依赖和路径 --- ### 2. 库依赖选择 **原则**: - 优先选择 **无 SSL 版本**(如 libuwsc-nossl) - 依赖少,编译简单 - 内网开发不需要加密 - 检查库是否**默认已选** - libcurl 在 SDK 中默认勾选 - 不要盲目取消默认配置 --- ### 3. 开发部署流程 **当前验证的工作流**: 1. PC 端编写代码 2. 交叉编译(32位 RISC-V,静态链接) 3. 复制到 SD 卡 4. 板端:SD 卡 → `/tmp/` → `chmod +x` → 运行 **后续优化方向**: - 启用 SSH/telnet,实现网络传输 - 减少 SD 卡插拔次数 --- ## 第五部分:下一步计划 ### 阶段 3:音频系统(Day 2-4) **优先级**:高(核心功能) **任务清单**: 1. Device Tree 配置(启用 PDM 麦克风和 I2S 扬声器) 2. ALSA 音频采集实现 3. ALSA 音频播放实现 4. 与网络模块集成测试 **为何跳过 WebSocket 适配**: - UDP 已经可用,不阻塞 IMU 开发 - 音频系统是核心功能,优先级更高 - 网络库已准备好,随时可以回来适配 --- ## 🏆 Day 2 成果 **核心成就**: 1. ✅ 成功验证了 UDP 网络通信 2. ✅ 编译完成所有必需的网络库 3. ✅ 建立了完整的交叉编译到部署流程 4. ✅ 掌握了 Tina SDK 的包管理机制 **技术栈确认**: - **UDP**: POSIX sockets(已验证可用) - **WebSocket**: libuwsc 3.3.4(库已准备,代码待适配) - **HTTP**: libcurl 4.7.0(库和代码都已准备) **开发路径验证**: 1. 编写代码 2. 32位交叉编译 + 静态链接 3. SD 卡传输 4. 板端 `/tmp/` 运行 这套流程已经**稳定可靠**,可以继续用于后续开发!