Android 开放配件 (AOA)调试

车载导航的开发中,有可能需要开发支持Android CarLife或者Android Weblink等功能,而这些功能需要使用AOA协议的支持。因此,下面的文章将简单介绍AOA的相关知识。

简介

Google 官方AOA 的定义:
https://source.android.com/accessories/protocol.html

Google 官方提供了 adk2012 开发套件(包含 Android 端和 Accessory 端的源码,Accessory 的参考设计为 Arduino 平台):
http://developer.android.com/tools/adk/index.html

1、AOA(Android Open Accessory Protocol):Android 开放配件,该协议指定了配件如何通过 USB 与 Android 设备建立通信。由于 Android 设备的输出功率较低,因此 AOA 需要配件充当 USB 主机,这意味着连接的配件必须为总线供电。

2、Android USB 配件:专门用于和 Android 设备相连。这些配件遵循 AOA 要求,从而能够检测到支持配件模式的 Android 设备,并且必须提供 500 毫安(电压为 5 伏)的充电电流。具有实现 USB EH 功能和 AOA 协议的微处理器以及包括 USB 接口在内的输入/输出接口。这里可以理解为车载导航。

3、Android 设备:Android手机,通过USB连接至Android USB 配件(车载导航)。


配件与Android设备握手过程

关于这部分的内容,可以详细参照:https://source.android.com/devices/accessories/aoa?hl=zh-cn

  • 等待设备连接并对其进行检测。
  • 确定设备是否支持配件模式。
  • 尝试以配件模式启动设备(如需要)。
  • 如果设备支持 AOA,则与该设备建立通信。

无论是AOAv1还是AOAv2,握手阶段都需要走这个流程。

Android 开放配件 (AOA)调试_第1张图片


AOAv2

AOAv2 增加了以下功能,向下兼容AOAv1。

  • 音频输出(从 Android 设备到配件)。
  • 支持配件充当 Android 设备的一个或多个人机接口设备 (HID)。

如果想要使用音频输出的功能,需要发送音频支持的command 58.

AOAv1和AOAv2所支持功能对比如下:
Android 开放配件 (AOA)调试_第2张图片

这部分的内容请参照:https://source.android.com/devices/accessories/aoa2?hl=zh-cn

In other words, this interface is applicable for Android OS version 2.3.4 or later (or version 3.1 or later for tablets). AOA version 2.0 can be used for devices that run on Android OS version 4.1 or later.


linux-adk 的使用

在github上有一开源程序,用于将运行Linux机器转变为Android配件。正是有这个程序,我们可以在自己的ubuntu系统构建成为一个Android配件,并与Android设备通信。下载地址为:https://github.com/gibsson/linux-adk

This software aims to turn your GNU/Linux machine into an Android Accessory.
It initializes any Android device connected via USB。

注意,这个程序需要用到libusb和libsound的库。


使用帮助

按照网站上的要求进行make之后,会生成linux-adk可执行文件。查看使用帮助命令:#./linux-adk –help

Linux Accessory Development Kit

usage: ./linux-adk [OPTIONS]
OPTIONS:
    -d, --device
        USB device product and vendor IDs. Default is "18d1:4e42" (Nexus7).
    -D, --description
        accessory description. Default is "Demo ABS2013".
    -m, --manufacturer
        manufacturer's name. Default is "Google, Inc.".
    -M, --model
        model's name. Default is "DemoKit".
    -n, --vernumber
        accessory version number. Default is "1.0".
    -N, --no_app
        option that allows to connect without an Android App (AOA v2.0 only, for Audio and HID).
    -s, --serial
        serial numder. Default is "007".
    -u, --url
        accessory url. Default is "https://github.com/gibsson".
    -v, --version
        Show program version and exit.
    -h, --help
        Show this help and exit.

指定要与哪个Android设备进行AOA通信的参数。


使用范例

假设我有一个Android手机,想要在我的ubuntu系统上与其进行AOA通信。那么我可以用linux-adk这个程序。
将Android手机插入ubuntu系统上,查看pid和vid:#lsusb

Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 0403:6015 Future Technology Devices International, Ltd Bridge(I2C/SPI/UART/FIFO)
Bus 001 Device 005: ID 04e8:6860 Samsung Electronics Co., Ltd Galaxy (MTP)
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

很明显,我这是一台Samsung手机,VID:PID为04e8:6860。

将手机切换Accessory Mode #./linux-adk -d "04e8:6860"

Looking for device 04e8:6860
Device supports AOA 2.0!
Sending identification to the device
 sending manufacturer: Google, Inc.
 sending model: DemoKit
 sending description: Demo ABS2013
 sending version: 2.0
 sending url: https://github.com/gibsson
 sending serial number: 0000000012345678
 asking for audio support
Turning the device in Accessory mode
Found accessory 18d1:2d05
Device should now be recognized as valid ALSA card...
  => arecord -l

这个就表示已经切换Accessory Mode成功了,并且我们还知道这台Android手机支持AOAv2,而且还有USB Audio功能。手机侧会弹出如下提示信息:
Android 开放配件 (AOA)调试_第3张图片

当再次#lsusb,可以看到18d1:2d05的Android AOA设备。

Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 0403:6015 Future Technology Devices International, Ltd Bridge(I2C/SPI/UART/FIFO)
Bus 001 Device 006: ID 18d1:2d05 Google Inc. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

切换Accessory Mode失败

在开发过程中发现,如果一台Android手机经常连续切换Accessory Mode,后面当想要再次切换Accessory Mode就会失败,此时可以通过linux-adk来进行判断。一般出现这种情况,重启Android手机即可恢复。

你可能感兴趣的:(USB)