Files
Docs/DevLogs/Day02.md
2026-01-05 18:06:08 +08:00

292 lines
7.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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/` 运行
这套流程已经**稳定可靠**,可以继续用于后续开发!