Android USB开发(一)

关于USB (Universal Serial Bus)的更多信息可以到Wikipedia学习,或者查看USB Implementers Forum, Inc发布的标准,这里只对一些关键概念做简要介绍.

基本概念和术语

简单来说,USB是一个用于数据交换的总线(Bus).发启(initiate)数据交换的一方称为主机(host),另一方称为外设(peripheral),两者通过总线实现通信,由主机负责供电[1].一个USB系统里只有一个主机,但可以有多个外设,外设的主要信息记录在描述符(descriptor)里.一个外设就是一个单独的物理实体,但它却可能有多个逻辑上的设备功能(device function),比如一个网络摄像头,除了有照相机,还可能有内置的麦克风,这种外接设备也被称为复合设备(composite device)**.

主机通过管道(pipe)连接到外设的端点(endpoint),端点是指外设某一项功能的逻辑实体(logic entity),一条管道对应一个端点.一个外设最多可以有32个端点(16个进,16个出),主机会对端点初始化,给其分配相应的序号和功能,一经分配,不论管道是否关闭都不会改变.除了用于进行设备配置的0号端点,其他端点都被划分到不同的接口(interface)**,每一个接口对应一项外设功能.

管道有两种类型:
消息(message):用来进行双向(bi-directional)控制与状态获取,对传输的数据有结构上的要求.
(stream):用来进行单向(uni-directional)数据传输,不会对传输的数据进行结构上的改动.

因为通信是由主机发启的,所以inputoutput都是相对主机而言的,输入就是外设传数据给主机,输出就是主机传数据给外设.

主机有一个关键任务称为枚举(enumeration),通过枚举主机获取所有外设的描述符(descriptor),给每一个外设分配一个地址(address)**并完成其他配置,比如前文所说对端点的初始化.经过枚举之后,外设就可以使用了,如果主机重启,就会对所有连接的外设重置并再次进行枚举.

USB的数据传输模式主要有四种:
control:提供无损传输,用来传输配置/状态/命令等通信,所有的USB设备都必须支持这种传输模式.
interrupt有限延迟下保证设备的快速反应,主要用于键盘等输入设备.
bulk:用于大量数据的无损传输,但不保证带宽和延迟,比如用U盘拷贝文件.
isochronous:保证尽可能快的传输速度,但可能会有数据丢失,比如实时的音视频传输.

Android USB开发两种模式

Android设备最早都是以PC的USB外设形式而存在,主要功能就是Android fastboot 或Android Debug Bridge (adb),都是基于bulk传输模式的.

USB Host Mode

顾名思义,Android设备作为主机,需要安卓设备支持OTG接头.常见应用场景诸如连接数码相机,键盘,鼠标,游戏手柄等硬件.需要注意的是,通常安卓设备的电量作为主机是捉襟见肘的.

USB Accessory Mode

这种模式下Android设备承担外设的角色.应用场景诸如连接机器人控制器,音响,医疗器材等,当然前提是这些设备支持与Android设备连接并且遵守Android accessory communication protocol.这种模式可以让不具有host能力的Android设备与其他硬件交互.

注意:在谷歌的话语体系里,Host模式里与Android设备相连的硬件被称为USB device,Accessory模式里,与Android设备相连的硬件称为USB accessory.尽管是accessory是"附件"的意思,其承担的却是逻辑上主机(host)的角色.

Android USB开发(一)_第1张图片
G 1

  1. 很多文章里会提到设备(device)或者配件(accessory)两个术语,文末会给大家具体解释 ↩

你可能感兴趣的:(Android USB开发(一))