AOA协议格式
2025-03-17
2
0
Android Open Accessory (AOA) 协议格式详解
一、协议版本对照
协议版本 | Android 版本支持 | 核心特性 |
---|---|---|
AOA 1.0 | Android 2.3.4+ | 基础配件模式、音频流支持 |
AOA 2.0 | Android 4.1+ | 新增 HID 设备支持、ADB 调试通道 |
二、核心控制请求(Control Requests)
GET_PROTOCOL)" class="reference-link">1. 协议版本查询 (GET_PROTOCOL
)
- 请求方向:Device → Host
- bmRequestType: 0xC0 (IN方向,Vendor类型)
- bRequest: 51 (0x33)
- wValue: 0
- wIndex: 0
- wLength: 2
- 返回数据:协议版本号(小端格式,如 0x0100 表示 AOA 1.0)
2. 字符串描述符传递 (SEND_STRING)
- 请求方向:Host → Device
- bmRequestType: 0x40 (OUT方向,Vendor类型)
- bRequest: 52 (0x34)
- wValue: 语言ID(如 0x0409=英语)
- wIndex: 字符串类型:
- 0 = 厂商名
- 1 = 型号名
- 2 = 描述信息
- 3 = 版本号
- 4 = URI
- 5 = 序列号
- wLength: 字符串长度(ASCII编码)
- 数据负载:UTF-8 字符串(不含终止符)
3. 启动配件模式 (START)
- 请求方向:Host → Device
- bmRequestType: 0x40 (OUT方向,Vendor类型)
- bRequest: 53 (0x35)
- wValue: 0
- wIndex: 0
- wLength: 0
- 触发动作:Android 设备重启并进入配件模式
三、通信流程
- participant 配件 as USB Host
- participant 手机 as Android Device
- 配件->>手机: GET_PROTOCOL 请求
- 手机—>>配件: 返回协议版本号 (如 0x0200)
- 配件->>手机: SEND_STRING (厂商/型号等)
- 配件->>手机: START 请求
- Note over 手机: 重新枚举为 USB Accessory
- 手机—>>配件: 发送新设备描述符
- 配件->>手机: 批量传输通道建立
四、设备枚举描述符
- 设备描述符(进入配件模式后)
struct usb_device_descriptor { idVendor: 0x18D1 // Google 的固定 VID idProduct: 0x2D00 // 基础配件模式 PID // 0x2D01: ADB 模式 // 0x2D02: 音频模式 bcdDevice: 0x0100 // 设备版本号 }
- 端点描述符(批量传输)
struct usb_endpoint_descriptor { bEndpointAddress: 0x81 // IN 端点 (设备到主机) bmAttributes: 0x02 // 批量传输类型 wMaxPacketSize: 512 // 最大数据包大小 }
五、数据包结构示例
控制传输数据帧(协议查询)
/* Host Request */
80 06 00 01 00 00 12 00
/* Device Response (AOA 2.0) */
12 01 00 02 00 00 00 40 D1 18 00 2D 00 01 01 02 00 01
批量传输数据包
/* Android → 配件 */
55 53 42 43 // "USBC" 头标识
00 00 00 00 // 序列号
00 00 00 80 // 数据长度 (128 bytes)
[实际数据载荷...]
六、实现参考代码
配件端协议检测(C 伪代码)
// 检测 AOA 协议支持
uint16_t protocol_version;
usb_control_transfer(dev_handle,
USB_ENDPOINT_IN | USB_TYPE_VENDOR,
51, 0, 0, (char*)&protocol_version, 2, 1000);
if (protocol_version >= 0x200) {
// 支持 AOA 2.0
enable_adb_channel();
}
七、注意事项
电源要求
配件需提供 5V/500mA 以上供电能力,高功耗设备建议配置独立电源协议超时
控制请求需在 1000ms 内完成响应,否则可能触发设备断开枚举重试
发送 START 命令后,需等待 2-5 秒让 Android 设备重新枚举调试技巧
使用 adb logcat | grep Usb 可实时查看 USB 配件模式日志