这是一个用于读取 DJI Virtual Joystick (VID: 0x2CA3, PID: 0x1501) USB HID 数据的 Android 应用程序。该程序直接通过 Android USB Host API 读取设备数据,无需使用 DJI SDK。
- ✅ 自动查找 DJI Virtual Joystick 设备
- ✅ 请求和管理 USB 权限
- ✅ 实时读取 USB HID 数据
- ✅ 显示设备信息
- ✅ 数据日志记录(HEX 和 ASCII 格式)
- ✅ 数据包计数统计
- ✅ 完整的 UI 调试界面
app/src/main/java/com/example/usb_tesy_dji__joy/
├── MainActivity.kt # 主 Activity,处理 USB 设备附件事件
├── MainViewModel.kt # ViewModel,管理 UI 状态
├── UsbHidManager.kt # USB HID 管理器,处理设备连接和数据读取
├── UsbHidScreen.kt # Compose UI 界面
└── ui/theme/ # Material3 主题配置
- 将 DJI Virtual Joystick 连接到 Android 设备
- 应用会自动检测到 USB 设备附件事件
- 点击"查找设备"按钮查找设备
- 点击"请求权限"按钮获取 USB 访问权限
- 设备连接成功后,点击"开始读取"按钮
- 应用会开始读取 USB HID 数据
- 数据会以 HEX 和 ASCII 格式显示在日志区域
点击"停止读取"按钮停止数据读取
点击任意按钮会更新设备信息显示,包括:
- 设备名称
- Vendor ID (VID)
- Product ID (PID)
- 接口数量
应用会在 Logcat 中输出详细的调试日志:
adb logcat | grep UsbHidManager关键日志标签:
UsbHidManager: USB 设备管理日志MainViewModel: UI 状态管理日志
- 使用
UsbManager查找和管理 USB 设备 - 使用
UsbDeviceConnection建立设备连接 - 使用
bulkTransfer()读取 USB 数据
- MVVM 架构(Model-View-ViewModel)
- Jetpack Compose UI
- Kotlin Coroutines 异步处理
- StateFlow 状态管理
// DJI Virtual Joystick
const val DJI_VID = 0x2CA3 // Vendor ID
const val DJI_PID = 0x1501 // Product ID应用需要以下权限:
<uses-feature
android:name="android.hardware.usb.host"
android:required="false" />应用会在运行时请求 USB 设备访问权限。
读取的数据会显示为:
- HEX 格式: 字节值的十六进制表示
- ASCII 格式: 可打印字符表示(不可打印字符显示为
.)
示例输出:
HEX: 01 02 03 04 05 06 07 08
ASCII: ........
应用提供了原始 USB 数据的读取功能。要解析 DJI Virtual Joystick 的协议格式,需要:
- 收集足够的 USB 数据样本
- 操作摇杆/按键,观察数据变化
- 逆向分析协议格式
- 在
UsbHidManager.kt中添加协议解析代码
文档参考:USB_HID_Direct_Read_Analysis.md
- 确认 DJI Virtual Joystick 已正确连接
- 检查设备 VID/PID 是否为 0x2CA3:0x1501
- 查看 Logcat 日志确认 USB 设备枚举
- 确认应用有 USB Host 权限
- 在设置中手动授予应用 USB 设备访问权限
- 检查 USB 设备过滤器配置是否正确
- 确认设备已成功连接
- 检查端点配置是否正确
- 查看 Logcat 中的错误日志
- Android Studio Hedgehog | 2023.1.1 或更高版本
- Android Gradle Plugin 9.0.0
- Kotlin 2.0.21
- minimum SDK: 24 (Android 7.0)
- target SDK: 36
- 协议逆向分析: 收集数据并分析 DJI 协议格式
- 按键映射: 将 USB 数据映射到具体的按键/摇杆
- 事件处理: 实现按键和摇杆事件的回调
- 数据可视化: 添加摇杆数据可视化界面
本项目仅供学习和研究使用。