292 lines
7.0 KiB
Markdown
292 lines
7.0 KiB
Markdown
# 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/` 运行
|
||
|
||
这套流程已经**稳定可靠**,可以继续用于后续开发!
|