




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
在Java应用程序中访问USB设备在本文通过提供使Java应用程序可以使用USB设备的API而使这个过程变得更容易.Java平台一直都以其平台无关性自豪。虽然这种无关性有许多好处,但是它也使得编写与硬件交互的Java应用程序的过程变得相当复杂。在本文中,研究科学家蒋清野讨论了两个项目,它们通过提供使Java应用程序可以使用USB设备的API而使这个过程变得更容易。虽然这两个项目仍然处于萌芽状态,但是它们都显示了良好的前景,并已经成为一些实用应用程序的基础。通用串行总线(UniversalSerialBusUSB)规范的第一个版本发表于1996年1月。因为它的低成本、高数据传输率、使用容易和灵活性,USB在计算机行业里获得了广泛接受。今天,许多周边设备和装置都是通过USB接口连接到计算机上的。目前,大多数一般用途的操作系统都提供了对USB设备的支持,并且用C或者C++可以相对容易地开发访问这些外设的应用程序。不过,Java编程语言在设计上对硬件访问提供的支持很少,所以编写与USB设备交互的应用程序是相当困难的。IBM的DanStreetman最早开始了在Java语言中提供对USB设备的访问的努力。2001年,他的项目通过Java规范请求(JavaSpecificationRequest,JSR)过程被接受为Java语言的候选扩展标准。这个项目现在称为JSR-80并且指定了官方包javax.usb。同时,在2000年6月,MojoJojo和DavidBrownell在SourceForge开始了jUSB项目。这两个项目都开发出了Linux开发人员可以使用的包,尽管它们都还很不完善。这两个项目也都开始试图向其他操作系统上的Java应用程序提供对USB设备的访问,尽管它们都还没有开发出可以使用的包(参阅参考资料中有关本文中讨论的这两个项目及其他项目的资料)。在本文中,将对jUSB和JSR-80项目作一个简要介绍,不过,我们首先要看一下USB协议的具体细节,这样您就可以理解这两个项目是如何与USB设备交互的。我们还将提供代码片段以展示如何用这两个项目的API访问USB设备。USB介绍1994年,一个由四个行业伙伴(Compaq、Intel、Microsoft和NEC)组成的联盟开始制定USB协议。该协议最初的目的是将PC与电话相连并提供容易扩展和重新配置的I/O接口。1996年1月,发表了USB规范的第一个版本,1998年9月发表了后续版本(版本1.1)。这个规范允许127台设备同时连接到一起,总的通信带宽限制为12Mbps。后来,又有三个成员(Hewlett-Packard、Lucent和Philips)加入了这个联盟。2000年4月,发表了USB规范的2.0版本,它支持高达480Mbps的传输率。今天,USB在高速(视频、图像、储存和全速(音频、宽带、麦克风数据传输应用中起了关键作用。它还使各种低速设备:键盘、鼠标、游戏外设、虚拟现实外设)连接到PC上。USB协议有严格的层次结构。在所有USB系统中,只有一个主设备,到主计算机的的USB接口称为主控器(hostcontroller)。主控器有两个标准??开放主控器接口(Compaq的OpenHostControllerInterface,OHCI)和通用主控器接口(Intel的UniversalHostController
Interface,UHCI)。这两个标准提供了同样的能力,并可用于所有的USB设备,UHCI的硬件实现更简单一些,但是需要更复杂的设备驱动程序(因而CPU的负荷更大一些)。USB物理互连是分层的星形拓朴,最多有七层。一个hub是每个星形的中心,USB主机被认为是roothub。每一段连线都是hub与USB设备的点对点连接,后者可以是为系统提供更多附加点的另一个hub,也可以是一个提供功能的某种设备。主机使用主/从协议与USB设备通信。这种方式解决了包冲突的问题,但是同时也阻止了附加的设备彼此建立直接通信。所有传输的数据都是由主控器发起的。数据从主机流向设备称为下行(downstream)或者输出(out)传输,数据从设备流向主机称为上行(upstream)或者输入(市)传输。数据传输发生在主机和USB设备上特定的端点(endpoint)之间,主机与端点之间的数据链接称为管道(pipe)。一个给定的USB设备可以有许多个端点,主机与设备之间数据管道的数量与该设备上端点的数量相同。一个管道可以是单向或者是双向的,一个管道中的数据流与所有其他管道中的数据流无关。USB网络中的通信可以使用下面四种数据传输类型中的任意一种:控制传输:这些是一些短的数据包,用于设备控制和配置,特别是在设备附加到主机上时。批量传输:这些是数量相对大的数据包。像扫描仪或者SCSI适配器这样的设备使用这种传输类型。中断传输:这些是定期轮询的数据包。主控器会以特定的间隔自动发出一个中断。等时传输:这些是实时的数据流,它们对带宽的要求高于可靠性要求。音频和视频设备一般使用这种传输类型。像串行端口一样,计算机上每一个USB端口都由USB控制器指定了一个惟一的标识数字(端口ID)。当USB设备附加到USB端口上时,就将这个惟一端口ID分配给这台设备,并且USB控制器会读取设备描述符。设备描述符包括适用于该设备的全局信息、以及设备的配置信息。配置定义了一台USB设备的功能和I/O行为。一台USB设备可以有一个或者多个配置,这由它们相应的配置描述符所描述。每一个配置都有一个或者多个接口,它可以视为一个物理通信渠道;每一个接口有零个或者多个端点,它可以是数据提供者或者数据消费者,或者同时具有这两种身份。接口由接口描述符描述,端点由端点描述符描述。并且一台USB设备可能还有字符串描述符以提供像厂商名、设备名或者序列号这样的附加信息。正如您所看到的,像USB这样的协议为使用Java这种强调平台和硬件无关性的语言的开发人员提出了挑战。现在让我们看两个试图解决这个问题的项目。jUSBAPI
jUSB项目是由MojoJojo和DavidBrownell于2000年6月创立的。其目标是提供一组免费的、在Linux平台上访问USB设备的JavaAPI。这个API是按照LesserGPL(LGPL)条款发表的,这意味着您可以在专有和免费软件项目中使用它。这个API提供了对多个物理USB设备的多线程访问,并支持本机和远程设备。具有多个接口的设备可以同时被多个应用程序(或者设备驱动程序)所访问,其中每一个应用程序(或者设备驱动程序)都占据一个不同的接口。该API支持控制传输、批量传输和中断传输,不支持等时传输,因为等时传输用于媒体数据(如音频和视频),JMFAPI已经在其他标准设备驱动程序上对此提供了很好的支持(参阅参考资料)。当前,该API可以在具有Linux2.4核心或者以前的2.2.18核心的GNU/Linux版本上工作。因此可支持大多数最新的版本,例如,该API可以在没有任何补丁或者升级的RedHat7.2和9.0上工作。jUSBAPI包括以下包:•usb.core:这个包是jUSBAPI的核心部分。它使得Java应用程序可以从USB主机访问USB设备。•usb.linux:这个包包含usb.core.Host对象的Linux实现、bootstrapping支持和其他可以提升LinuxUSB支持的类。这个实现通过虚拟USB文件系统(usbdevfs)访问USB设备。•usb.windows:这个包包含usb.core.Host对象的Windows实现、bootstrapping支持和其他可以提升WindowsUSB支持的类。这个实现仍然处于非常初级的阶段。•usb.remote:这个包是usb.coreAPI的远程版本。它包括一个RMIproxy和一个daemon应用程序,它让Java应用程序可以访问远程计算机上的USB设备。•usb.util:这个包提供了一些有用的实用程序,可以将firmware下载到USB设备上、将USB系统的内容转储到XML中、以及将只有bulkI/O的USB设备工具转换成一个套接字(socket)o•usb.devices:这个可选包收集了用jUSBAPI访问不同USB设备的Java代码,包括柯达数码相机和Rio500MP3播放器。这些API经过特别编写以简化访问特定USB设备的过程,并且不能用于访问其他设备。这些API是在usb.coreAPI之上构建的,它们可以工作在所有支持jUSB的操作系统上。•usb.view:这个可选包提供了基于Swing的USB树简单浏览器。它是一个展示jUSBAPI应用的很好的示例程序。尽管usb.core.Host对象的实现对于不同的操作系统是不同的,但是Java程序员只需要理解usb.core包就可以用jUSBAPI开始应用程序的开发。表1列出了usb.core的接口和类,Java程序员应该熟悉它们:表1.jUSB中的接口和类
接口/类说明Bus将一组USB设备连接到Host上Host表示具有一个或者多个Bus的USB控制器Configuration提供对设备所支持的USB配置的访问,以及对与该配置关联的接口的访问Descriptor具有USB类型的描述符的实体的基类Device提供对USB设备的访问DeviceDescriptor提供对USB设备描述符的访问EndPoint提供对USB端点描述符的访问、在给定设备配置中构造设备数据输入或者输出HostFactory包含bootstrapping方法Hub提供对USBhub描述符以及一些hub操作的访问Interface描述一组端点,并与一个特定设备配置相关联PortIdentifier为USB设备提供稳定的字符串标识符,以便在操作和故障诊断时使用用jUSBAPI访问一台USB设备的正常过程如下:•通过从HostFactory得到USBHost进行Bootstrap0•从Host访问USBBus,然后从这个Bus访问USBroothub(即USBDevice)0•得到hub上可用的USB端口数量,遍历所有端口以找到正确的Device。•访问附加到特定端口上的USBDevice。可以用一台Device的Portidentifier直接从Host访问它,也可以通过从roothub开始遍历USBBus找到它。.用ControlMessage与该Device直接交互,或者从该Device的当前Configuration中要求一个Interface,并与该Interface上可用的Endpoint进行I/O。清单1展示了如何用jUSBAPI获得USB系统中的内容。这个程序编写为只是查看roothub上可用的USB设备,但是很容易将它改为遍历整个USB树。这里的逻辑对应于上述步骤1到步骤4o清单1.用jUSBAPI获得USB系统的内容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展示了在应用程序成功地找到了Device的条件下,如何与Interface和EndPoint进行批量I/O。这个代码段也可以修改为执行控制或者中断I/O。它对应于上述步骤5。清单2.用jUSBAPI执行批量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项目在2000年6月到2001年2月期间非常活跃。该API的最新的版本0.4.4发表于2001年2月14日。从那以后只提出了很少的改进,原因可能是IBM小组成功地成为了Java语言的候选扩展标准。不过,基于jUSB已经开发出一些第三方应用程序,包括JPhoto项目(这是一个用jUSB连接到数码照相机的应用程序)和jSyncManager项目(这是一个用jUSB与使用Palm操作系统的PDA同步的应用程序)。JSR-80API(javax.usb)正如前面提到的,JSR-80项目是由IBM的DanStreetman于1999年创立的。2001年,这个项目通过Java规范请求(JSR)过程被接受为Java语言的候选扩展标准。这个项目现在称为JSR-80并且被正式分派了Java包javax.usb。这个项目使用CommonPublicLicense的许可证形式,并通过JavaCommunityProcess进行开发。这个项目的目标是为Java平台开发一个USB接口,可以从任何Java应用程序中完全访问USB系统。JSR-80API支持USB规范所定义的全部四种传输类型。目前,该API的Linux实现可以在支持2.4核心的大多数最新GNU/Linux版本上工作,如RedHat7.2和9.0。JSR-80项目包括三个包:javax-usb(javax.usbAPI)、javax-usb-ri(操作系统无关的基准实现的公共部分)以及javax-usb-ri-linux(Linux平台的基准实现,它将公共基准实现链接到LinuxUSB堆栈)。所有这三个部分都是构成Linux平台上java.usbAPI完整功能所必需的。在该项目的电子邮件列表中可以看到有人正在致力于将这个API移植到其他操作系统上(主要是MicrosoftWindows),但是还没有可以工作的版本发表。尽管JSR-80API的操作系统无关的实现在不同的操作系统上是不同的,但是Java程序员只需要理解javax.usb包就可以开始开发应用程序了。表2列出了javax.usb中的接口和类,Java程序员应该熟悉它们:表2.JSR-80API中的接口和类
UsbConfiguration表示USB设备的配置UsbConfigurationDescriptorUSB配置描述符的接口UsbDeviceUSB设备的接口UsbDeviceDescriptorUSB设备描述符的接口UsbEndpointUSB端点的接口UsbEndpointDescriptorUSB端点描述符的接口UsbHubUSBhub的接口UsbInterfaceUSB接口的接口UsbInterfaceDescriptorUSB接口描述符的接口UsbPipeUSB管道的接口UsbPortUSB端口的接口UsbServicesjavax.usb实现的接口UsbHostManagerjavax.usb的入口点用JSR-80API访问USB设备的正常过程如下:•通过从UsbHostManager得到相应的UsbServices进行Bootstrap0•通过UsbServices访问roothub。在应用程序中roothub就是一个UsbHub。•获得连接到roothub的UsbDevices清单。遍历所有低级hub以找到正确的UsbDevice。•用控制消息(UsbControlIrp)与UsbDevice直接交互,或者从UsbDevice的相应UsbConfiguration中要求一个Usblnterface并与该Usblnterface上可用的UsbEndpoint进行I/Oo•如果一个UsbEndpoint用于进行I/O,那么打开与它关联的UsbPipe。通过这个UsbPipe可以同步或者异步提交上行数据(从USB设备到主计算机)和下行数据(从主计算机到USB设备)。•当应用程序不再需要访问该UsbDevice时,关闭这个UsbPipe并释放相应的Usblnterfaceo在清单3中,我们用JSR-80API获得USB系统的内容。这个程序递归地遍历USB系统上的所有USBhub并找出连接到主机计算机上的所有USB设备。这段代码对应于上述步骤1到步骤3o清单3,用JSR-80API获得USB系统的内容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展示了在应用程序成功地找到Device后,如何与Interface和EndPoint进行I/O。这段代码还可以修改为进行所有四种数据传输类型的I/O。它对应于上述步骤4到步骤6。清单4,用JSR-80API进行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项目从一开始就非常活跃。2003年2月发表了javax.usbAPI、RI和RI的0.10.0版本。看起来这一版本会提交给JSR-80委员会做最终批准。预计正式成为Java语
言的扩展标准后,其他操作系统上的实现会很快出现。Linux开发者团体看来对JSR-80项目的兴趣比jUSB项目更大,使用Linux平台的javax.usbAPI的项目数量在不断地增加。结束语jUSBAPI和JSR-80API都为应用程序提供了从运行Linux操作系统的计算机中访问USB设备的能力。JSR-80API提供了比jUSBAPI更多的功能,很有可能成为Java
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 特区建工考试题目及答案
- 《绩效管理》试题及答案
- 2025企业劳动合同简化模板
- 2025年上海中原地产房屋租赁合同
- 中国有机硅防水液项目创业计划书
- 中国六氨和氯化钴项目商业计划书
- 中国乙硫磷项目商业计划书
- 中国二茂铁甲酸项目投资计划书
- 中国建筑玻璃项目商业计划书
- 2025权威的销售合同模板
- 公安机房运维知识培训课件
- 《基层常见病诊疗指南》
- 2025年及未来5年中国专用灯具行业市场调研及投资战略研究报告
- 2025年新版中国移动笔试题库及答案
- 安徽省农村信用社联合社2026年校园招聘备考考试题库附答案解析
- 肺结节培训课件
- 化工安全三级培训考试题及答案解析
- 2025年湖北省生态环保有限公司招聘33人笔试参考题库附带答案详解
- 2025湖北宜昌市不动产交易和登记中心招聘编外聘用人员17人考试参考试题及答案解析
- 教PEP版六年级英语上册第一次月考试卷(Unit 1-2).(含答案含听力原文)
- 远离宗教崇尚科学课件
评论
0/150
提交评论