基於AOA協議的android USB通訊
摘 要:AOA協議是Google公司推出的用於實現Android裝置與外圍裝置之間USB通訊的協議。該協議拓展了Android裝置USB介面的功能,為基於Android系統的智慧裝置應用於資料採集和裝置控制領域提供了條件。介紹了Android系統下USB通訊的兩種模式,並給出了USB配件模式下基於AOA協議實現Android手機控制步進電機的例項。
關鍵詞:Android;AOA;USB通訊
最近業界的統計資料顯示,智慧手機與自動化及機械系統之間存在著很大的市場潛力。2011年Google推出Android開放配件協議AOA(Android Open Accessory Protocol)及配件開發工具包ADK(Accessory Development Kit)提供了Android裝置與Android配件通過USB或藍芽進行通訊的API,為基於Android系統的智慧裝置控制外設提供了條件。利用Android,系統可以連線從家用電器到重型機械、機器人等多種裝置。
Android作為一種基於開源Linux的智慧手機作業系統,廣泛應用於手機、平板電腦等移動裝置中。在各種Android裝置提供的介面中,USB介面是常見介面,該介面的作用是為Android裝置充電並通過PC端的驅動程式實現Android裝置與PC的互動。如何拓展Android裝置的USB介面功能是當前的研究熱點之一。針對該問題,本文介紹了一種基於AOA協議實現Android裝置USB通訊的方案,並通過Android手機控制步進電機的案例給出了方案的實現方法。
1 Android USB通訊模式
Android系統支援多種USB外圍裝置。根據Android裝置在USB通訊中充當的角色,可以將Android USB通訊分為主機模式(Host Mode)和配件模式(Accessory Mode)[1]兩種模式。
1.1 主機模式
主機模式是指Android裝置充當USB主機併為匯流排供電。此模式下,Android裝置需支援USB主機功能或OTG功能,此時Android裝置的USB主機稱為USB嵌入式主機EH(Embedded Host)[2]。與PC上的USB主機相比,EH裝置可能無法為連線到其總線上的未識別外圍裝置載入驅動程式,因此它們對其目標外圍裝置列表TPL(Target Peripheral List)進行了定義[3]。這些外圍USB裝置大部分為HID裝置(Human Interface Device)、BOMS裝置(Bulk Only Mass Storage,如U盤)和CDC裝置(Comm-
unication Device Class,USB通訊裝置類,如印表機),其驅動程式已存在於Android平臺的系統中(Linux Kernel),因此Android裝置可以與其直接通訊。
主機模式示意圖如圖1所示。
1.2 配件模式
配件模式是指Android裝置充當USB從機,外部裝置充當主機併為匯流排供電。此模式下,外部USB裝置稱為Android配件。該模式為不具備主機功能的Android裝置提供與USB裝置互動的能力。Android裝置和Android配件都必須支援AOA協議。不支援AOA協議的裝置可以通過Android配件開發板(ADK板)與Android裝置連線,成為Android裝置的間接配件。
配件模式示意圖如圖2所示。
本文介紹的基於AOA協議的Android裝置USB通訊方案即採用配件模式。主機模式和配件模式在Android 3.1(API level 12)及更高的平臺中直接支援。配件模式作為一個附加庫也被Android 2.3.4(API level 10)支援。裝置廠商可以選擇是否在裝置的Linux系統映象中包含附加庫。對主機和配件模式的支援最終取決於裝置的硬體,而不是Android平臺的等級(軟體)。
1.3 Android配件、ADK及AOA協議
Android配件是指遵循AOA協議的硬體,是Android配件模式中的概念。從硬體角度講,Android配件具有實現USB EH功能和AOA協議的微處理器以及包括USB介面在內的輸入/輸出介面。Android配件必須與Android平臺一起工作。
ADK是開發Android配件的參考開發包,該開發包基於Arduino公司的開源電子成型平臺[4]。ADK開發包包括Android配件硬體設計文件、Android配件韌體原始碼、Android裝置程式原始碼。
AOA協議是Android裝置與Android配件之間進行USB通訊需遵循的連線協議,該協議規定了Android配件如何檢測Android裝置並與其建立通訊。AOA協議規定配件需具備以下4項功能[5]:
(1)偵聽自身的USB介面,等待與其連線的Android裝置。
(2)檢測Android裝置是否支援AOA協議。
(3)如果需要,啟動Android裝置的USB配件模式。
(4)與Android裝置建立USB通訊。
2 USB配件模式開發
Android配件模式開發需要在Android裝置端和Android配件端分別進行開發。
2.1 Android裝置端開發
Android裝置端需進行以下兩項工作:
(1)確保裝置支援AOA協議。裝置對AOA協議是否支援由裝置硬體和Android系統版本決定。
(2)呼叫ADK中的API開發USB應用程式。
ADK中與USB配件模式相關的兩個類是UsbManager和UsbAccessory。UsbManager用於列舉連線的USB配件並與其通訊,UsbAccessory代表Android配件幷包含獲取配件描述資訊的方法。
在編寫程式前,需要為Android工程做以下設定工作[6]:
(1)配置Android Mainfest檔案,宣告使用配件模式,指定最低SDK版本,並設定配件過濾意圖。
(2)配置accessory_filter.xml檔案。accessory_filter.xml檔案用於描述希望Android裝置檢測的USB配件的描述資訊,包含manufacturer、model、version 3個屬性。在Android配件的韌體程式中,同樣包含以上3個屬性值。根據AOA協議,當Android配件連線到Android裝置上時,配件會發送該屬性值到Android裝置。Android程式將唯一響應與其accessory_filter.xml中指定的屬性值匹配的Android配件。
Android裝置端程式開發的流程如下:
(1)發現配件並過濾。
(2)獲取與配件通訊的許可權。通過廣播接收器(Broad-castReceiver)的方式以彈出授權對話方塊的形式詢問使用者是否允許與Android配件通訊。
(3)開始與配件通訊。建立檔案輸入輸出流代表USB批量傳輸端點,通過獨立執行緒以流傳輸的方式實現USB通訊。
(4)終止與配件通訊。通過廣播接收器偵聽USB配件與Android裝置的斷開操作,當事件發生時,關閉檔案輸入/輸出流。
2.2 Android配件端開發
Android配件端需進行以下兩項工作:
(1)根據ADK中的硬體設計文件設計具有USB主控制器的硬體電路,並支援USB協議。
(2)將AOA協議以韌體程式碼的形式下載至Android配件的主晶片中。
目前,已有多家公司為Android裝置的配件模式開發提供專門的ADK板,ADK板將AOA協議以程式的方式燒寫至晶片中,ADK板也即Android配件。目前常見的ADK板有Arduino的Arduino Mega ADK板、SparkFun的IOIO板,此外還有DIY Drones、Microchip、RT Corp、Seeed Studio、Troido等公司生產的ADK板。採用ADK板將可節省Android配件端的開發時間。
3 系統設計
3.1 總體設計
構建的系統框圖如圖3所示。
採用的ADK板是由英國飛特蒂亞FTDI(Future Technology Devices International Ltd.)公司生產的Android平臺USB主控模組(USB Android Host Module)[7],型號為UMFT311EV,於2012年7月31日推出。UMFT311EV板具有USB主控功能和USB介面橋接功能,其特性如下:
(1)採用USB Android主控晶片FT311D,單晶片內整合USB協議。
(2)相容USB 2.0全速模式(最大傳輸速率12 Mb/s,即1.5 MB/s,最大輸出電流500 mA)。
(3)6種介面型別,即GPIO(7路)、UART、PWM(4路)、I2C Master、SPI Master、SPI Slave。
(4)6種介面只能單一工作,通過跳線帽和3個介面型別選擇引腳選擇介面型別。
UMFT311EV板支援AOA協議,作為Android配件無需使用者做配件端的開發,而且為Android裝置端的程式開發提供Java驅動包。因此採用UMFT311EV板能夠實現Android手機、平板與其他裝置的通訊,進行裝置控制和資料採集,並能與現有系統快速整合,降低開發難度和開發時間。
在此,以Android手機小米MI2和步進電機28BYJ48為例,通過UMFT311EV板的4路GPIO口實現Android手機USB控制步進電機。
3.2 軟體設計
在設計Android手機端軟體時,採用FTDI公司為Android平臺提供的驅動包。根據該驅動包,架構如圖4所示的應用程式。
FT311驅動層提供驅動UMFT311EV板上介面的方法和實現Android應用程式與UMFT311EV板USB通訊的方法。該層為使用者層提供封裝的方法,為使用者開發程式遮蔽底層程式設計細節。使用者層通過呼叫FT311驅動層的方法實現對UMFT311EV板上介面的控制。
本實驗程式設計採用FT311驅動層提供的配置GPIO、讀GPIO、寫GPIO、重置GPIO 4個方法實現對步進電機的控制,程式流程如圖5所示。
4 系統測試
本設計中將Android手機作為脈衝訊號源和脈衝分配器,通過軟體程式設計為步進電機提供脈衝訊號,並通過驅動晶片ULN2003驅動步進電機。系統測試過程如下: