在Android手机和车机连接投屏时,会用到AOA协议(Android Open Accessory Protocol)进行主从切换, 其中反控可以用该协议中HID实现,这个部分称为AAP HID(Android Accessory Protocol Human Interface Device),我们来看看具体是怎么工作的。
先看谷歌官网的介绍,源地址:Android Open Accessory Protocol 2.0,开始搬运。
与AOA1.0相比,在最新的2.0版本中增加的功能:
- 从Android设备到外设的音频输出
- 外部设备可以作为Android设备的一个或多个HID设备
什么是外设?
- Windows电脑是主设备/Host,通过USB连接的鼠盘、键盘、U盘,游戏控制手柄和打印机等是外部设备。
- 车机里中控系统是主设备,但是和手机连接投屏时进行了主从切换,所以今天聊的HID场景里,手机是主设备,车机反而成了外部设备,结合AAP HID的功能,车机的反控行为和鼠标类似。
什么是HID设备?
- 顾名思义,与电脑连接并实现人机交互功能的设备,如鼠标键盘等。
AOA 2.0中的HID支持只是对标准HID事件的一个代理。该实现对事件的内容或类型没有任何假设,只是将其传递到输入系统Input System,因此AOA 2.0外设可以充当任何HID设备(鼠标、键盘、游戏控制器等)。它可以用于简单的东西,比如媒体底座上的播放/暂停按钮,或者复杂的鼠标和全标准键盘(QWERTY)的对接站。
AOA 2.0协议增加了四个新的USB控制请求,允许外设作为一个或多个HID输入设备连接到安卓设备。由于HID支持完全通过endpoint0的控制请求来完成,因此不需要新的USB接口来提供这种支持。控制请求如下:
- ACCESSORY_REGISTER_HID 在安卓设备上注册了一个新的HID设备。该外设提供了一个ID用于识别其他三个请求,在USB断开连接或外设发送ACCESSORY_UNREGISTER_HID注销HID设备之前,此ID一直有效
- ACCESSORY_UNREGISTER_HID 注销以注册的HID设备
- ACCESSORY_SET_HID_REPORT_DESC 向Android设备发送一个HID设备的报告描述符。此请求用于描述HID设备的功能,并且必须在向Android设备报告任何HID事件之前发送。如果报表描述符大于endpoint0的最大数据值,则会发送多个ACCESSORY_SET_HID_REPORT_DESC命令,以传输整个描述符。
- ACCESSORY_SEND_HID_EVENT 将输入事件从外设发送到Android设备。
这些新的控件请求的代码定义如下:
/* Control request for registering a HID device.
* Upon registering, a unique ID is sent by the accessory in the
* value parameter. This ID will be used for future commands for
* the device
*
* requestType: USB_DIR_OUT | USB_TYPE_VENDOR
* request: ACCESSORY_REGISTER_HID_DEVICE
* value: Accessory assigned ID for the HID device
* index: total length of the HID report descriptor
* data none
*/
#define ACCESSORY_REGISTER_HID 54
/* Control request for unregistering a HID device.
*
* requestType: USB_DIR_OUT | USB_TYPE_VENDOR
* request: ACCESSORY_REGISTER_HID
* value: Accessory assigned ID for the HID device
* index: 0
* data none
*/
#define ACCESSORY_UNREGISTER_HID 55
/* Control request for sending the HID report descriptor.
* If the HID descriptor is longer than the endpoint zero max packet size,
* the descriptor will be sent in multiple ACCESSORY_SET_HID_REPORT_DESC
* commands. The data for the descriptor must be sent sequentially
* if multiple packets are needed.
*
* requestType: USB_DIR_OUT | USB_TYPE_VENDOR
* request: ACCESSORY_SET_HID_REPORT_DESC
* value: Accessory assigned ID for the HID device
* index: offset of data in descriptor
* (needed when HID descriptor is too big for one packet)
* data the HID report descriptor
*/
#define ACCESSORY_SET_HID_REPORT_DESC 56
/* Control request for sending HID events.
*
* requestType: USB_DIR_OUT | USB_TYPE_VENDOR
* request: ACCESSORY_SEND_HID_EVENT
* value: Accessory assigned ID for the HID device
* index: 0
* data the HID report for the event
*/
#define ACCESSORY_SEND_HID_EVENT 57