Files
Docs/DevLogs/Day2.md
2025-12-31 16:18:28 +08:00

7.0 KiB
Raw Blame History

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 卡。

尝试方案

  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 客户端)

# 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%

已完成

  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/ 运行

这套流程已经稳定可靠,可以继续用于后续开发!