在Java應(yīng)用程序中訪問(wèn)USB設(shè)備_第1頁(yè)
在Java應(yīng)用程序中訪問(wèn)USB設(shè)備_第2頁(yè)
在Java應(yīng)用程序中訪問(wèn)USB設(shè)備_第3頁(yè)
在Java應(yīng)用程序中訪問(wèn)USB設(shè)備_第4頁(yè)
在Java應(yīng)用程序中訪問(wèn)USB設(shè)備_第5頁(yè)
已閱讀5頁(yè),還剩9頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

在Java應(yīng)用程序中訪問(wèn)USB設(shè)備在本文通過(guò)提供使Java應(yīng)用程序可以使用USB設(shè)備的API而使這個(gè)過(guò)程變得更容易.Java平臺(tái)一直都以其平臺(tái)無(wú)關(guān)性自豪。雖然這種無(wú)關(guān)性有許多好處,但是它也使得編寫與硬件交互的Java應(yīng)用程序的過(guò)程變得相當(dāng)復(fù)雜。在本文中,研究科學(xué)家蔣清野討論了兩個(gè)項(xiàng)目,它們通過(guò)提供使Java應(yīng)用程序可以使用USB設(shè)備的API而使這個(gè)過(guò)程變得更容易。雖然這兩個(gè)項(xiàng)目仍然處于萌芽狀態(tài),但是它們都顯示了良好的前景,并已經(jīng)成為一些實(shí)用應(yīng)用程序的基礎(chǔ)。通用串行總線(UniversalSerialBusUSB)規(guī)范的第一個(gè)版本發(fā)表于1996年1月。因?yàn)樗牡统杀尽⒏邤?shù)據(jù)傳輸率、使用容易和靈活性,USB在計(jì)算機(jī)行業(yè)里獲得了廣泛接受。今天,許多周邊設(shè)備和裝置都是通過(guò)USB接口連接到計(jì)算機(jī)上的。目前,大多數(shù)一般用途的操作系統(tǒng)都提供了對(duì)USB設(shè)備的支持,并且用C或者C++可以相對(duì)容易地開(kāi)發(fā)訪問(wèn)這些外設(shè)的應(yīng)用程序。不過(guò),Java編程語(yǔ)言在設(shè)計(jì)上對(duì)硬件訪問(wèn)提供的支持很少,所以編寫與USB設(shè)備交互的應(yīng)用程序是相當(dāng)困難的。IBM的DanStreetman最早開(kāi)始了在Java語(yǔ)言中提供對(duì)USB設(shè)備的訪問(wèn)的努力。2001年,他的項(xiàng)目通過(guò)Java規(guī)范請(qǐng)求(JavaSpecificationRequest,JSR)過(guò)程被接受為Java語(yǔ)言的候選擴(kuò)展標(biāo)準(zhǔn)。這個(gè)項(xiàng)目現(xiàn)在稱為JSR-80并且指定了官方包javax.usb。同時(shí),在2000年6月,MojoJojo和DavidBrownell在SourceForge開(kāi)始了jUSB項(xiàng)目。這兩個(gè)項(xiàng)目都開(kāi)發(fā)出了Linux開(kāi)發(fā)人員可以使用的包,盡管它們都還很不完善。這兩個(gè)項(xiàng)目也都開(kāi)始試圖向其他操作系統(tǒng)上的Java應(yīng)用程序提供對(duì)USB設(shè)備的訪問(wèn),盡管它們都還沒(méi)有開(kāi)發(fā)出可以使用的包(參閱參考資料中有關(guān)本文中討論的這兩個(gè)項(xiàng)目及其他項(xiàng)目的資料)。在本文中,將對(duì)jUSB和JSR-80項(xiàng)目作一個(gè)簡(jiǎn)要介紹,不過(guò),我們首先要看一下USB協(xié)議的具體細(xì)節(jié),這樣您就可以理解這兩個(gè)項(xiàng)目是如何與USB設(shè)備交互的。我們還將提供代碼片段以展示如何用這兩個(gè)項(xiàng)目的API訪問(wèn)USB設(shè)備。USB介紹1994年,一個(gè)由四個(gè)行業(yè)伙伴(Compaq、Intel、Microsoft和NEC)組成的聯(lián)盟開(kāi)始制定USB協(xié)議。該協(xié)議最初的目的是將PC與電話相連并提供容易擴(kuò)展和重新配置的I/O接口。1996年1月,發(fā)表了USB規(guī)范的第一個(gè)版本,1998年9月發(fā)表了后續(xù)版本(版本1.1)。這個(gè)規(guī)范允許127臺(tái)設(shè)備同時(shí)連接到一起,總的通信帶寬限制為12Mbps。后來(lái),又有三個(gè)成員(Hewlett-Packard、Lucent和Philips)加入了這個(gè)聯(lián)盟。2000年4月,發(fā)表了USB規(guī)范的2.0版本,它支持高達(dá)480Mbps的傳輸率。今天,USB在高速(視頻、圖像、儲(chǔ)存和全速(音頻、寬帶、麥克風(fēng)數(shù)據(jù)傳輸應(yīng)用中起了關(guān)鍵作用。它還使各種低速設(shè)備:鍵盤、鼠標(biāo)、游戲外設(shè)、虛擬現(xiàn)實(shí)外設(shè))連接到PC上。USB協(xié)議有嚴(yán)格的層次結(jié)構(gòu)。在所有USB系統(tǒng)中,只有一個(gè)主設(shè)備,到主計(jì)算機(jī)的的USB接口稱為主控器(hostcontroller)。主控器有兩個(gè)標(biāo)準(zhǔn)??開(kāi)放主控器接口(Compaq的OpenHostControllerInterface,OHCI)和通用主控器接口(Intel的UniversalHostController

Interface,UHCI)。這兩個(gè)標(biāo)準(zhǔn)提供了同樣的能力,并可用于所有的USB設(shè)備,UHCI的硬件實(shí)現(xiàn)更簡(jiǎn)單一些,但是需要更復(fù)雜的設(shè)備驅(qū)動(dòng)程序(因而CPU的負(fù)荷更大一些)。USB物理互連是分層的星形拓樸,最多有七層。一個(gè)hub是每個(gè)星形的中心,USB主機(jī)被認(rèn)為是roothub。每一段連線都是hub與USB設(shè)備的點(diǎn)對(duì)點(diǎn)連接,后者可以是為系統(tǒng)提供更多附加點(diǎn)的另一個(gè)hub,也可以是一個(gè)提供功能的某種設(shè)備。主機(jī)使用主/從協(xié)議與USB設(shè)備通信。這種方式解決了包沖突的問(wèn)題,但是同時(shí)也阻止了附加的設(shè)備彼此建立直接通信。所有傳輸?shù)臄?shù)據(jù)都是由主控器發(fā)起的。數(shù)據(jù)從主機(jī)流向設(shè)備稱為下行(downstream)或者輸出(out)傳輸,數(shù)據(jù)從設(shè)備流向主機(jī)稱為上行(upstream)或者輸入(市)傳輸。數(shù)據(jù)傳輸發(fā)生在主機(jī)和USB設(shè)備上特定的端點(diǎn)(endpoint)之間,主機(jī)與端點(diǎn)之間的數(shù)據(jù)鏈接稱為管道(pipe)。一個(gè)給定的USB設(shè)備可以有許多個(gè)端點(diǎn),主機(jī)與設(shè)備之間數(shù)據(jù)管道的數(shù)量與該設(shè)備上端點(diǎn)的數(shù)量相同。一個(gè)管道可以是單向或者是雙向的,一個(gè)管道中的數(shù)據(jù)流與所有其他管道中的數(shù)據(jù)流無(wú)關(guān)。USB網(wǎng)絡(luò)中的通信可以使用下面四種數(shù)據(jù)傳輸類型中的任意一種:控制傳輸:這些是一些短的數(shù)據(jù)包,用于設(shè)備控制和配置,特別是在設(shè)備附加到主機(jī)上時(shí)。批量傳輸:這些是數(shù)量相對(duì)大的數(shù)據(jù)包。像掃描儀或者SCSI適配器這樣的設(shè)備使用這種傳輸類型。中斷傳輸:這些是定期輪詢的數(shù)據(jù)包。主控器會(huì)以特定的間隔自動(dòng)發(fā)出一個(gè)中斷。等時(shí)傳輸:這些是實(shí)時(shí)的數(shù)據(jù)流,它們對(duì)帶寬的要求高于可靠性要求。音頻和視頻設(shè)備一般使用這種傳輸類型。像串行端口一樣,計(jì)算機(jī)上每一個(gè)USB端口都由USB控制器指定了一個(gè)惟一的標(biāo)識(shí)數(shù)字(端口ID)。當(dāng)USB設(shè)備附加到USB端口上時(shí),就將這個(gè)惟一端口ID分配給這臺(tái)設(shè)備,并且USB控制器會(huì)讀取設(shè)備描述符。設(shè)備描述符包括適用于該設(shè)備的全局信息、以及設(shè)備的配置信息。配置定義了一臺(tái)USB設(shè)備的功能和I/O行為。一臺(tái)USB設(shè)備可以有一個(gè)或者多個(gè)配置,這由它們相應(yīng)的配置描述符所描述。每一個(gè)配置都有一個(gè)或者多個(gè)接口,它可以視為一個(gè)物理通信渠道;每一個(gè)接口有零個(gè)或者多個(gè)端點(diǎn),它可以是數(shù)據(jù)提供者或者數(shù)據(jù)消費(fèi)者,或者同時(shí)具有這兩種身份。接口由接口描述符描述,端點(diǎn)由端點(diǎn)描述符描述。并且一臺(tái)USB設(shè)備可能還有字符串描述符以提供像廠商名、設(shè)備名或者序列號(hào)這樣的附加信息。正如您所看到的,像USB這樣的協(xié)議為使用Java這種強(qiáng)調(diào)平臺(tái)和硬件無(wú)關(guān)性的語(yǔ)言的開(kāi)發(fā)人員提出了挑戰(zhàn)?,F(xiàn)在讓我們看兩個(gè)試圖解決這個(gè)問(wèn)題的項(xiàng)目。jUSBAPI

jUSB項(xiàng)目是由MojoJojo和DavidBrownell于2000年6月創(chuàng)立的。其目標(biāo)是提供一組免費(fèi)的、在Linux平臺(tái)上訪問(wèn)USB設(shè)備的JavaAPI。這個(gè)API是按照LesserGPL(LGPL)條款發(fā)表的,這意味著您可以在專有和免費(fèi)軟件項(xiàng)目中使用它。這個(gè)API提供了對(duì)多個(gè)物理USB設(shè)備的多線程訪問(wèn),并支持本機(jī)和遠(yuǎn)程設(shè)備。具有多個(gè)接口的設(shè)備可以同時(shí)被多個(gè)應(yīng)用程序(或者設(shè)備驅(qū)動(dòng)程序)所訪問(wèn),其中每一個(gè)應(yīng)用程序(或者設(shè)備驅(qū)動(dòng)程序)都占據(jù)一個(gè)不同的接口。該API支持控制傳輸、批量傳輸和中斷傳輸,不支持等時(shí)傳輸,因?yàn)榈葧r(shí)傳輸用于媒體數(shù)據(jù)(如音頻和視頻),JMFAPI已經(jīng)在其他標(biāo)準(zhǔn)設(shè)備驅(qū)動(dòng)程序上對(duì)此提供了很好的支持(參閱參考資料)。當(dāng)前,該API可以在具有Linux2.4核心或者以前的2.2.18核心的GNU/Linux版本上工作。因此可支持大多數(shù)最新的版本,例如,該API可以在沒(méi)有任何補(bǔ)丁或者升級(jí)的RedHat7.2和9.0上工作。jUSBAPI包括以下包:?usb.core:這個(gè)包是jUSBAPI的核心部分。它使得Java應(yīng)用程序可以從USB主機(jī)訪問(wèn)USB設(shè)備。?usb.linux:這個(gè)包包含usb.core.Host對(duì)象的Linux實(shí)現(xiàn)、bootstrapping支持和其他可以提升LinuxUSB支持的類。這個(gè)實(shí)現(xiàn)通過(guò)虛擬USB文件系統(tǒng)(usbdevfs)訪問(wèn)USB設(shè)備。?usb.windows:這個(gè)包包含usb.core.Host對(duì)象的Windows實(shí)現(xiàn)、bootstrapping支持和其他可以提升WindowsUSB支持的類。這個(gè)實(shí)現(xiàn)仍然處于非常初級(jí)的階段。?usb.remote:這個(gè)包是usb.coreAPI的遠(yuǎn)程版本。它包括一個(gè)RMIproxy和一個(gè)daemon應(yīng)用程序,它讓Java應(yīng)用程序可以訪問(wèn)遠(yuǎn)程計(jì)算機(jī)上的USB設(shè)備。?usb.util:這個(gè)包提供了一些有用的實(shí)用程序,可以將firmware下載到USB設(shè)備上、將USB系統(tǒng)的內(nèi)容轉(zhuǎn)儲(chǔ)到XML中、以及將只有bulkI/O的USB設(shè)備工具轉(zhuǎn)換成一個(gè)套接字(socket)o?usb.devices:這個(gè)可選包收集了用jUSBAPI訪問(wèn)不同USB設(shè)備的Java代碼,包括柯達(dá)數(shù)碼相機(jī)和Rio500MP3播放器。這些API經(jīng)過(guò)特別編寫以簡(jiǎn)化訪問(wèn)特定USB設(shè)備的過(guò)程,并且不能用于訪問(wèn)其他設(shè)備。這些API是在usb.coreAPI之上構(gòu)建的,它們可以工作在所有支持jUSB的操作系統(tǒng)上。?usb.view:這個(gè)可選包提供了基于Swing的USB樹(shù)簡(jiǎn)單瀏覽器。它是一個(gè)展示jUSBAPI應(yīng)用的很好的示例程序。盡管usb.core.Host對(duì)象的實(shí)現(xiàn)對(duì)于不同的操作系統(tǒng)是不同的,但是Java程序員只需要理解usb.core包就可以用jUSBAPI開(kāi)始應(yīng)用程序的開(kāi)發(fā)。表1列出了usb.core的接口和類,Java程序員應(yīng)該熟悉它們:表1.jUSB中的接口和類

接口/類說(shuō)明Bus將一組USB設(shè)備連接到Host上Host表示具有一個(gè)或者多個(gè)Bus的USB控制器Configuration提供對(duì)設(shè)備所支持的USB配置的訪問(wèn),以及對(duì)與該配置關(guān)聯(lián)的接口的訪問(wèn)Descriptor具有USB類型的描述符的實(shí)體的基類Device提供對(duì)USB設(shè)備的訪問(wèn)DeviceDescriptor提供對(duì)USB設(shè)備描述符的訪問(wèn)EndPoint提供對(duì)USB端點(diǎn)描述符的訪問(wèn)、在給定設(shè)備配置中構(gòu)造設(shè)備數(shù)據(jù)輸入或者輸出HostFactory包含bootstrapping方法Hub提供對(duì)USBhub描述符以及一些hub操作的訪問(wèn)Interface描述一組端點(diǎn),并與一個(gè)特定設(shè)備配置相關(guān)聯(lián)PortIdentifier為USB設(shè)備提供穩(wěn)定的字符串標(biāo)識(shí)符,以便在操作和故障診斷時(shí)使用用jUSBAPI訪問(wèn)一臺(tái)USB設(shè)備的正常過(guò)程如下:?通過(guò)從HostFactory得到USBHost進(jìn)行Bootstrap0?從Host訪問(wèn)USBBus,然后從這個(gè)Bus訪問(wèn)USBroothub(即USBDevice)0?得到hub上可用的USB端口數(shù)量,遍歷所有端口以找到正確的Device。?訪問(wèn)附加到特定端口上的USBDevice??梢杂靡慌_(tái)Device的Portidentifier直接從Host訪問(wèn)它,也可以通過(guò)從roothub開(kāi)始遍歷USBBus找到它。.用ControlMessage與該Device直接交互,或者從該Device的當(dāng)前Configuration中要求一個(gè)Interface,并與該Interface上可用的Endpoint進(jìn)行I/O。清單1展示了如何用jUSBAPI獲得USB系統(tǒng)中的內(nèi)容。這個(gè)程序編寫為只是查看roothub上可用的USB設(shè)備,但是很容易將它改為遍歷整個(gè)USB樹(shù)。這里的邏輯對(duì)應(yīng)于上述步驟1到步驟4o清單1.用jUSBAPI獲得USB系統(tǒng)的內(nèi)容importusb.core.*;publicclassListUSB{publicstaticvoidmain(String[]args){

try{//BootstrapbygettingtheUSBHostfromtheHostFactory.Hosthost=HostFactory.getHost();//ObtainalistoftheUSBbusesavailableontheHost.Bus[]bus=host.getBusses();inttotal_bus=bus.length;//TraversethroughalltheUSBbuses.for(inti=0;i<>{//AccesstheroothubontheUSBbusandobtainthe//numberofUSBportsavailableontheroothub.Deviceroot=bus[i].getRootHub();inttotal_port=root.getNumPorts();//TraversethroughalltheUSBportsavailableonthe//roothub.Itshouldbementionedthatthenumbering//startsfrom1,not0.for(intj=1;j<=total_port;j++){//ObtaintheDeviceconnectedtotheport.Devicedevice=root.getChild(j);if(device!=null){

//USBdeviceavailable,dosomethinghere.}}}}catch(Exceptione){System.out.println(e.getMessage());}}清單2展示了在應(yīng)用程序成功地找到了Device的條件下,如何與Interface和EndPoint進(jìn)行批量I/O。這個(gè)代碼段也可以修改為執(zhí)行控制或者中斷I/O。它對(duì)應(yīng)于上述步驟5。清單2.用jUSBAPI執(zhí)行批量I/Oif(device!=null){//ObtainthecurrentConfigurationofthedeviceandthenumberof//InterfacesavailableunderthecurrentConfiguration.Configurationconfig=device.getConfiguration();inttotal_interface=config.getNumInterfaces();//TraversethroughtheInterfacesfor(intk=0;k<>{//AccessthecurrentlyInterfaceandobtainthenumberof//endpointsavailableontheInterface.

Interfaceitf=config.getInterface(k,0);inttotal_ep=itf.getNumEndpoints();//Traversethroughalltheendpoints.//Accesstheendpoint,andobtainitsI/Otype.Endpointep=itf.getEndpoint(l);Stringio_type=ep.getType();booleaninput=ep.isInput();//Iftheendpointisaninputendpoint,obtainits//InputStreamandreadindata.5InputStreamin;in=ep.getInputStream();//Readindataherein.close();},?__s//OutputStreamandwriteoutdata.elseO…;

out=ep.getOutputStream();//Writeoutdatahere.out.close();}}}}jUSB項(xiàng)目在2000年6月到2001年2月期間非?;钴S。該API的最新的版本0.4.4發(fā)表于2001年2月14日。從那以后只提出了很少的改進(jìn),原因可能是IBM小組成功地成為了Java語(yǔ)言的候選擴(kuò)展標(biāo)準(zhǔn)。不過(guò),基于jUSB已經(jīng)開(kāi)發(fā)出一些第三方應(yīng)用程序,包括JPhoto項(xiàng)目(這是一個(gè)用jUSB連接到數(shù)碼照相機(jī)的應(yīng)用程序)和jSyncManager項(xiàng)目(這是一個(gè)用jUSB與使用Palm操作系統(tǒng)的PDA同步的應(yīng)用程序)。JSR-80API(javax.usb)正如前面提到的,JSR-80項(xiàng)目是由IBM的DanStreetman于1999年創(chuàng)立的。2001年,這個(gè)項(xiàng)目通過(guò)Java規(guī)范請(qǐng)求(JSR)過(guò)程被接受為Java語(yǔ)言的候選擴(kuò)展標(biāo)準(zhǔn)。這個(gè)項(xiàng)目現(xiàn)在稱為JSR-80并且被正式分派了Java包javax.usb。這個(gè)項(xiàng)目使用CommonPublicLicense的許可證形式,并通過(guò)JavaCommunityProcess進(jìn)行開(kāi)發(fā)。這個(gè)項(xiàng)目的目標(biāo)是為Java平臺(tái)開(kāi)發(fā)一個(gè)USB接口,可以從任何Java應(yīng)用程序中完全訪問(wèn)USB系統(tǒng)。JSR-80API支持USB規(guī)范所定義的全部四種傳輸類型。目前,該API的Linux實(shí)現(xiàn)可以在支持2.4核心的大多數(shù)最新GNU/Linux版本上工作,如RedHat7.2和9.0。JSR-80項(xiàng)目包括三個(gè)包:javax-usb(javax.usbAPI)、javax-usb-ri(操作系統(tǒng)無(wú)關(guān)的基準(zhǔn)實(shí)現(xiàn)的公共部分)以及javax-usb-ri-linux(Linux平臺(tái)的基準(zhǔn)實(shí)現(xiàn),它將公共基準(zhǔn)實(shí)現(xiàn)鏈接到LinuxUSB堆棧)。所有這三個(gè)部分都是構(gòu)成Linux平臺(tái)上java.usbAPI完整功能所必需的。在該項(xiàng)目的電子郵件列表中可以看到有人正在致力于將這個(gè)API移植到其他操作系統(tǒng)上(主要是MicrosoftWindows),但是還沒(méi)有可以工作的版本發(fā)表。盡管JSR-80API的操作系統(tǒng)無(wú)關(guān)的實(shí)現(xiàn)在不同的操作系統(tǒng)上是不同的,但是Java程序員只需要理解javax.usb包就可以開(kāi)始開(kāi)發(fā)應(yīng)用程序了。表2列出了javax.usb中的接口和類,Java程序員應(yīng)該熟悉它們:表2.JSR-80API中的接口和類

UsbConfiguration表示USB設(shè)備的配置UsbConfigurationDescriptorUSB配置描述符的接口UsbDeviceUSB設(shè)備的接口UsbDeviceDescriptorUSB設(shè)備描述符的接口UsbEndpointUSB端點(diǎn)的接口UsbEndpointDescriptorUSB端點(diǎn)描述符的接口UsbHubUSBhub的接口UsbInterfaceUSB接口的接口UsbInterfaceDescriptorUSB接口描述符的接口UsbPipeUSB管道的接口UsbPortUSB端口的接口UsbServicesjavax.usb實(shí)現(xiàn)的接口UsbHostManagerjavax.usb的入口點(diǎn)用JSR-80API訪問(wèn)USB設(shè)備的正常過(guò)程如下:?通過(guò)從UsbHostManager得到相應(yīng)的UsbServices進(jìn)行Bootstrap0?通過(guò)UsbServices訪問(wèn)roothub。在應(yīng)用程序中roothub就是一個(gè)UsbHub。?獲得連接到roothub的UsbDevices清單。遍歷所有低級(jí)hub以找到正確的UsbDevice。?用控制消息(UsbControlIrp)與UsbDevice直接交互,或者從UsbDevice的相應(yīng)UsbConfiguration中要求一個(gè)Usblnterface并與該Usblnterface上可用的UsbEndpoint進(jìn)行I/Oo?如果一個(gè)UsbEndpoint用于進(jìn)行I/O,那么打開(kāi)與它關(guān)聯(lián)的UsbPipe。通過(guò)這個(gè)UsbPipe可以同步或者異步提交上行數(shù)據(jù)(從USB設(shè)備到主計(jì)算機(jī))和下行數(shù)據(jù)(從主計(jì)算機(jī)到USB設(shè)備)。?當(dāng)應(yīng)用程序不再需要訪問(wèn)該UsbDevice時(shí),關(guān)閉這個(gè)UsbPipe并釋放相應(yīng)的Usblnterfaceo在清單3中,我們用JSR-80API獲得USB系統(tǒng)的內(nèi)容。這個(gè)程序遞歸地遍歷USB系統(tǒng)上的所有USBhub并找出連接到主機(jī)計(jì)算機(jī)上的所有USB設(shè)備。這段代碼對(duì)應(yīng)于上述步驟1到步驟3o清單3,用JSR-80API獲得USB系統(tǒng)的內(nèi)容importjavax.usb.*;

importjava.util.List;publicclassTraverseUSB{publicstaticvoidmain(Stringargv[]){try{//AccessthesystemUSBservices,andaccesstotheroot//hub.Thentraversethroughtheroothub.UsbServicesservices=UsbHostManager.getUsbServices();UsbHubrootHub=services.getRootUsbHub();traverse(rootHub);}catch(Exceptione){}}publicstaticvoidtraverse(UsbDevicedevice){if(device.isUsbHub()){//ThisisaUSBHub,traversethroughthehub.ListattachedDevices=((UsbHub)device).getAttachedUsbDevices();for(inti=0;i<>{traverse((UsbDevice)attachedDevices.get(i));

}}else{//ThisisaUSBfunction,notahub.//Dosomething.}}}清單4展示了在應(yīng)用程序成功地找到Device后,如何與Interface和EndPoint進(jìn)行I/O。這段代碼還可以修改為進(jìn)行所有四種數(shù)據(jù)傳輸類型的I/O。它對(duì)應(yīng)于上述步驟4到步驟6。清單4,用JSR-80API進(jìn)行I/OpublicstaticvoidtestIO(UsbDevicedevice){try{//AccesstotheactiveconfigurationoftheUSBdevice,obtain//alltheinterfacesavailableinthatconfiguration.UsbConfigurationconfig=device.getActiveUsbConfiguration();ListtotalInterfaces=config.getUsbInterfaces();//Traversethroughalltheinterfaces,andaccesstheendpoints//availabletothatinterfaceforI/O.for(inti=0;i<>

Usblnterfaceinterf=(Usblnterface)totallnterfaces.get(i);interf.claim();ListtotalEndpoints=interf.getUsbEndpoints();for(intj=0;j<>{//Accesstheparticularendpoint,determinethedirection//ofitsdataflow,andtypeofdatatransfer,andopenthe//datapipeforI/O.UsbEndpointep=(UsbEndpoint)totalEndpoints.get(i);intdirection=ep.getDirection();inttype=ep.getType();UsbPipepipe=ep.getUsbPipe();pipe.open();//PerformI/OthroughtheUSBpipehere.pipe.close();}interf.release();}}catch(Exceptione){}}JSR-80項(xiàng)目從一開(kāi)始就非?;钴S。2003年2月發(fā)表了javax.usbAPI、RI和RI的0.10.0版本??雌饋?lái)這一版本會(huì)提交給JSR-80委員會(huì)做最終批準(zhǔn)。預(yù)計(jì)正式成為Java語(yǔ)

言的擴(kuò)展標(biāo)準(zhǔn)后,其他操作系統(tǒng)上的實(shí)現(xiàn)會(huì)很快出現(xiàn)。Linux開(kāi)發(fā)者團(tuán)體看來(lái)對(duì)JSR-80項(xiàng)目的興趣比jUSB項(xiàng)目更大,使用Linux平臺(tái)的javax.usbAPI的項(xiàng)目數(shù)量在不斷地增加。結(jié)束語(yǔ)jUSBAPI和JSR-80API都為應(yīng)用程序提供了從運(yùn)行Linux操作系統(tǒng)的計(jì)算機(jī)中訪問(wèn)USB設(shè)備的能力。JSR-80API提供了比jUSBAPI更多的功能,很有可能成為Java

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論