USB 主机和配件概览Android 通过 USB 配件和 USB 主机两种模式支持各种 USB 外围设备和 Android USB 配件(实现 Android 配件协议的硬件)。在 USB 配件模式下,外部 USB 硬件充当 USB 主机。配件示例可能包括机器人控制器、扩展坞、诊断和音乐设备、自助服务终端、读卡器等等。这样,不具备主机功能的 Android 设备就能够与 USB 硬件互动。

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模式
0x2D00accessory
0x2D01accessory + adb
0x2D02audio
0x2D03audio + adb
0x2D04accessory + audio
0x2D05accessory + 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~57HID支持功能
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 依据USB协议有多个接口(功能设备),多数 Android 设备中定义了 MTP 接口(功能设备),PTP接口 (功能设备)和 U 盘接口(功能设备),这些接口(功能设备)主要用来和 USB 主机传输媒体文件。

另外AOA 协议也为 Android 设备定义了一些接口选择,通过设置不同的选项,可以与 USB 配件实现不同的功能。

AOA 协议定义了三种 USB 接口类型:

  • ADB 接口:主要用来调试配件
  • Accessory接口:用来交换数据
  • Audio 接口:用来将音频输出到配件

AOA 协议将上述3种接口组合出6种 USB 接口层设备,这些USB设备的厂商 ID 统一为 0x18D1 (Google Inc),产品ID 如下图

3. AOA标准请求

这部分可以解决第 2 个问题。

AOA 协议定义了标准控制请求包格式,如下图所示:

USB 配件与 Android 设备建立连接主要通过 AOA 标准控制请求完成,这些标准请求通过控制端点 0 传输。

每个请求的请求号标识和功能如下,即request字段:

4. 配件连接流程

这部分可以解决第 3 个问题

4.1 USB枚举

USB 配件物理连接到 Android设备之后,USB配件中的主机协议栈首先会来枚举。枚举将获得 Android设备的USB 描述符信息。

4.2 根据枚举得到的设备描述符来检测 Android 设备是否处在配件模式

配件模式下的USB 设备描述符中的厂商 ID 应为 0x18D1,产品 ID 应为 0x2Dxx,即应该是AOA 协议定义的 6 种USB 设备类中的一种。只要厂商 ID 和产品 ID 符合条件,就确定 Android 设备处于配件模式,即可进行通信,如果 Android 设备不在配件模式下,则需要开启配件模式。

4.3 开启配件模式

  • 如果 Android 设备未处于配件模式,则 USB 配件要发送 51 号请求来询问 Android 设备是否支持 AOA 协议,如果返回非0值,说明支持 AOA 协议,这个值表示 AOA 协议版本号。

该标准请求格式如下所示:

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)
  • USB 配件获得 AOA 版本号之后,USB 配件发送 52 号请求将验证字符串信息发送给 Android 设备,这些字符串包括 USB 配件的制作商名称、模型名称、描述、版本、访问配件的 URI 和 序列号,对应字符串的 ID 分别为 0、1、2、3、4、5,Android 设备收到这些字符串之后,会试图找到与USB 配件对应的应用程序,如果没有找到,Android 设备会 提供应用程序的URL提示安装。

该标准请求格式如下所示:

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

其中string ID如下:

manufacturer name 厂商名称:  0
model name 模型名称:         1
description 描述:           2
version 版本:               3
URI:                       4
serial number 序列号:       5
  • USB配件发送完验证字符串信息后,USB 配件发送 53 号控制命令来尝试开启配件模式,在这个过程中,Android 设备会修改 USB 设备描述符并复位触发配件对总线进行再次枚举。

该标准请求格式如下所示:

requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
request:        53
value:          0
index:          0
data:           none       
  • 4.4 重新枚举

Android 设备接收到 53 号请求之后,会自动复位 USB 总线,USB 配件重新枚举,Android 设备会返回新的描述符信息,枚举成功后,USB 配件获得的设备描述符中 厂商 ID 和产品 ID 应为 AOA 协议中定义的一个。

4.5 开启 HID 功能

如果 USB 配件需要 HID 功能,可以在与 Android 设备建立连接之后,发送 HID 控制请求给 Android 设备,这些请求仍然是通过端点 0 发送的。

到这里我也有几个问题未解决:

  • 当第二次枚举的时候,Android 设备返回的描述符信息是怎么修改好的?
  • 第一次枚举和第二次枚举的描述符有什么区别
  • 使用USB Device Viewer可以看到Android 设备的USB描述符信息,如在文章一开始举的例子,第二次枚举返回的描述符只是这几个接口的重新组合还是又重新定义了一组描述符

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人工智能视频画质增强和修复软件Topaz Video AI v7.1.1最新汉化,自带星光模型

软件介绍 这是一款专业的视频修复工具-topaz video ai,该版本是解压即可使用,自带汉化,免登陆无输出水印。 软件特点 不登录不注册解压即可使用无水印输出视频画质提升 软件使用 选择我们需要提升画质的视频即可 软件下载 夸克 其他网盘…

LeetCode 777.在LR字符串中交换相邻字符

在一个由 ‘L’ , ‘R’ 和 ‘X’ 三个字符组成的字符串(例如"RXXLRXRXL")中进行移动操作。一次移动操作指用一个 “LX” 替换一个 “XL”,或者用一个 “XR” 替换一个 “RX”。现给定起始字符串 start 和结束字符串 result&#x…

RK-Android15-WIFI白名单功能实现

实现WIFI白名单功能 。 三个模式: 1、默认模式:允许搜索所有的WIFI显示、搜索出来 ; 2、禁用模式:允许所有WIFI显示,能够搜索出来 ;3、白名单模式:允许指定WIFI名单显示,被搜索出来 文章目录 前言-需求 一、参考资料 二、核心修改文件和实现方式 1、修改文件 疑问思考 …

Maven + JUnit:Java单元测试的坚实组合

Maven JUnit:Java单元测试的坚实组合Maven JUnit:Java单元测试的坚实组合一、什么是软件测试?二、测试的维度:阶段与方法(一)测试的四大阶段(二)测试的三大方法三、main方法测试与…

FFMPEG 10BIT下 Intel b570 qsv 硬解AV1,H265视频编码测试

上10bitffmpeg 8.0 b570最新驱动 ,CPU 12100F 显卡 Intel b570 ffmpeg -hwaccel_output_format qsv -i "XXX.mkv" -vf "formatp010le" -c:v hevc_qsv -global_quality 19 -quality best -rc_mode ICQ -preset veryslow -g 120 -refs 5 -b…

SQL分类详解:掌握DQL、DML、DDL等数据库语言类型

如果你是一名数据库运维工程师,或者正在学习数据库技术,那么理解SQL的不同类型是非常重要的。让我们一起看看SQL到底有哪些种类,以及它们各自的作用。 1. 什么是SQL? SQL(Structured Query Language)是一种…

[特殊字符] 预告!我正在开发一款让自动化操作变得「像呼吸一样自然」的AI神器

各位技术爱好者和创作者朋友们,我要解决一个行业痛点!在上一个项目中(🔥 重磅预告!我要用AI开发一个自媒体神器,彻底解决创作者的7大痛点!),我本来雄心勃勃地打算直接用R…

加密软件哪个好用?加密软件-为数据共享提供安全保障

企业与合作伙伴协作时需共享大量数据,若缺乏保护,数据可能被非法获取,影响合作信任,甚至引发商业纠纷。加密软件可确保共享数据仅授权方可见,为数据共享提供安全保障,推动合作顺利开展。​1.固信软件固信加…

FPGA复位

1:能不复位尽量不要复位,减少逻辑扇出数:比如打拍信号。2:xilinx的FPGA推荐高复位,ATERAL的FPGA推荐低复位。3:尽量使用异步复位:大多数厂商目标库内的触发器都只有异步复位端口,采用同步复位需消耗较多逻辑资源。一&a…

Cursor 教我学 Python

文章目录1. 写在最前面2. Python 语法2.1 yield2.1.1 yield 和 return 的区别2.1.2 golang 中实现 yield 语法3. aiohttp 库3.1 原始写法3.2 修改写法3.2 耗时对比分析4. 碎碎念5. 参考资料1. 写在最前面 最近加了很多 Python Coding 的任务,虽然在 AI 加持下能够顺…

Ollama:本地大语言模型部署和使用详解

1.什么是Ollama? Ollama是一个开源的大语言模型管理工具,具有以下特点: 简单易用:提供简单的命令行接口本地部署:模型运行在本地,保护数据隐私跨平台支持:支持Windows、macOS、Linux丰富的模型…

云计算学习100天-第41天 -普罗米修斯2

目录 五、添加被监控端 1、在web1[192.168.88.100]上部署node exporter 2、在Prometheus服务器上添加监控节点 3、浏览器查看添加结果 六、Grafana的部署 概述 部署步骤 七、监控MySQL数据库 1、配置MySQL 2、配置mysql exporter 3、配置prometheus监控mysql 五、添…

集成电路学习:什么是SVM支持向量机

SVM:支持向量机 SVM,即支持向量机(Support Vector Machine),是一种常用的机器学习算法,特别适用于分类和回归问题。以下是对SVM的详细解析: 一、SVM的基本原理 SVM的基本思想是在特征空间中寻找一个最优的超平面,使得不同类别的样本能够被最大化地分开。这个最优…

盲盒抽谷机小程序开发:如何用3D技术重构沉浸式体验?

在盲盒经济中,“沉浸感”是提升用户停留时长与转化率的核心武器。某品牌通过3D扭蛋机旋转、卡牌翻转特效,使用户停留时长从15秒延长至45秒,转化率提升25%;另一品牌上线AR试戴功能后,单次抽谷时长延长至2分钟&#xff0…

集采与反腐双重压力下,医药销售的破局之道:从资源依赖到价值重构

在医药行业进入集采常态化与反腐纵深推进的新阶段,“资源匮乏”“拜访受阻” 成为萦绕在众多医药销售人员心头的难题。当传统的资金投入、学术活动等资源型打法逐渐失效,行业正面临一场从 “资源驱动” 到 “价值驱动” 的深刻变革。那些曾在市场中创造过…

Elasticsearch常用命令(未完)

网上针对es常用命令好多都是写的感觉非常复杂难以理解,所以我还是自己整理了一下相关的常用命令。 对es输入指令可以用很多种方法比如用es的谷歌浏览器插件,亦或者postman,我个人比较喜欢用postman比较简单直接 1.删除指定索引下的所有数据…

【系统架构设计(七)】 需求工程之:面向对象需求分析方法:统一建模语言(UML)(下)

文章目录一、用例图1. 用例模型建立的系统化流程第一步:识别参与者第二步:合并需求获得用例第三步:细化用例描述第四步:调整用例模型(可选步骤)2. 用例之间的关系类型二、类图与对象图概念类之间的关系三、…

数据结构——树(04二叉树,二叉搜索树专项,代码练习)

文章目录一、概念二、构造1.1先序序列 构造BST1.2中序序列 转换为BST1.3中序序列链表转换为BST1.4BST转换为中序序列链表1.7BST的序列化和反序列化1.6BST的种数二、BST的增删改查2.1验证是否为BST2.2查找值为val的节点2.3插入一个值为val的节点2.4删除一个值为val的节点2.5恢复…

ArkUI核心功能组件使用

1.Tabs(选项卡) 1.1 概述 Tabs组件的页面组成包含两个部分,分别是TabContent和TabBar。TabContent是内容页,TabBar是导航页签栏。 TabBar是导航页签栏,页面结构如下图所示,根据不同的导航类型,布…

Qt5 多媒体大纲

一、入门准备 基础知识 熟悉 Qt 的信号槽机制、事件循环 掌握 .pro 工程文件配置(QT multimedia multimediawidgets) 熟悉常见的音视频格式与编解码器基础 环境配置 Qt Creator Qt 5.x 确认安装了 multimedia 模块与 mediaservice 插件 熟悉调试…