Android Open Accessory Protocol

原文地址:http://docs.eoeandroid.com/tools/adk/aoa.html

翻译者:长剑耿介

创建时间:2012年10月27日

Android开放配件协议

Android 3.1平台引入了Android开放配件支持,它允许外部USB硬件(一个Android USB配件)以一种特殊配件模式的与Android设备进行交互。 当Android系统以配件模式为设备供电,连接的配件作为USB主机(为总线供电和运行设备)而Android手机作为USB设备。 Android的USB配件是专门用来连接到Android设备,并坚持一个简单的协议(Android配件协议),使它们能够检测支持配件的Android手机。 配件还必须提供500毫安在5V供电电源。 许多以前发布的Android系统的设备只能够作为一个USB设备而无法启动与外部USB设备的连接。 支持Android开放配件协议克服了这个限制,使得你可以建立可以与各种各样的Android设备连接的配件,只要你允许配件来启动连接。

注:配件模式,最终依赖于设备的硬件,而不是所有设备都支持配件模式。 在相应的应用程序的Android清单(manifest)中使用<uses-feature>元素可以过滤支持配件模式的设备。 欲了解更多信息,请参阅USB配件开发人员指南。

实现Android配件协议

一个Android USB配件必须坚持Android配件协议,它定义了配件如何检测并与Android设备建立通信。 在一般情况下,配件应进行以下步骤:

1.等待并检测连接的设备 2.确定设备支持配件模式 3.如果需要,尝试启动设备的配件模式 4.如果它支持Android配件模式,建立与设备的通信 下面的章节深入讲解如何执行这些步骤。

等待并检测连接的设备

你的配件理论上应对连接的Android设备不断地检查。 当一个设备连接时,您的配件应确定设备是否支持配件模式。

确定设备支持配件模式

当Android手机连接,它可以在三种状态之一:

a.连接的设备支持Android配件的模式,并已在配件模式。 b.连接的设备支持Android配件模式,但它不是在配件模式。 c.连接的设备不支持Android的配件模式。 在初始连接时,该配件应检查连接设备的SB设备描述符的供应商和产品ID。 供应商ID应符合谷歌的ID(0x18D1),并且如果该设备已在配件模式(状态A),产品ID应该是0x2D00 0x2D01。 如果是这样的话,该配件现在可以在自己的通信协议下批量传输端点来与设备建立通信。 没必要在配件模式启动设备。

注:0x2D00是保留给支持配件模式的Android设备。 0x2D01是保留给同时支持配件模式和ADB(安卓调试桥)协议的设备,它提供了ADB的两个批量端点的第二接口。 如果你在计算机上模拟配件,您可以使用这些端点来调试辅助应用程序。 在一般情况下,不要使用这个接口,除非你的配件实现一条设备上的ADB通路。

如果供应商和产品的ID不匹配,那就有没有办法区分状态B和C了,所以配件尝试以配件模式启动设备来找出该设备是否被支持。

尝试以配件模式启动设备

如果供应商和产品的ID不符合配件模式下的Android手机,配件无法识别设备是否支持配件模式,和是否在这种状态,还是该设备根本无法支持配件模式。 这是因为支持配件模式而不在此模式的设备,在它设备制造商的供应商ID和产品ID的最初报告,而不是特殊的Android开放配件。 在这两种情况下,该配件应尝试启动设备的配套模式来检查设备是否支持它。 下面的步骤说明如何做到这一点:

1.发送51控制请求(“Get Protocol”),以找出该设备是否支持Android配件协议。 支持该协议,则返回一个非0的数字,它代表了该设备支持的版本协议(目前只有第1版)。 这个请求是一个端点0上的控制请求,具有如下特点:

requestType:    USB_DIR_IN | USB_TYPE_VENDOR
request:        51
value:          0
index:          0
data:           protocol version number (16 bits little endian sent from the device to the
accessory)

2.如果该设备返回一个正确的协议版本,发送标识字符串信息到该设备。 这一信息使该设备找出一个支持该协议的应用程序,如果不存在相应的应用程序,还将会为用户提供一个URL。 这些要求是控制端点0的(每个字符串ID)的要求,具有如下特点:

requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
request:        52
value:          0
index:          string ID
data            zero terminated UTF8 string sent from accessory to device

下面的字符串ID是被支持的,最大的为每个字符串256字节(必须以\0终止?)。

manufacturer name:  0
model name:         1
description:        2
version:            3
URI:                4
serial number:      5

3.当识别字符串被发送,要求设备以配件模式启动。 这个请求是一个端点0的控制请求,具有如下特点:

requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
request:        53
value:          0
index:          0
data:           none

发出最后的控制请求后,已连接的USB设备应在总线上以配件模式重新识别,并且配件可以重新检查连接的设备。 该算法跳回到 确定设备支持配件模式 ,来检查供应商和产品的ID。 如果该设备已成功切换到配件模式,供应商ID和产品ID的设备将会有所不同,并且立即向谷歌的供应商和产品的ID做出反应,而不是设备制造商的ID。 该配件可以 建立与设备的通信

任何这些步骤之一失败了,该设备都不能支持Android配件模式,只能等待后面连接的设备了。

建立与设备的通信

如果一个配件模式下Android设备被检测到了,配件就会查询设备的接口和端点描述符来获得大量的端点与设备进行通信。 一个产品ID为0x2D00的Android供电设备,有一个用于输入和输出通信接口的两个批量端点接口。 一个产品ID为0x2D01的设备有两个用于输入和输出通信接口的两个批量端点接口。第一个是标准的通信接口,而第二个是ADB通信接口。 在一个接口上通信,你需要做的是找到第一个大容量输入和输出端点,用SET_CONFIGURATION(0X09)设置设备的配置为1,然后使用端点进行通信。


  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值