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 值必须满足如下条件如下:

VID 模式
0X18D1
PID 模式
0x2D00 accessory
0x2D01 accessory + adb
0x2D02 audio
0x2D03 audio + adb
0x2D04 accessory + audio
0x2D05 accessory + audio + adb

(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)建立连接

指令 作用
51 判断设备是否支持 AOA 协议,并获取支持 AOA 协议的版本号。
52 发送配件相关设备认证信息,Android 设备可 以据此来确定绑定到该配件的 APP。
53 请求 Android 设备切换到 Accessory Mode
54~57 HID支持功能
58 音频支持( Android 8.0 中已被弃用)

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的USB通信(AOA连接)相关推荐

  1. 两个android通过usb通信

    2019独角兽企业重金招聘Python工程师标准>>> 需求: 现在有两个设备,都运行android系统,如何通过usb来通信? 准备知识: 两个通过usb连接起来的设备,有主次之分 ...

  2. android与usb通信,android USB通信

    USB模式 支持USB accessory模式和USB host模式.通过这两种模式,android支持各种各样的USB 外围设备和USB 配件(硬件需要实现android配件协议). USB acc ...

  3. Android usb 控制传输,【android之USB通信】android之USB数据传输-Go语言中文社区

    因为老板认为wifi连接的方式传输数据太慢,想通过USB传输来实现与硬件的连接,所以通过android客户端作为主设备,终端硬件作为从设备.其中收到数据的处理和 下发设置帧的生成与wifi连接的方式都 ...

  4. Android USB的AOA协议设备端(主机模式,配件模式),ADB连接

    USB的ADB/AOA协议(一种是ADB模式,一种是AOA模式).AOA协议是Google公司推出的用于实现Android设备与外围设备之间USB通信的协议. ADK中与USB配件模式相关的两个类是U ...

  5. 基于AOA协议的android USB通信

    摘 要:AOA协议是Google公司推出的用于实现Android设备与外围设备之间USB通信的协议.该协议拓展了Android设备USB接口的功能,为基于Android系统的智能设备应用于数据采集和设 ...

  6. Android设备与USB设备的连接通讯

    关于Android与USB设备的连接,所能搜索到的资料特别的少,但恰恰接到了一个这样的需求,使用android平板通过USB与一个外接设备进行通讯,这个设备是一个压力感应器,在压力发生变化时可以测到相 ...

  7. Android通过USB与PC通信

    最近项目中有一个功能需要用到Android与PC端同步数据.查阅了相关资料后,采取了一种建立在adb基础之上的Usb通信方式:由于adb可以将Usb模拟为网卡,所以可以利用socket通信的方式实现A ...

  8. Android连接多个usb,Android实现USB连接

    前言 在Android开发过程中,我们有时会涉及到USB连接的问题,这里为了方便USB连接的使用,我将相关知识封装成了一个工具类-USBHelper,下面就来介绍下它的使用吧. 今天涉及的内容有: U ...

  9. 【Android车载系列】第7章 车载通信-USB通信原理

      前一章节简单介绍了串口.串口与USB的区别.Android上的串口通信实现,本章节我们来了解一下USB通信协议以及Android上实现USB通信的相关知识. 1 USB简介   通用串行总线 (U ...

最新文章

  1. oracleHelper 操作帮助类
  2. javaScript中的提示对话框
  3. android studio device功能,Android Studio 3.0找不到Android Device Monitor
  4. windows下的虚拟内存分配分析
  5. Oracle体系结构四(学习笔记)
  6. http error 502.5
  7. 25个恶意JavaScript 库通过NPM官方包仓库分发
  8. 程序员都必须了解的18个Python模式程序片段
  9. mahout AbstractJDBCModel log
  10. HackerRank - Stock Maximize
  11. sql面试题:问题1:查询每个同学的学生编号、学生姓名、选课总数...问题2:查询“张三”老师所授课程的学生中,成绩最高的学生信息...
  12. PostgreSQL存储过程-批量新增周末到节假日
  13. 怎么提取音乐中的伴奏?分享一个超好用的方法
  14. mac 锁屏及锁屏快捷键设置
  15. 用mission planner或者3drradioconfig软件配置X-ROCK数传电台
  16. c语言软件中ovr怎么取消,OVR Toolkit
  17. 【CodeForces】Educational Codeforces Round 118 (Rated for Div. 2)【A-C】
  18. pytorch使用detectron2模型库模型训练自己的数据
  19. 承受自律的苦,不要承受自责的悔
  20. C++将一张小图贴到一张大图上

热门文章

  1. Markdown如何画时序图,一篇就够了
  2. 用matlab实现机械臂的仿真,基于MATLAB的SCARA机械臂仿真与性能评估
  3. python给定一个整数n、判断n是否为素数_Python判断一个整数是否为素数
  4. Unity学生作业:太阳地球月亮自转和公转
  5. oracle客户端怎么变成中文,如何让Oracle客户端显示中文
  6. 基于Java基础-面向对象实现植物大战僵尸简易版
  7. 《穷爸爸富爸爸》读记
  8. 推荐系统架构及流程说明
  9. 美团点评技术与算法文章汇总,设计算法、前后端、客户端、小程序等
  10. Python的pyhanlp库使用(一)