在 Java 应用程序中访问USB设备
来源:网络 更新时间:2014-12-6
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的UniversalHostControllerInterface,UHCI)。这两个标准提供了同样的能力,并可用于所有的USB设备,UHCI的硬件实现更简单一些,但是需要更复杂的设备驱动程序(因而CPU的负荷更大一些)。
USB物理互连是分层的星形拓朴,最多有七层。一个hub是每个星形的中心,USB主机被认为是roothub。每一段连线都是hub与USB设备的点对点连接,后者可以是为系统提供更多附加点的另一个hub,也可以是一个提供功能的某种设备。主机使用主/从协议与USB设备通信。这种方式解决了包冲突的问题,但是同时也阻止了附加的设备彼此建立直接通信。
所有传输的数据都是由主控器发起的。数据从主机流向设备称为下行(downstream)或者输出(out)传输,数据从设备流向主机称为上行(upstream)或者输入(in)传输。数据传输发生在主机和USB设备上特定的端点(endpoint)之间,主机与端点之间的数据链接称为管道(pipe)。一个给定的USB设备可以有许多个端点,主机与设备之间数据管道的数量与该设备上端点的数量相同。一个管道可以是单向或者是双向的,一个管道中的数据流与所有其他管道中的数据流无关。