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通信的幾種方式和應用場景大概地分析了一下,如有不對的地方,希望大家批評指正!