本文主要是介绍Android Open Accessory 协议分析与开发,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1. 背景介绍
2011年Google推出Android开放配件协议AOA(Android Open Accessory Protocol)及配件开发工具包ADK(Accessory Development Kit)。当时开源硬件和硬件创业都比较热,其中以Arduino平台为代表。Google想借着这个硬件平台开拓智能家具的市场,借此推出了AOA协议和对应的开发平台,以便打通Android手机和周边硬件的连接通道,从而扩大Android的生态链。2012年Google推出了2.0版本的协议,增加了音频相关的支持,随后没有进一步的更新。从目前的状况看,这个协议并没有被广泛的认可和使用。最近的消息是2014年Google发布的Android Auto基于该协议构建了Android Auto Porotocol,Google未来可能会将其作为Android系统与周边硬件进行USB连接的基础协议。
更多背景资料请参考Google 2011 I/O大会视频, 其中36分后开始介绍AOA。下面主要针对AOA协议及其开发进行分析和介绍。
2. 协议分析
2.1 Android 系统与配件的连接方式
Android系统官方定义了两种连接配件的方式:蓝牙和USB,未来可能提供WiFi的连接方式。
蓝牙连接
Android系统定义的连接配件协议是SSP/A2DP,这些都是很成熟的协议,其优点很明显——开发资源丰富,协议稳定,并且蓝牙本身是无线连接,使用方便,尽管覆盖距离没有手机信号覆盖范围大,但已能够满足日常所需。缺点主要是传输带宽有限,特别是给配件传输高保真音频基本是不可能的。另外一个问题是耗电,不过随着低功耗蓝牙协议的推出这个问题已经得到解决。
USB连接
相较蓝牙连接,USB连接本身具有传输稳定、带宽高、持续供电的优点,不过其缺点也比较突出,通讯距离比较短,有线连接对于遥控设备不是很方便。至于连接协议,Google并没有借用现有的USB协议,而是另起炉灶定义了自己的协议—— AOA(Android Open Accessory Protocol),其中的缘由已经不得而知。说句题外话,Android Auto正是看到USB连接的优点比较适合手机与车机连接的,在第一版的Android Auto中选择了这种连接方式。
WiFi连接
这种连接方式可以解决蓝牙带宽不足的问题,又可以提供较好的覆盖范围,不过Google目前还没有公开支持。只是从Android Auto的发布会视频中得知未来可能会使用WiFi-Direct协议,车内互联是现在可以看得到的应用场景。
2.2 USB通讯模式
这里主要讨论的USB通讯模式包括:USB Slave模式,USB Host模式(例如OTG),USB 配件模式(例如AOA)
USB Slave模式
这种模式通常应用于PC与Android手机连接,PC端作为服务的提供方,主要完成设备枚举,搜索相关驱动并完成安装,建立数据通路等工作。该模式下PC对Android手机供电。
USB Host模式
这种模式通常应用于Android手机以OTG连接的方式连接外设,比如:键盘,鼠标等。Android手机端是简化版的USB host端 ———— USB Embedded Host。它通过内置的外围设备列表TPL(Target Peripheral List)完成设备枚举和驱动加载,不具有加载未知设备驱动的能力。该模式下Android手机对外设供电。
USB 配件模式
这种模式是Android定义的一种新的通讯模式,它将配件作为协议交互的主要角色,配件内置USB Embedded Host端,可以为Android手机供电,并且识别Android手机,建立数据通道。使得配件成为一个简化版的PC Host端,方便市面上Android手机拓展其功能。官方宣称Android 2.3.4增加lib库即可支持,Android 3.1以上系统直接支持。
2.3 AOA协议工作过程
协议整体交互图:
- 配件端等待手机连接
- 手机接入配件
- 配件通过USB驱动的控制通道(0通道)获取手机的vendor ID与product ID
- 配件分析获取的vendor ID是否为0x2D01, 0x2D02, 0x2D03或0x2D04,以及product ID是否为0x18D1。如果均符合,则说件现在手机已经是配件模式,可以按照配件模式的要求直接重新配置USB端点和接口。否则启动尝试进入配件模式流程。
- 确定手机已经进入配件模式,重新枚举USB设备,手机重新进行USB协商。
- 按照配件模式重新配置USB端点和接口,建立配件模式的数据通道。
尝试启动配件模式交互流程:
- 配件发送序号51的USB请求报文,手机收到后查询自己的AOA协议版本,发送响应报文给配件。
- 配件校验协议版本号,目前为1或2,其他的均为不支持。
- 配件发送序号52的USB请求报文,通过Index字段携带配件自身信息,包括制造商,型号,版本,设备描述,序列号,URI等。手机根据这些信息启动响应的APP。
- 配件发送序号53的USB请求报文,切换USB模式,主要是根据切换vendor ID和product ID。
- 重新枚举USB设备,准备建立AOA数据通道。
3. 软件开发
Android 提供了ADK(Accessory Development Kit)帮助开发者进行配件开发。ADK是一套完整的开发环境,基于Arduino 开源硬件平台,主要包括:
- USB主控板(Arduino Mega2560)及对应的firmware
- USB Host Shield 及相应的library
- Android Accessory protocol library
- 一些Sensor和接口library
- Android 手机控制APK
ADK开发平台结构如下图:
从上图可以看出,Arduino平台帮助开发者实现了AOA协议和Host驱动,从而搭建出一套Android手机与配件直接通讯的数据通道。整个结构有些像路由器的转发,Arduino平台将手机的控制命令转发给硬件控制器,使得手机可以控制硬件。
Android ADK开发主要包括三个方面:Arduino硬件开发环境搭建、Android手机软件开发、配件硬件开发。
Arduino硬件开发环境搭建
具体参见官网详细流程。这里简单说一下做的事情,Arduino开发板是一个嵌入式系统,首先需要在PC机上搭建对应的开发环境,主要是lib库,编译环境,而后为嵌入式系统烧入对应的固件,保证可以和PC机正常通讯,而且能够正确工作即可。
Android手机软件开发
相关接口和文档参见官网。Androd系统的framework和kernel已经处理的AOA协议大部分工作,APP开发者只需响应对应的通知事件即可。Android将Accessory的大部分实现均封装在UsbAccessory类中,主要流程是:
- 接收连接建立通知
- 枚举可用设备
- 获取访问权限
- 建立通讯通道
- 发送控制命令,接收控制响应
配件硬件开发
主要是指配件的硬件设计及相应的驱动开发,每个硬件都不相同,这里不做进一步讨论。
这篇关于Android Open Accessory 协议分析与开发的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!