车载技术【USB接口】—Android配件协议AOA【AOA连接】

news2025/1/24 14:05:12

简述

AOA协议是Google公司推出的用于实现Android设备与外围设备之间USB通信的协议。该协议拓展了Android设备USB接口的功能,为基于Android系统的智能设备应用于数据采集和设备控制领域提供了条件。介绍了Android系统下USB通信的两种模式,并给出了USB配件模式下基于AOA协议实现Android手机控制步进电机的实例。

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。

USB通信(AOA连接)

USB 主机和配件概览

Android 通过 USB 配件和 USB 主机两种模式支持各种 USB 外围设备和 Android USB 配件(实现 Android 配件协议的硬件)。在 USB 配件模式下,外部 USB 硬件充当 USB 主机。配件示例可能包括机器人控制器、扩展坞、诊断和音乐设备、自助服务终端、读卡器等等。这样,不具备主机功能的 Android 设备就能够与 USB 硬件互动。Android USB 配件必须设计为与 Android 设备兼容,并且必须遵守 Android 配件通信协议。在 USB 主机模式下,Android 设备充当主机。设备示例包括数码相机、键盘、鼠标和游戏控制器。针对各类应用和环境设计的 USB 设备仍可与能够与设备正常通信的 Android 应用互动。

下图展示了这两种模式之间的差异。当 Android 设备处于主机模式时,它会充当 USB 主机并为总线供电。当 Android 设备处于 USB 配件模式时,所连接的 USB 硬件(本例中为 Android USB 配件)充当主机并为总线供电。

Android 3.1(API 级别 12)或更高版本的平台直接支持 USB 配件和主机模式。USB 配件模式还作为插件库向后移植到 Android 2.3.4(API 级别 10)中,以支持更广泛的设备。设备制造商可以选择是否在设备的系统映像中添加该插件库。 注意:配件模式取决于设备硬件;部分设备可能不支持配件模式。您可以在相应应用的 Android 清单中使用 元素过滤出支持配件模式的设备。

Android 开放配件 (AOA)

Android 开放配件 (AOA) 支持功能可让外部 USB 硬件(Android USB 配件)与处于配件模式下的 Android 设备进行交互。当某台 Android 设备处于配件模式时,所连接的配件会充当 USB 主机(为总线供电并列举设备),而 Android 设备则充当 USB 配件。 Android USB 配件专门用于和 Android 设备相连。这些配件遵循 AOA 要求,从而能够检测到支持配件模式的 Android 设备,并且必须提供 500 毫安(电压为 5 伏)的充电电流。之前发布的部分 Android 设备只能充当 USB 设备,无法发起与外部 USB 设备的连接。AOA 支持功能打破了这一局限,让您能够构建可以与各种 Android 设备建立连接并与其进行交互的配件。

AOA 设备握手过程

AOA 协议规定 Android 设备和配件之间握手的大致过程如下: (1)通过 USB 线连接 Android 设备与配件。 (2)配件枚举连接过来的设备。根据 VID 和 PID 判断当前 Android 设备是否处于 Accessory Mode。如果否,则配件会向 Android 设备发出切换到 AOA 模式的请求,进入第(3)步; 如果是,则直接调转到第(5)步。

判断 Android 设备处于 Accessory Mode 时,VID 和 PID 值必须满足如下条件如下:

(3)配件发送查询指令给 Android 设备。绝大多数 Android 设备,在缺省情况下都不挂载Accessory 驱动,即不会默认处于 Accessory Mode,在配件与 Android 设备建立 USB 连接时,配件会通过握手协议查询该设备是否为Android 设备且是否支持 AOA 协议以及支持的版本号。配件向 endpoint 0 端口中写入 51 号指令,如果返回值为1 或者 2,则说明Android 设备支持 AOA1.0 或者 AOA2.0,如果小于 1 或者大于 2,则说明连接设备不支持AOA协议或者支持的 AOA 协议版本号不正确。

(4) Android 配件发送认证信息给 Android 设备,并发送开始通信的指令。认证信息可以包含以下属性:manufacturer(厂商)、model(型号)、version(版本)、description(描述信息)、URL(Web页面)。

配件也会向Android设备发出53号指令,请求Android设备切换到AOA模式,Android 设备会执行请求,将 USB 切换到 AOA 模式;在这个过程中,USB 连接会出现一次逻辑插拔,配件会重新枚举设备,进入第(2)步。Android 设备接收到配件通过 52 指令发送过来的参数信息以后,使用其中的三个参数 Manufacturer、Model 、Version 来确定绑定到该配件的 App。如果系统内无任何 App 可以匹配配件设备发来的上述三个参数,则 Android 设备会弹出一个对话框,向用户提供 Accessory 设备发送过来的描述信息和 URL 信息,用户可以点击 URL 访问它指向的 Web 页面。 如果系统内有 App 可以匹配 Accessory 设备发来的握手信息,则 Android 系统会弹出一个对话框询问用户是否立刻启动该 App。如果用户选择 OK 则启动该App;同时该对话框提供一个勾选框,勾选之后每次 Accessory 设备连接后会自动启动该 App。应该要求用户勾选该对话框,否则 App 启动后向 USB Manager获取 Accessory 设备后可能因为 Permission 问题无法打开文件描述符建立通讯连接。

(5)建立连接

AOA 配件端开发

在Android车机或者Android平板开发中,以车机或平台为配件端,与Android手机通过数据线进行通信。 Android 官方是提供 USB 的相关接口用来进行 AOA 连接,主要有UsbManager, UsbDevice, UsbInterface, UsbDeviceConnection 等。具体参考官方文档:USB 主机概览 以下代码段是执行同步数据传输的一种简单方式:

private Byte[] bytes;
private static int TIMEOUT = 0;
private boolean forceClaim = true;
​
...
​
UsbInterface intf = device.getInterface(0);
UsbEndpoint endpoint = intf.getEndpoint(0);
UsbDeviceConnection connection = usbManager.openDevice(device);
connection.claimInterface(intf, forceClaim);
connection.bulkTransfer(endpoint, bytes, bytes.length, TIMEOUT); //do in another thread

AOA 主机端开发

在与Android车机或Android平板USB通信过程中,手机作为主机端,默认不开启配件模式,需要与配件建立AOA通信才会开启启动配件模式。 具体参考Google官方文档:USB 配件模式 与配件通信代码如下:

UsbAccessory accessory;
ParcelFileDescriptor fileDescriptor;
FileInputStream inputStream;
FileOutputStream outputStream;
...
​
private void openAccessory() {
    Log.d(TAG, "openAccessory: " + accessory);
    fileDescriptor = usbManager.openAccessory(accessory);
    if (fileDescriptor != null) {
        FileDescriptor fd = fileDescriptor.getFileDescriptor();
        inputStream = new FileInputStream(fd);
        outputStream = new FileOutputStream(fd);
        Thread thread = new Thread(null, this, "AccessoryThread");
        thread.start();
    }
}

文末

建立与设备的通信

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/396862.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux操作系统安装——服务控制

个人简介:云计算网络运维专业人员,了解运维知识,掌握TCP/IP协议,每天分享网络运维知识与技能。座右铭:海不辞水,故能成其大;山不辞石,故能成其高。个人主页:小李会科技的…

yocto 如何添加python module

yocto 如何添加python module 最近在使用阿里云的图像识别SDK,在ubuntu主机上使用pip install alibabacloud_imagerecog20190930 安装modules以后就可以运行demo程序了,于是打算将SDK移植到嵌入式板子上面,然后在板子上跑一下demo。但是发现…

AcWing数据结构 - 数据结构在算法比赛中的应用(下)

目录 Trie树 Trie字符串统计 最大异或对 并查集 合并集合 连通块中点的数量 食物链 堆 堆排序 模拟堆 哈希表 模拟散列表 字符串哈希 Trie树 Trie字符串统计 思路: 设 idx索引用于构建树, 结点son[节点位置][节点分支指针],cnt[]记录单…

TypeScript深度剖析: typescript 的数据类型有哪些?

一、是什么 typescript 和 javascript几乎一样,拥有相同的数据类型,另外在javascript基础上提供了更加实用的类型供开发使用 在开发阶段,可以为明确的变量定义为某种类型,这样typescript就能在编译阶段进行类型检查,…

06-Oracle表空间与用户管理

本讲主要内容: 1.表空间管理:表空间的作用,创建,修改,删除及管理; 2.用户管理:创建用户,修改用户,删除用户,修改密码,解锁; 3.用户…

【LeetCode】13. 罗马数字转整数

题目链接:https://leetcode.cn/problems/roman-to-integer/ 📕题目要求: 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 例如, 罗马数字 2 写做 II ,即…

微电影广告发展的痛点

微电影广告以不可阻挡之势进入大众生活中,企业利用微电影广告来进行企业形象塑造的例子比比皆是。于是乎,微电影广告在为企业塑造品牌形象方面上取得了可喜的效果,但也不可忽视,在这个发展过程中,微电影广告所面临的问…

ruoyi-vue-plus1(控制台相关的输出日志)(p6spy插件)(jackson全局配置)(StopWatch)

Jackson配置在启动项目时,我们发现日志打印出这样几行字,初始化了jacdson配置,我们去查看一下来源找。我们找到了一个全局序列化配置类,其中重写了BigNumberSerializer.INSTANCE进去查看发现了这里对于部分范围的数字进行了转为为…

JDK动态代理(powernode CD2207 video)(内含教学视频+源代码)

JDK动态代理(powernode CD2207 video)(内含教学视频源代码) 教学视频原代码下载链接地址:https://download.csdn.net/download/weixin_46411355/87545977 目录JDK动态代理(powernode CD2207 video&#xf…

2022CCPC女生赛(补题)(A,C,E,G,H,I)

迟了好久的补题&#xff0c;&#xff0c;现在真想把当时赛时的我拉出来捶一拳排序大致按照题目难度。C. 测量学思路&#xff1a;直接循环遍历判断即可&#xff0c;注意角度要和2π取个最小值。AC Code&#xff1a;#include <bits/stdc.h>typedef long long ll; const int…

Linux设备的I/O模型

背景&#xff1a;进程休眠和唤醒为了把一个进程设置为睡眠状态&#xff0c;需要把这个进程从TASK_RUNNING(可运行状态或就绪态)状态设置为TASK_INTERRUPTIBLE(浅度睡眠)或TASK_NUINTERRUPTIBLE(深度睡眠)状态&#xff0c;并且从进程调度器的运行队列中移走&#xff0c;我们称这…

jUnit的学习笔记

jUnit学习笔记要不要做单元测试的思考jUnit的使用jUnit的一些注意事项注解Assert断言JUnitCoreTestCaseTestResultTestSuite 测试套件忽略测试时间测试异常测试参数化测试jUnit中遇到的问题1.多线程测试时&#xff0c;jUnit自动退出了&#xff1f;2.测试入库的数据时&#xff0…

各种激活函数的计算公式、图像以及实现代码

激活函数已经成为神经网络中非常重要的一部分&#xff0c;随着各种类型的神经网络模型被人们开发出来&#xff0c;各种激活函数也应运而生&#xff0c;在不同的场景中&#xff0c;取得良好的效果。本文跟据著名的YOLO系列目标检测模型的源码 AlexeyAB Darknet&#xff0c;整理出…

HTML第5天 HTML新标签与特性

新标签与特性文档类型设定前端复习帮手W3Schoool常用新标签datalist标签&#xff0c;与input元素配合&#xff0c;定义选项列表fieldset元素新增input表单文档类型设定 document – HTML: 开发环境输入html:4s – XHTML: 开发环境输入html:xt – HTML5: 开发环境输入html:5 前…

如何在知行之桥EDI系统中定时自动更换交易伙伴AS2证书?

为了保证客户与交易伙伴之间数据传输的安全性&#xff0c;AS2传输协议中&#xff0c;通常会通过一对数字证书对传输数据进行签名和加密。但是证书是有有效期的&#xff0c;在证书到期之前&#xff0c;需要贸易双方及时更换新的证书。 在更新证书时&#xff0c;由于客户通常是和…

第十六节 接口

接口 接口是一种规范。规范也是一种公开的。 接口中的成分特点&#xff1a;JDK8之前接口中只能有抽象方法和常量。 接口的用法&#xff1a; ●接口是用来被类实现(implements)的&#xff0c;实现接口的类称为实现类。实现类可以理解成所谓的子类。 从上面可以看出&#xff0c…

网络的瓶颈效应

python从小白到总裁完整教程目录:https://blog.csdn.net/weixin_67859959/article/details/129328397?spm1001.2014.3001.5501 ❤ 网络的瓶颈效应 网络瓶颈&#xff0c;指的是影响网络传输性能及稳定性的一些相关因素&#xff0c;如网络拓扑结构&#xff0c;网线&#xff0…

了解栈Stack一篇文章就够了

什么是栈栈是一种特殊的线性表&#xff0c;只允许一端进行数据的插入和删除&#xff0c;即先进后出原则。类似于弹夹先装进去的子弹后面出&#xff0c;后放入的子弹先出。栈的底层原理栈是一种线性结构&#xff0c;所以既能使用数组实现&#xff0c;也能使用链表实现&#xff0…

【蓝桥杯刷题训练营】day05

1 数的分解 拆分成3个数相加得到该数 然后采用了一种巨愚蠢的办法&#xff1a; int main() {int count 0;int a 2;int b 0;int c 1;int d 9;int a1, a2, a3;int c1, c2, c3;int d1, d2, d3;for (a1 0; a1 < 2; a1){for (a2 0; a2 < 2; a2){for (a3 0; a3 <…

中断和事件

目录 中断概述 什么是中断&#xff1f; 什么是EXTI&#xff1f; EXTI初始化结构体&#xff1a; 中断/事件线&#xff1a; EXTI模式&#xff1a; 触发类型&#xff1a; EXTI控制&#xff1a; 什么是优先级&#xff1f; 什么是优先级分组&#xff1f; 什么是NVIC&#…