Android Open Accessory Protocol 1.0(AOA 协议 1.0)

Android USB 配件必须遵从 Android Open Accessory(AOA)协议,该协议定义了配件如何检测和建立与 Android 设备的通信。配件应执行以下步骤:

1. 等待并检测连接的设备

2. 确定设备的配件模式支持

3. 尝试以配件模式下启动设备(如果需要)

4. 如果设备支持 AOA,与设备建立通信

以下部分介绍如何实现这些步骤。

Note:在开发通过 USB 连接到 Android 设备的新配件时,请使用 AOAv2。

等待并检测连接的设备

配件应该连续检查连接的 Android 设备。连接设备时,配件应确定设备是否支持配件模式。

确定配件模式支持

当连接 Android 设备时,它可以是以下三种状态之一:

1. 支持 Android 配件模式,并已经处于配件模式。

2. 支持 Android 配件模式,但不处于配件模式。

3. 不支持 Android 配件模式。

在初始连接期间,附件应检查连接设备的 USB 设备描述符的厂商 ID 和产品 ID。厂商 ID 应该匹配 Google 的 ID(0x18D1)。如果设备已经处于配件模式,产品 ID 应为0x2D00 或 0x2D01,配件可以使用自己的通信协议通过批量传输端点 establish communication with the device(设备不需要在附件模式下启动)。

Note:0x2D00 保留给支持配件模式的 Android 设备。0x2D01保留用于支持配件模式的设备以及 Android Debug Bridge(ADB)协议,该协议显示了用于 ADB 协议的有两个批量端点的第二个接口。如果你正在计算机上模拟配件,可以使用这些端点来调试配件应用程序。通常,不要使用此接口,除非配件在设备上实现到 ADB 的传输。

如果 USB 设备描述符中发现的厂商 ID 或产品 ID 与预期值不匹配,则配件无法确定设备是否支持 Android 配件模式。配件应尝试以配件模式(详细说明如下)启动设备,以确定设备支持情况。

尝试从配件模式启动

如果厂商和产品 ID 与配件模式下的 Android 设备不相符,则配件无法辨别设备是否支持(支持但不处于)配件模式,或者设备是否不支持配件模式。这可能是因为支持配件模式(但不处于配件模式)的设备最初报告设备制造商厂商和产品 ID 而不是 AOA 厂商和产品 ID。

配件应尝试以配件模式启动设备,以确定设备是否支持该模式:

1. 发送 51 控制请求(“Get Protocol”)以确定设备是否支持 Android 配件协议。如果设备支持协议,则返回非零数字,表示支持的协议版本。控制请求在端点0上具有以下特征:

requestType:    USB_DIR_IN | USB_TYPE_VENDOR
request:        51
value:          0
index:          0
data:           protocol version number (16 bits little endian sent from thedevice 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 的算法determines accessory mode support 应该是正确的(例如,对应于Google的供应商和产品ID而不是设备制造商的ID)。如果 ID 正确,则配件移动至 establish communication with the device。

Note:AOA 当前不支持同时进行 AOA 和 MTP 连接。 要从 AOA 切换到 MTP,配件必须首先断开 USB 设备(物理上或电气上等效的方式),然后使用 MTP 重新连接。

如果任何步骤失败,配件确定设备不支持 Android 配件模式,并等待下一个设备连接。

建立与设备的通信

如果配件检测到处于配件模式的 Android 设备,则配件可以查询设备接口和端点描述符,以获取与设备通信的批量端点。
接口和批量端点的数量取决于产品 ID。 Android 设备有产品 ID:

1. 0x2D00 具有一个有两个批量端点的接口,用于输入和输出通信。

2. 0x2D01 具有两个接口,每个接口具有两个批量端点,用于输入和输出通信。 第一个接口处理标准通信,第二个接口处理 ADB 通信。 要使用接口,请找到第一个批量输入和输出端点,使用 SET_CONFIGURATION(0x09)设备请求将设备配置设置为 1,然后使用端点进行通信。

安卓USB开发教程 <五> 安卓 AOA 1.0相关推荐

  1. 安卓USB开发教程 五 安卓 AOA 1.0

    Android Open Accessory Protocol 1.0(AOA 协议 1.0) Android USB 配件必须遵从 Android Open Accessory(AOA)协议,该协议 ...

  2. 安卓USB开发教程 四 安卓 AOA

    Android 开放性配件协议(AOA) Android 开放性配件协议(AOA)支持允许外部 USB 硬件(Android USB 配件)与工作在配件模式下的 Android 设备进行交互.当处于配 ...

  3. 安卓USB开发教程 六 安卓 AOA 2.0

    Android Open Accessory Protocol 2.0 目录 Detecting AOAv2 support Audio support HID support Interoperab ...

  4. 安卓USB开发教程 一 USB Host 与 Accessory

    安卓通过两种模式:USB Accessory 与 USB Host 模式支持多种 USB 外设与安卓 USB 配件(实现安卓配件协议的硬件).在 USB 配件模式下,外部 USB 硬件充当 USB 主 ...

  5. 安卓USB开发教程 三 USB Accessory

    USB Accessory(配件模式) USB 配件模式允许用户连接专为 Android 设备设计的 USB 主机硬件.配件必须遵守 Android Accessory Development Kit ...

  6. 安卓USB开发教程 二 USB Host

    USB Host(主机模式) 当 Android 设备处于 USB 主机模式时,它充当 USB 主机,为总线供电,并枚举连接的 USB 设备.Android 3.1 及更高版本支持 USB 主机模式. ...

  7. 安卓rom开发教程!安卓工程师跳槽经验分享,吐血整理

    背景 经常有网友在知乎问答提两个问题:"现在学习移动开发还有前景吗?""开发还有什么可以研究的?".网友回复:"现在还学移动开发?如同49年加入国军! ...

  8. 【安卓USB开发】让手机与物联网设备鹊桥相会

    安卓USB开发详解 一.前言 1.是什么 2.为什么 3.怎么做 二.简析USB 1.外部总线标准 2.主从结构星型拓扑 3.自.总供电模式 4.OTG 5.数据传输模式 6.小结 三.安卓USB开发 ...

  9. Android APP 快速开发教程(安卓)

    Android APP 快速开发教程(安卓) 前言 本篇博客从开发的角度来介绍如何开发一个Android App,需要说明一点是,这里只是提供一个如何开发一个app的思路,并不会介绍很多技术上的细节, ...

最新文章

  1. python 16进制转10进制, 8进制转10进制, 2进制转10进制的方法
  2. hfss13.0安装教程
  3. java byte(字节_【原创】Java中Byte字节流处理的自定义方法库2
  4. Laravel 实现定时任务
  5. android 骨骼动画库,cocos creator spine骨骼动画组件使用
  6. Centos6的VSFTP服务器配置使用教程
  7. Java 解决跨域问题
  8. IDEA项目 let报错爆红
  9. 文具用品分类html,中国商品分类.doc
  10. app/bootstrap.php.cache : failed to open stream: No such file or directory
  11. jquery中的live()方法
  12. nginx try_files
  13. 二级c语言编程题库100题,计算机二级C语言编程题库100题(70页)-原创力文档
  14. 51单片机(AT89S52)设计简单计算器(4位加减乘除)
  15. 高中计算机学科关于德育的论文,浅析如何在信息技术教学中实现德育教育
  16. Cisco交换机与路由器登陆密码破解(保存原配置)
  17. linux关机卡屏,Ubuntu关机卡住无法关机的解决方法
  18. Rust游戏引擎Bevy初探
  19. CSS学习之圆、半圆、四分之一圆以及三角形的创建
  20. python,list元素倒置

热门文章

  1. 不熟悉的四级核心词汇(二)
  2. 明远智睿5G工业网关 5G物联网人工智能
  3. 整理10种电脑截图工具(附带下载地址)
  4. 刷新桌面后,桌面图标出现空位
  5. 我近4年的计算机学习经历
  6. lg linux电视安装软件,LG电视安装第三方APP教程 仅针对安卓电视!!!
  7. 操作系统---页式地址重定位
  8. 理解用户模式和内核模式(译)
  9. 我的 Mac 终端配置(Mac OSX + iTerm2 + Zsh + Oh-My-Zsh)
  10. 微信分享功能填坑过程