1、概述
自Android3.1(API Level 12)版本开始,Android系统直接支持USB主机模式和从机模式,同时为能够使更广泛的设备支持USB从机模式,Google官方还提供了相应的开发库向后兼容至Android2.3.4(API Level 10)版本。至于在之前的Android版本没有直接提供USB通信支持时,我们只能使用ADB的方式来实现Android设备与其他的设备通过USB线进行通信(Android设备只能以从机的方式接入,因为之前的Android设备都不支持OTG),而这也是到目前为止Android设备与PC通过USB线进行通信的唯一方式(常见的案例有豌豆荚、360手机助手等)。
注意:以上关于Android设备支持USB主机模式和从机模式的支持方式只是软支持,另外还须有硬件支持,并且硬件对两种模式的支持具有决定性。
2、Android USB Host Mode(USB 主机模式)
之所以把Android USB Host Mode放在第一个说是因为Android设备要提供对它的支持所需要的条件最多,相信大家看了Android USB Host Mode后,大概对其他两种方式就有了个大概的估计。我们先来看看Android USB Host Mode通信方式的简单原理图:
Android USB主机模式原理图
在Android USB Host Mode中,我们的Android设备充当USB主机并为整个总线供电,接入Android设备的其他USB设备充当从机的角色。在该模式下,我们的Android设备必须支持以下条件:
1、Android系统版本3.1(API Level 12)及以上。在概述中我们也提到,自Android3.1(API Level 12)开始才提供Android USB Host Mode的支持。
2、Android设备须支持OTG功能。我们的智能手机和相机等移动设备本身是无法像PC那样直接充当USB Host为总线供电的,而OTG正是为解决此类问题而生,目前主流的Android手机和平板都已添加OTG模块。在主机模式下,我们将Android设备上的USB主机模块又称为USB嵌入式主机(Embedded Host 简称 EH)。EH无法像PC上的USB主机一样,为接入总线的未识别外围设备加载驱动程序,所以EH设备提前在系统中对其目标外围设备列表TPL(Target Peripheral List)进行了定义,在这些外围USB设备中大部分是HID设备(Human Interface Device,如游戏手柄)、BOMS设备(Bulk Only Mass Storage,如读卡器、U盘)和CDC设备(Communication Device Class,USB通信设备类,如打印机、相机),其驱动程序已存在于Android平台的系统中(Linux Kernel),Android设备可以直接与这些设备直接通信。
3、支持AOA协议。AOA协议(Android Open Accessory Protocol,Android开发配件协议)是Google公司推出的用于实现Android设备与外围设备之间进行USB通信的协议,该协议拓展了Android设备USB接口的功能,为基于Android系统的智能设备应用于设备控制和数据采集领域提供了条件。关于AOA协议的固件源码烧写于硬件中,我们有时也把这项称作为Android设备的硬件支持。(该条件仅在接入Android设备外围设备是另一台Android设备时需要,当接入像U盘或打印机时,可不需要AOA协议的支持)
4、系统features.xml文件中提供了关于<uses-featureandroid:name="android.hardware.usb.host"/> 的定义。在使用Android USB Host Mode开发时,我们会在应用程序的AndroidMainifast.xml文件中指定<uses-featureandroid:name="android.hardware.usb.host"/> 用来对不支持Android USB Host Mode的设备进行过滤,Android系统版本3.1及以上默认支持,但是不排除设备商会对原生的Android系统进行裁剪,可能会裁剪掉features.xml文件中关于<uses-featureandroid:name="android.hardware.usb.host"/>的定义,也就是说当应用程序安装时来扫描系统的硬件支持feature时,发现没有关于<uses-featureandroid:name="android.hardware.usb.host"/>的定义,认为该设备不支持Android USB Host Mode,也就会提示你无法安装了。
3、Android USB Accessory Mode(USB 从机模式)
Android USB Accessory Mode又被称为Android USB配件模式或Android USB外设模式。在Android USB Accessory Mode中,我们的Android设备充当USB从机,而接入的外围设备充当主机并为总线供电。在该模式中,我们习惯称外围设备为Android配件,该模式主要为不具备Android USB Host Mode的Android设备提供与其他USB设备交互的功能。我们先来看看Android USB Accessory Mode通信方式的简单原理图:
Android USB从机模式原理图
从上面的原理图中我们可以看到,相比在Android USB Host Mode中,Android设备与外围设备的角色进行了互换,就像我们的Android设备以外围设备的方式接入了另外一台Android设备一样。在该模式下我们的Android设备必须支持以下条件:
1、Android系统版本2.3.4(API Level 10)及以上。在概述中我们也提到,自Android3.1(API Level 12)开始才直接提供对Android USB Accessory Mode的支持,同时Google提供的配件开发工具包ADK(Accessory Development Kit)提供了Android设备与Android配件通过USB通信的API,该ADK包能够向后兼容至Android2.3.4系统版本。(Android 3.1及以上的系统之所以能够直接支持也是因为系统直接封装了ADK的API)
2、必须支持AOA协议。在Android USB Accessory Mode中,Android设备必须支持AOA协议,因为当Android设备以从机的方式接入Android配件时,Android配件会通过AOA协议检测并初始化Android设备的USB通信的环境和启动Android设备的USB从机模式。
3、系统features.xml文件中提供了关于<uses-featureandroid:name="android.hardware.usb.accessory"/> 的定义。关于该条件与Android USB Host Mode中的原因一致,这里不再赘述。
同样地,在该模式下我们的Android配件也必须支持以下条件:
1、具有USB主控制的硬件电路(USB主机功能)并支持USB协议。在USB通信中总得有一方为总线供电。
2、已将AOA协议的固件源码烧写至Android配件的主芯片中。换句话说,Android配件也得支持AOA协议。
当Android设备和Android配件满足各自的条件后,那么它们之间就可以通过USB进行通信了,而通信的关键就在于AOA协议。
4、Android ADB(Android Debug Bridge)
该方式主要是为满足Android设备与PC通过USB进行通信,之前我也说过这是Android设备与PC进行USB通信的唯一方式,所以想实现Android设备与PC之间通过USB通信的同学们只有这种选择了。那么,在该方式下,我们的Android设备基本上不需要提供其他的什么条件支持,只需要打开设置中的调试模式即可。(必须打开调试模式,有闲的无聊的同学可以试试将手机上的USB调试关闭,然后你会发现PC上的豌豆荚和360手机助手这类的工具永远都连不上手机,因为关闭了手机上adbd系统服务,肯定是连不上的)。
虽然我们的Android设备不需要什么条件支持,但是我们的PC却需要以下条件:
1、正确安装了该Android设备的驱动程序(有点废话)。
2、PC上运行了封装有dbmlib库的程序,如DDMS工具、豌豆荚和360手机助手等(实际与Android设备进行通信的是adb服务进程,已封装在ddmlib库中)。
好了,有关Android USB通信的几种方式和应用场景大概地分析了一下,如有不对的地方,希望大家批评指正!