软件设计方案

1. 系统整体架构

1.1 分层架构

系统采用分层设计,从上到下依次为:

  • 应用层 (Application):提供用户接口,通过 Android API 与透传服务交互。

  • Android Framework & JNI:封装 Native 服务接口,桥接应用层与 Native 层。

  • Native Service (C++):核心透传服务,负责数据路由、设备管理和通信逻辑。

  • HAL层 (硬件抽象层):封装 RTL8822 WiFi 模块的操作,屏蔽底层硬件差异。

  • Linux Kernel Driver (RTL8822):基于 RTL8822 驱动,提供 USB WiFi 设备支持。

  • 硬件层 (RK3568):运行在 RK3568 平台,集成 USB WiFi 模块。

PlantUML 分层架构图:

image.png

1.2 核心模块设计

A端架构 (STA模式)

  • 功能:A端作为 WiFi 客户端(STA模式),通过串口或 APP 接收数据,聚合后通过 USB 控制 RTL8822 模块发送到 B端;同时接收 B端数据,分发到串口或 APP。

  • 数据流

  • 输入:外部设备通过串口发送数据,或 APP 直接发送数据。

  • 处理:数据聚合器封装数据,USB 控制模块通过 RTL8822 (STA) 发送。

  • 输出:接收到的数据经数据分发器分发到串口或推送至 APP。

PlantUML A端数据流图:

image.png

B端架构 (AP模式)

  • 功能:B端作为 WiFi 接入点(AP模式),通过以太网接收网络客户端数据,发送到 A端;接收 A端数据后转发到网络客户端。

  • 数据流

  • 输入:网络客户端通过以太网发送数据到 TCP 服务器。

  • 处理:TCP 服务器处理数据,USB 控制模块通过 RTL8822 (AP) 发送。

  • 输出:接收到的数据经网络转发器发送到 TCP 客户端。

PlantUML B端数据流图:

image.png

2. 详细技术实现方案

2.1 驱动层实现

2.1.1 RTL8822 驱动集成

  • 内核模块编译

  • 修改 Makefile 适配 Android 内核版本。

  • 配置 Kconfig 启用 USB 接口支持。

  • 编译生成 rtl8822cu.ko 内核模块,加载到系统。

  • USB 设备识别

  • include/autoconf.h 中配置 RTL8822 参数。

  • os_dep/linux/usb_intf.c 中添加设备 Vendor ID 和 Product ID。

  • 确保系统正确识别两个 USB WiFi 设备(A端 STA 模式,B端 AP 模式)。

  • 权限配置

  • system/etc/permissions 中添加 USB 主机功能权限。

  • 声明 android.hardware.usb.hostandroid.permission.USB_PERMISSION

2.1.2 HAL 层封装

  • 功能:定义标准接口,封装 RTL8822 模块的初始化、数据收发和网络配置功能。

  • 接口描述

  • 初始化 WiFi 模块,指定设备 ID 和模式(STA 或 AP)。

  • 发送数据接口,将数据通过 USB 传输到 WiFi 模块。

  • 注册数据接收回调,处理接收到的数据。

  • 配置网络参数,如 SSID、密码等。

2.2 Native Service 实现

2.2.1 核心透传服务

  • 功能:管理 WiFi、串口和网络模块,协调数据路由。

  • 组件

  • WiFi Manager:管理 USB WiFi 设备,处理设备初始化和模式切换。

  • Serial Manager(A端):处理串口数据读写。

  • Network Manager(B端):处理 TCP 网络数据。

  • Data Router:根据数据来源和目标进行路由。

2.2.2 数据路由引擎

  • 功能

  • A端:将串口或 APP 数据封装后通过 STA 模式发送;接收数据后分发到串口或 APP。

  • B端:将网络数据封装后通过 AP 模式发送;接收数据后转发到网络客户端。

  • 实现要点

  • 数据包封装/解封装,包含头部信息(如序列号、类型)。

  • 使用 CRC32 校验确保数据完整性。

  • 支持重传机制处理丢包。

2.2.3 USB 通信管理

  • 功能

  • 枚举 USB 设备,初始化 RTL8822 模块。

  • 管理 STA 和 AP 模式的设备,处理数据收发。

  • 支持动态模式切换(STA ↔ AP)。

  • 实现要点

  • 维护设备列表,记录设备文件描述符和模式。

  • 使用异步 I/O 避免阻塞。

  • 实现设备互斥锁,防止并发访问冲突。

2.3 Framework 层实现

2.3.1 Android Service

  • 功能:作为系统服务运行,桥接 Native 层和应用层。

  • 实现要点

  • 通过 Binder 机制与 Native 服务通信。

  • 提供数据发送和回调注册接口。

  • 确保服务在系统启动时自动运行。

2.3.2 应用接口 API

  • 功能:为应用层提供简洁的 API,屏蔽底层复杂性。

  • 接口描述

  • sendData(byte[] data):发送数据到透传服务。

  • registerCallback(WifiTransparentCallback callback):注册数据接收回调。

2.4 系统集成配置

2.4.1 系统启动配置

  • 定义 init.rc 文件,启动 WiFi 透传服务。

  • 设置服务运行用户和权限(system, net_admin, net_raw, wifi)。

2.4.2 SELinux 权限配置

  • 定义 wifi_transparent 域,允许访问 USB 设备和网络套接字。

  • 配置 chr_fileusb_device 的读写权限。

2.4.3 网络路由配置

  • 功能:隔离 WiFi 和以太网流量,避免冲突。

  • 实现

  • 创建独立路由表(table 100 用于 WiFi,table 101 用于以太网)。

  • 使用 ip rule 配置策略路由,确保流量正确分发。


3. 开发流程和里程碑

  1. 基础驱动适配
  • 完成 RTL8822 驱动编译和内核集成。

  • 实现 USB 设备枚举和通信。

  • 验证设备模式切换(STA/AP)。

  1. HAL 和 Native Service
  • 开发 HAL 层接口。

  • 实现核心透传服务和 USB 通信管理。

  • 开发数据路由引擎。

  1. Framework 集成
  • 实现 Android 系统服务。

  • 封装应用层 API。

  • 配置系统权限和 SELinux 策略。

  1. 系统集成和优化
  • 实现后台保活机制。

  • 添加异常恢复逻辑。

  • 优化性能和网络路由。


4. 关键技术挑战及解决方案

  1. USB 设备并发访问
  • 挑战:两个 RTL8822 设备同时操作可能导致冲突。

  • 解决方案

  • 使用设备队列管理 USB 操作。

  • 实现互斥锁机制。

  • 采用异步 I/O 避免阻塞。

  1. 网络接口冲突
  • 挑战:WiFi 和以太网流量可能混淆。

  • 解决方案

  • 配置策略路由表分离流量。

  • 使用 iptables 管理流量规则。

  • 启用网络命名空间隔离。

  1. 后台保活
  • 挑战:Android 11 以上版本对后台服务限制严格。

  • 解决方案

  • 注册为系统级服务。

  • 实现 Native 守护进程。

  • 备选方案:使用 WakeLock 或前台服务。

  1. 数据完整性
  • 挑战:无线传输可能出现丢包或乱序。

  • 解决方案

  • 应用层添加序列号管理。

  • 使用 CRC32 校验数据。

  • 实现重传机制。

  • 优化缓冲区管理。


5. 总结

该方案基于 RK3568 平台和 RTL8822 WiFi 模块,实现了一个高效、模块化的 WiFi 透传系统。关键特点包括:

  • 简洁高效:聚焦核心功能,避免复杂设计。

  • 模块化:分层架构便于维护和扩展。

  • Android 原生集成:利用标准 Android 服务框架。

  • 稳定可靠:包含错误恢复和数据校验机制。

PlantUML 系统交互总览图:

image.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容