在Java的应用程序中访问USB设备文档格式.docx
- 文档编号:5088345
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:15
- 大小:25.79KB
在Java的应用程序中访问USB设备文档格式.docx
《在Java的应用程序中访问USB设备文档格式.docx》由会员分享,可在线阅读,更多相关《在Java的应用程序中访问USB设备文档格式.docx(15页珍藏版)》请在冰点文库上搜索。
今天,USB在高速(视频、图像、储存)和全速(音频、宽带、麦克风)数据传输应用中起了关键作用。
它还使各种低速设备(键盘、鼠标、游戏外设、虚拟现实外设)连接到PC上。
USB协议有严格的层次结构。
在所有USB系统中,只有一个主设备,到主计算机的的USB接口称为主控器(hostcontroller)。
主控器有两个标准?
?
开放主控器接口(Compaq的OpenHostControllerInterface,OHCI)和通用主控器接口(Intel的UniversalHostControllerInterface,UHCI)。
这两个标准提供了同样的能力,并可用于所有的USB设备,UHCI的硬件实现更简单一些,但是需要更复杂的设备驱动程序(因而CPU的负荷更大一些)。
USB物理互连是分层的星形拓朴,最多有七层。
一个hub是每个星形的中心,USB主机被认为是roothub。
每一段连线都是hub与USB设备的点对点连接,后者可以是为系统提供更多附加点的另一个hub,也可以是一个提供功能的某种设备。
主机使用主/从协议与USB设备通信。
这种方式解决了包冲突的问题,但是同时也阻止了附加的设备彼此建立直接通信。
所有传输的数据都是由主控器发起的。
数据从主机流向设备称为下行(downstream)或者输出(out)传输,数据从设备流向主机称为上行(upstream)或者输入(in)传输。
数据传输发生在主机和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)。
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进行Bootstrap。
从Host访问USBBus,然后从这个Bus访问USBroothub(即USBDevice)。
得到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到步骤4。
清单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/O
//ObtainthecurrentConfigurationofthedeviceandthenumberof
//InterfacesavailableunderthecurrentConfiguration.
Configurationconfig=device.getConfiguration();
inttotal_interface=config.getNumInterfaces();
//TraversethroughtheInterfaces
for(intk=0;
k<
//AccessthecurrentlyInterfaceandobtainthenumberof
//endpointsavailableontheInterface.
Interfaceitf=config.getInterface(k,0);
inttotal_ep=itf.getNumEndpoints();
//Traversethroughalltheendpoints.
for(intl=0;
l<
//Accesstheendpoint,andobtainitsI/Otype.
Endpointep=itf.getEndpoint(l);
Stringio_type=ep.getType();
booleaninput=ep.isInput();
//Iftheendpointisaninputendpoint,obtainits
//InputStreamandreadindata.
if(input)
InputStreamin;
in=ep.getInputStream();
//Readindatahere
in.close();
//IftheEndpointisandoutputEndpoint,obtainits
//OutputStreamandwriteoutdata.
else
OutputStreamout;
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设备的配置
UsbConfigurationDescriptor
USB配置描述符的接口
UsbDeviceUSB
设备的接口
UsbDeviceDescriptorUSB
设备描述符的接口
UsbEndpointUSB
端点的接口
UsbEndpointDescriptorUSB
端点描述符的接口
UsbHub
USBhub的接口
UsbInterface
USB接口的接口
UsbInterfaceDescriptor
USB接口描述符的接口
UsbPipeUSB
管道的接口
UsbPortUSB
端口的接口
UsbServices
javax.usb实现的接口
UsbHostManager
javax.usb的入口点
用JSR-80API访问USB设备的正常过程如下:
通过从UsbHostManager得到相应的UsbServices进行Bootstrap。
通过UsbServices访问roothub。
在应用程序中roothub就是一个UsbHub。
获得连接到roothub的UsbDevices清单。
遍历所有低级hub以找到正确的UsbDevice。
用控制消息(UsbControlIrp)与UsbDevice直接交互,或者从UsbDevice的相应UsbConfiguration中要求一个UsbInterface并与该UsbInterface上可用的UsbEndpoint进行I/O。
如果一个UsbEndpoint用于进行I/O,那么打开与它关联的UsbPipe。
通过这个UsbPipe可以同步或者异步提交上行数据(从USB设备到主计算机)和下行数据(从主计算机到USB设备)。
当应用程序不再需要访问该UsbDevice时,关闭这个UsbPipe并释放相应的UsbInterface。
在清单3中,我们用JSR-80API获得USB系统的内容。
这个程序递归地遍历USB系统上的所有USBhub并找出连接到主机计算机上的所有USB设备。
这段代码对应于上述步骤1到步骤3。
清单3.用JSR-80API获得USB系统的内容
importjavax.usb.*;
importjava.util.List;
publicclassTraverseUSB
publicstaticvoidmain(Stringargv[])
//AccessthesystemUSBservices,andaccesstotheroot
//hub.Thentraversethroughtheroothub.
UsbServicesservices=UsbHostManager.getUsbServices();
UsbHubrootHub=services.getRootUsbHub();
traverse(rootHub);
}cat
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 应用程序 访问 USB 设备