外围硬件和Android手机通过AOA协议进行数据传输的实现方法

Android手机USB角色有两种,

一是做Host,驱动外面的硬件设备,对外供电;
一是做device,被外部设备充电,同时可以利用AOA(Android Open Accessory)协议与外面设备进行数据交互。

在数据通信的过程中,外部硬件通过libusb库,首先获得USB连接中的一些配置元数据,包括接口类型(UsbInterface),端点信息(UsbEndpoint)等,和对应的bulk endpoints进行之后的通信过程。进而利用提供的libusb_control_transfer和libusb_bulk_transfer接口进行数据的传输,其中,libusb_control_transfer用于传输一些指令数据,而libusb_bulk_transfer用于传输一些比较大的数据,比如音频数据,图像数据等; 而安卓手机则通过Android USBManager提供的openAccessory接口获得一个文件描述符,然后通过其对应的FileInputStream和FileOutputStream进行数据的读写:

ParcelFileDescriptor mFD = mUSBManager.openAccessory(acc);
if (mFD != null) {
FileDescripter fd = mFD.getFileDescriptor();
mIS = new FileInputStream(fd); // use this to receive messages
mOS = new FileOutputStream(fd); // use this to send commands
}