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 分层架构图:
1.2 核心模块设计
A端架构 (STA模式)
功能:A端作为 WiFi 客户端(STA模式),通过串口或 APP 接收数据,聚合后通过 USB 控制 RTL8822 模块发送到 B端;同时接收 B端数据,分发到串口或 APP。
数据流:
输入:外部设备通过串口发送数据,或 APP 直接发送数据。
处理:数据聚合器封装数据,USB 控制模块通过 RTL8822 (STA) 发送。
输出:接收到的数据经数据分发器分发到串口或推送至 APP。
PlantUML A端数据流图:
B端架构 (AP模式)
功能:B端作为 WiFi 接入点(AP模式),通过以太网接收网络客户端数据,发送到 A端;接收 A端数据后转发到网络客户端。
数据流:
输入:网络客户端通过以太网发送数据到 TCP 服务器。
处理:TCP 服务器处理数据,USB 控制模块通过 RTL8822 (AP) 发送。
输出:接收到的数据经网络转发器发送到 TCP 客户端。
PlantUML B端数据流图:
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.host
和android.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_file
和usb_device
的读写权限。
2.4.3 网络路由配置
功能:隔离 WiFi 和以太网流量,避免冲突。
实现:
创建独立路由表(
table 100
用于 WiFi,table 101
用于以太网)。使用
ip rule
配置策略路由,确保流量正确分发。
3. 开发流程和里程碑
- 基础驱动适配:
完成 RTL8822 驱动编译和内核集成。
实现 USB 设备枚举和通信。
验证设备模式切换(STA/AP)。
- HAL 和 Native Service:
开发 HAL 层接口。
实现核心透传服务和 USB 通信管理。
开发数据路由引擎。
- Framework 集成:
实现 Android 系统服务。
封装应用层 API。
配置系统权限和 SELinux 策略。
- 系统集成和优化:
实现后台保活机制。
添加异常恢复逻辑。
优化性能和网络路由。
4. 关键技术挑战及解决方案
- USB 设备并发访问:
挑战:两个 RTL8822 设备同时操作可能导致冲突。
解决方案:
使用设备队列管理 USB 操作。
实现互斥锁机制。
采用异步 I/O 避免阻塞。
- 网络接口冲突:
挑战:WiFi 和以太网流量可能混淆。
解决方案:
配置策略路由表分离流量。
使用 iptables 管理流量规则。
启用网络命名空间隔离。
- 后台保活:
挑战:Android 11 以上版本对后台服务限制严格。
解决方案:
注册为系统级服务。
实现 Native 守护进程。
备选方案:使用 WakeLock 或前台服务。
- 数据完整性:
挑战:无线传输可能出现丢包或乱序。
解决方案:
应用层添加序列号管理。
使用 CRC32 校验数据。
实现重传机制。
优化缓冲区管理。
5. 总结
该方案基于 RK3568 平台和 RTL8822 WiFi 模块,实现了一个高效、模块化的 WiFi 透传系统。关键特点包括:
简洁高效:聚焦核心功能,避免复杂设计。
模块化:分层架构便于维护和扩展。
Android 原生集成:利用标准 Android 服务框架。
稳定可靠:包含错误恢复和数据校验机制。
PlantUML 系统交互总览图: