Android Open Accessory 协议分析与开发

2023-11-02 04:20

本文主要是介绍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模式

USB Slave

 这种模式通常应用于PC与Android手机连接,PC端作为服务的提供方,主要完成设备枚举,搜索相关驱动并完成安装,建立数据通路等工作。该模式下PC对Android手机供电。

USB Host模式

USB OTG

 这种模式通常应用于Android手机以OTG连接的方式连接外设,比如:键盘,鼠标等。Android手机端是简化版的USB host端 ———— USB Embedded Host。它通过内置的外围设备列表TPL(Target Peripheral List)完成设备枚举和驱动加载,不具有加载未知设备驱动的能力。该模式下Android手机对外设供电。

USB 配件模式

USB AOA

 这种模式是Android定义的一种新的通讯模式,它将配件作为协议交互的主要角色,配件内置USB Embedded Host端,可以为Android手机供电,并且识别Android手机,建立数据通道。使得配件成为一个简化版的PC Host端,方便市面上Android手机拓展其功能。官方宣称Android 2.3.4增加lib库即可支持,Android 3.1以上系统直接支持。

2.3 AOA协议工作过程

 协议整体交互图:

协议交互

  1. 配件端等待手机连接
  2. 手机接入配件
  3. 配件通过USB驱动的控制通道(0通道)获取手机的vendor ID与product ID
  4. 配件分析获取的vendor ID是否为0x2D01, 0x2D02, 0x2D03或0x2D04,以及product ID是否为0x18D1。如果均符合,则说件现在手机已经是配件模式,可以按照配件模式的要求直接重新配置USB端点和接口。否则启动尝试进入配件模式流程。
  5. 确定手机已经进入配件模式,重新枚举USB设备,手机重新进行USB协商。
  6. 按照配件模式重新配置USB端点和接口,建立配件模式的数据通道。

 尝试启动配件模式交互流程:

协议探测

  1. 配件发送序号51的USB请求报文,手机收到后查询自己的AOA协议版本,发送响应报文给配件。
  2. 配件校验协议版本号,目前为1或2,其他的均为不支持。
  3. 配件发送序号52的USB请求报文,通过Index字段携带配件自身信息,包括制造商,型号,版本,设备描述,序列号,URI等。手机根据这些信息启动响应的APP。
  4. 配件发送序号53的USB请求报文,切换USB模式,主要是根据切换vendor ID和product ID。
  5. 重新枚举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类中,主要流程是:

  1. 接收连接建立通知
  2. 枚举可用设备
  3. 获取访问权限
  4. 建立通讯通道
  5. 发送控制命令,接收控制响应

配件硬件开发

 主要是指配件的硬件设计及相应的驱动开发,每个硬件都不相同,这里不做进一步讨论。

这篇关于Android Open Accessory 协议分析与开发的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/328063

相关文章

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

如何在Spring Boot项目中集成MQTT协议

《如何在SpringBoot项目中集成MQTT协议》本文介绍在SpringBoot中集成MQTT的步骤,包括安装Broker、添加EclipsePaho依赖、配置连接参数、实现消息发布订阅、测试接口... 目录1. 准备工作2. 引入依赖3. 配置MQTT连接4. 创建MQTT配置类5. 实现消息发布与订阅

python中Hash使用场景分析

《python中Hash使用场景分析》Python的hash()函数用于获取对象哈希值,常用于字典和集合,不可变类型可哈希,可变类型不可,常见算法包括除法、乘法、平方取中和随机数哈希,各有优缺点,需根... 目录python中的 Hash除法哈希算法乘法哈希算法平方取中法随机数哈希算法小结在Python中,

SpringBoot开发中十大常见陷阱深度解析与避坑指南

《SpringBoot开发中十大常见陷阱深度解析与避坑指南》在SpringBoot的开发过程中,即使是经验丰富的开发者也难免会遇到各种棘手的问题,本文将针对SpringBoot开发中十大常见的“坑... 目录引言一、配置总出错?是不是同时用了.properties和.yml?二、换个位置配置就失效?搞清楚加

Java Stream的distinct去重原理分析

《JavaStream的distinct去重原理分析》Javastream中的distinct方法用于去除流中的重复元素,它返回一个包含过滤后唯一元素的新流,该方法会根据元素的hashcode和eq... 目录一、distinct 的基础用法与核心特性二、distinct 的底层实现原理1. 顺序流中的去重

使用Python进行GRPC和Dubbo协议的高级测试

《使用Python进行GRPC和Dubbo协议的高级测试》GRPC(GoogleRemoteProcedureCall)是一种高性能、开源的远程过程调用(RPC)框架,Dubbo是一种高性能的分布式服... 目录01 GRPC测试安装gRPC编写.proto文件实现服务02 Dubbo测试1. 安装Dubb

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局

Python中对FFmpeg封装开发库FFmpy详解

《Python中对FFmpeg封装开发库FFmpy详解》:本文主要介绍Python中对FFmpeg封装开发库FFmpy,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、FFmpy简介与安装1.1 FFmpy概述1.2 安装方法二、FFmpy核心类与方法2.1 FF

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级