摘 要: AOA協(xié)議是Google公司推出的用于實(shí)現(xiàn)Android設(shè)備與外圍設(shè)備之間USB通信的協(xié)議,。該協(xié)議拓展了Android設(shè)備USB接口的功能,,為基于Android系統(tǒng)的智能設(shè)備應(yīng)用于數(shù)據(jù)采集和設(shè)備控制領(lǐng)域提供了條件。介紹了Android系統(tǒng)下USB通信的兩種模式,,并給出了USB配件模式下基于AOA協(xié)議實(shí)現(xiàn)Android手機(jī)控制步進(jìn)電機(jī)的實(shí)例,。
關(guān)鍵詞: Android;AOA,;USB通信
最近業(yè)界的統(tǒng)計(jì)數(shù)據(jù)顯示,,智能手機(jī)與自動(dòng)化及機(jī)械系統(tǒng)之間存在著很大的市場(chǎng)潛力。2011年Google推出Android開(kāi)放配件協(xié)議AOA(Android Open Accessory Protocol)及配件開(kāi)發(fā)工具包ADK(Accessory Development Kit)提供了Android設(shè)備與Android配件通過(guò)USB或藍(lán)牙進(jìn)行通信的API,,為基于Android系統(tǒng)的智能設(shè)備控制外設(shè)提供了條件,。利用Android,系統(tǒng)可以連接從家用電器到重型機(jī)械,、機(jī)器人等多種設(shè)備,。
Android作為一種基于開(kāi)源Linux的智能手機(jī)操作系統(tǒng),廣泛應(yīng)用于手機(jī),、平板電腦等移動(dòng)設(shè)備中,。在各種Android設(shè)備提供的接口中,USB接口是常見(jiàn)接口,,該接口的作用是為Android設(shè)備充電并通過(guò)PC端的驅(qū)動(dòng)程序?qū)崿F(xiàn)Android設(shè)備與PC的交互,。如何拓展Android設(shè)備的USB接口功能是當(dāng)前的研究熱點(diǎn)之一。針對(duì)該問(wèn)題,,本文介紹了一種基于AOA協(xié)議實(shí)現(xiàn)Android設(shè)備USB通信的方案,,并通過(guò)Android手機(jī)控制步進(jìn)電機(jī)的案例給出了方案的實(shí)現(xiàn)方法。
1 Android USB通信模式
Android系統(tǒng)支持多種USB外圍設(shè)備,。根據(jù)Android設(shè)備在USB通信中充當(dāng)?shù)慕巧?,可以將Android USB通信分為主機(jī)模式(Host Mode)和配件模式(Accessory Mode)[1]兩種模式。
1.1 主機(jī)模式
主機(jī)模式是指Android設(shè)備充當(dāng)USB主機(jī)并為總線供電,。此模式下,,Android設(shè)備需支持USB主機(jī)功能或OTG功能,此時(shí)Android設(shè)備的USB主機(jī)稱為USB嵌入式主機(jī)EH(Embedded Host)[2],。與PC上的USB主機(jī)相比,,EH設(shè)備可能無(wú)法為連接到其總線上的未識(shí)別外圍設(shè)備加載驅(qū)動(dòng)程序,,因此它們對(duì)其目標(biāo)外圍設(shè)備列表TPL(Target Peripheral List)進(jìn)行了定義[3]。這些外圍USB設(shè)備大部分為HID設(shè)備(Human Interface Device),、BOMS設(shè)備(Bulk
Only Mass Storage,,如U盤)和CDC設(shè)備(Comm-
unication Device Class,USB通信設(shè)備類,,如打印機(jī)),,其驅(qū)動(dòng)程序已存在于Android平臺(tái)的系統(tǒng)中(Linux Kernel),因此Android設(shè)備可以與其直接通信,。
主機(jī)模式示意圖如圖1所示,。
1.2 配件模式
配件模式是指Android設(shè)備充當(dāng)USB從機(jī),外部設(shè)備充當(dāng)主機(jī)并為總線供電,。此模式下,,外部USB設(shè)備稱為Android配件。該模式為不具備主機(jī)功能的Android設(shè)備提供與USB設(shè)備交互的能力,。Android設(shè)備和Android配件都必須支持AOA協(xié)議。不支持AOA協(xié)議的設(shè)備可以通過(guò)Android配件開(kāi)發(fā)板(ADK板)與Android設(shè)備連接,,成為Android設(shè)備的間接配件,。
配件模式示意圖如圖2所示。
本文介紹的基于AOA協(xié)議的Android設(shè)備USB通信方案即采用配件模式,。主機(jī)模式和配件模式在Android 3.1(API level 12)及更高的平臺(tái)中直接支持,。配件模式作為一個(gè)附加庫(kù)也被Android 2.3.4(API level 10)支持。設(shè)備廠商可以選擇是否在設(shè)備的Linux系統(tǒng)鏡像中包含附加庫(kù),。對(duì)主機(jī)和配件模式的支持最終取決于設(shè)備的硬件,,而不是Android平臺(tái)的等級(jí)(軟件)。
1.3 Android配件,、ADK及AOA協(xié)議
Android配件是指遵循AOA協(xié)議的硬件,,是Android配件模式中的概念。從硬件角度講,,Android配件具有實(shí)現(xiàn)USB EH功能和AOA協(xié)議的微處理器以及包括USB接口在內(nèi)的輸入/輸出接口,。Android配件必須與Android平臺(tái)一起工作。
ADK是開(kāi)發(fā)Android配件的參考開(kāi)發(fā)包,,該開(kāi)發(fā)包基于Arduino公司的開(kāi)源電子成型平臺(tái)[4],。ADK開(kāi)發(fā)包包括Android配件硬件設(shè)計(jì)文檔、Android配件固件源碼,、Android設(shè)備程序源碼,。
AOA協(xié)議是Android設(shè)備與Android配件之間進(jìn)行USB通信需遵循的連接協(xié)議,該協(xié)議規(guī)定了Android配件如何檢測(cè)Android設(shè)備并與其建立通信,。AOA協(xié)議規(guī)定配件需具備以下4項(xiàng)功能[5]:
(1)偵聽(tīng)自身的USB接口,,等待與其連接的Android設(shè)備,。
(2)檢測(cè)Android設(shè)備是否支持AOA協(xié)議。
(3)如果需要,,啟動(dòng)Android設(shè)備的USB配件模式,。
(4)與Android設(shè)備建立USB通信。
2 USB配件模式開(kāi)發(fā)
Android配件模式開(kāi)發(fā)需要在Android設(shè)備端和Android配件端分別進(jìn)行開(kāi)發(fā),。
2.1 Android設(shè)備端開(kāi)發(fā)
Android設(shè)備端需進(jìn)行以下兩項(xiàng)工作:
(1)確保設(shè)備支持AOA協(xié)議,。設(shè)備對(duì)AOA協(xié)議是否支持由設(shè)備硬件和Android系統(tǒng)版本決定。
(2)調(diào)用ADK中的API開(kāi)發(fā)USB應(yīng)用程序,。
ADK中與USB配件模式相關(guān)的兩個(gè)類是UsbManager和UsbAccessory,。UsbManager用于枚舉連接的USB配件并與其通信,UsbAccessory代表Android配件并包含獲取配件描述信息的方法,。
在編寫程序前,,需要為Android工程做以下設(shè)置工作[6]:
(1)配置Android Mainfest文件,聲明使用配件模式,,指定最低SDK版本,,并設(shè)置配件過(guò)濾意圖。
(2)配置accessory_filter.xml文件,。accessory_filter.xml文件用于描述希望Android設(shè)備檢測(cè)的USB配件的描述信息,,包含manufacturer、model,、version 3個(gè)屬性,。在Android配件的固件程序中,同樣包含以上3個(gè)屬性值,。根據(jù)AOA協(xié)議,,當(dāng)Android配件連接到Android設(shè)備上時(shí),配件會(huì)發(fā)送該屬性值到Android設(shè)備,。Android程序?qū)⑽ㄒ豁憫?yīng)與其accessory_filter.xml中指定的屬性值匹配的Android配件,。
Android設(shè)備端程序開(kāi)發(fā)的流程如下:
(1)發(fā)現(xiàn)配件并過(guò)濾。
(2)獲取與配件通信的權(quán)限,。通過(guò)廣播接收器(Broad-castReceiver)的方式以彈出授權(quán)對(duì)話框的形式詢問(wèn)用戶是否允許與Android配件通信。
(3)開(kāi)始與配件通信,。創(chuàng)建文件輸入輸出流代表USB批量傳輸端點(diǎn),,通過(guò)獨(dú)立線程以流傳輸?shù)姆绞綄?shí)現(xiàn)USB通信。
(4)終止與配件通信,。通過(guò)廣播接收器偵聽(tīng)USB配件與Android設(shè)備的斷開(kāi)操作,,當(dāng)事件發(fā)生時(shí),關(guān)閉文件輸入/輸出流,。
2.2 Android配件端開(kāi)發(fā)
Android配件端需進(jìn)行以下兩項(xiàng)工作:
(1)根據(jù)ADK中的硬件設(shè)計(jì)文檔設(shè)計(jì)具有USB主控制器的硬件電路,,并支持USB協(xié)議,。
(2)將AOA協(xié)議以固件代碼的形式下載至Android配件的主芯片中。
目前,,已有多家公司為Android設(shè)備的配件模式開(kāi)發(fā)提供專門的ADK板,,ADK板將AOA協(xié)議以程序的方式燒寫至芯片中,ADK板也即Android配件,。目前常見(jiàn)的ADK板有Arduino的Arduino Mega ADK板,、SparkFun的IOIO板,此外還有DIY Drones,、Microchip,、RT Corp、Seeed Studio,、Troido等公司生產(chǎn)的ADK板,。采用ADK板將可節(jié)省Android配件端的開(kāi)發(fā)時(shí)間。
3 系統(tǒng)設(shè)計(jì)
3.1 總體設(shè)計(jì)
構(gòu)建的系統(tǒng)框圖如圖3所示,。
采用的ADK板是由英國(guó)飛特蒂亞FTDI(Future Technology Devices International Ltd.)公司生產(chǎn)的Android平臺(tái)USB主控模塊(USB Android Host Module)[7],,型號(hào)為UMFT311EV,于2012年7月31日推出,。UMFT311EV板具有USB主控功能和USB接口橋接功能,,其特性如下:
(1)采用USB Android主控芯片F(xiàn)T311D,單芯片內(nèi)集成USB協(xié)議,。
(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種接口只能單一工作,,通過(guò)跳線帽和3個(gè)接口類型選擇引腳選擇接口類型,。
UMFT311EV板支持AOA協(xié)議,作為Android配件無(wú)需用戶做配件端的開(kāi)發(fā),,而且為Android設(shè)備端的程序開(kāi)發(fā)提供Java驅(qū)動(dòng)包,。因此采用UMFT311EV板能夠?qū)崿F(xiàn)Android手機(jī)、平板與其他設(shè)備的通信,,進(jìn)行設(shè)備控制和數(shù)據(jù)采集,,并能與現(xiàn)有系統(tǒng)快速集成,,降低開(kāi)發(fā)難度和開(kāi)發(fā)時(shí)間。
在此,,以Android手機(jī)小米MI2和步進(jìn)電機(jī)28BYJ48為例,,通過(guò)UMFT311EV板的4路GPIO口實(shí)現(xiàn)Android手機(jī)USB控制步進(jìn)電機(jī)。
3.2 軟件設(shè)計(jì)
在設(shè)計(jì)Android手機(jī)端軟件時(shí),,采用FTDI公司為Android平臺(tái)提供的驅(qū)動(dòng)包,。根據(jù)該驅(qū)動(dòng)包,架構(gòu)如圖4所示的應(yīng)用程序,。
FT311驅(qū)動(dòng)層提供驅(qū)動(dòng)UMFT311EV板上接口的方法和實(shí)現(xiàn)Android應(yīng)用程序與UMFT311EV板USB通信的方法,。該層為用戶層提供封裝的方法,為用戶開(kāi)發(fā)程序屏蔽底層編程細(xì)節(jié),。用戶層通過(guò)調(diào)用FT311驅(qū)動(dòng)層的方法實(shí)現(xiàn)對(duì)UMFT311EV板上接口的控制,。
本實(shí)驗(yàn)編程采用FT311驅(qū)動(dòng)層提供的配置GPIO、讀GPIO,、寫GPIO,、重置GPIO 4個(gè)方法實(shí)現(xiàn)對(duì)步進(jìn)電機(jī)的控制,程序流程如圖5所示,。
4 系統(tǒng)測(cè)試
本設(shè)計(jì)中將Android手機(jī)作為脈沖信號(hào)源和脈沖分配器,,通過(guò)軟件編程為步進(jìn)電機(jī)提供脈沖信號(hào),并通過(guò)驅(qū)動(dòng)芯片ULN2003驅(qū)動(dòng)步進(jìn)電機(jī),。系統(tǒng)測(cè)試過(guò)程如下: