JSR-80 API (javax.usb)
正如前面提到的,JSR-80 项 目是由 IBM 的 Dan Streetman 于 1999年创立的。2001年,这个 项目通过 Java 规范请求(JSR)过程被接受为 Java 语言的候选扩展标准。这个项目现在称为 JSR-80 并且被正式分派了 Java 包 javax.usb。这个项目使用 Common Public License 的许可证形式,并通过 Java Community Process 进行开发。这个 项目的目标是为 Java 平台开发一个 USB 接口,可以从任何 Java 应用程序中完全访问 USB 系统。JSR-80 API 支持 USB 规范所定义的全部四种传输类型。 目前,该 API 的 Linux 实现可以在支持 2.4 核心的大多数最 新 GNU/Linux 版本上工作,如 Red Hat 7.2 和 9.0。
JSR-80 项目包括三个包 :javax-usb (javax.usb API)、javax-usb-ri (操作系统无关的基准实 现的公共部分)以及 javax-usb-ri-linux (Linux 平台的基准实现 , 它将公共基准实现链接到 Linux USB 堆栈)。所有这三个部分都是构成 Linux 平台上 java.usb API 完整功能所必需的。在该项目的电子邮件列表中可以 看 到有人正在致力于将这个 API 移植到其他操作系统上(主要是 Microsoft Windows),但 是还没有可以工作的版本发表。
尽管 JSR-80 API 的操作系统无关的实现在不同的操作系 统上是不同的,但是 Java 程序员只需要理解 javax.usb 包就可以开始开发应用程序了。表 2 列出 了 javax.usb 中的接口和类, Java 程序员应该熟悉它们 :
表 2. JSR-80 API 中的接口和类
| 接口/类 |
说明 |
| UsbConfiguration |
表示 USB 设备的配置 |
| UsbConfigurationDescriptor |
USB 配置描述符的接口 |
| UsbDevice USB |
设备的接口 |
| UsbDeviceDescriptor USB |
设备描述符的接口 |
| UsbEndpoint USB |
端点的接口 |
| UsbEndpointDescriptor USB |
端点描述符的接口 |
| UsbHub |
USB hub 的接口 |
| UsbInterface |
USB 接口 的接口 |
| UsbInterfaceDescriptor |
USB 接口描述符的接口 |
| UsbPipe USB |
管道的接口 |
| UsbPort USB |
端口的接口 |
| UsbServices |
javax.usb实现的接口 |
| UsbHostManager |
javax.usb 的入口点 |
用 JSR-80 API 访问 USB 设备的正常过程如下:
1.通过从 UsbHostManager 得到相应的 UsbServices 进 行 Bootstrap。
2.通过 UsbServices 访问 root hub。在应用程序中 root hub 就是一个 UsbHub。
3.获得连接到 root hub 的 UsbDevices 清单。遍历所有低级 hub 以找到正确的 UsbDevice。
4.用控制消息(UsbControlIrp)与 UsbDevice 直接交互,或者从 UsbDevice 的 相应 UsbConfiguration 中要求一个 UsbInterface 并与该 UsbInterface 上可 用的 UsbEndpoint 进行 I/O。
5.如果一个 UsbEndpoint 用于进行 I/O,那么打开与它关联的 UsbPipe。通过这个 UsbPipe 可以同步或者异步提交上行数
据(从 USB 设备到主计算机)和 下行 数据(从主计算机到 USB 设备)。
6.当应用程序不再需要访问该 UsbDevice 时,关闭这个 UsbPipe 并释放相应的 UsbInterface。
在 清单 3 中,我们用 JSR-80 API 获得 USB 系统的内容。这个程序递归地遍历 USB 系统上的所有 USB hub 并找出连接
到主机计算机上的所有 USB 设备。这段代码对应于上述步骤 1 到步骤 3。
清单 3. 用 JSR-80 API 获得 USB 系统的 内容
import javax.usb.*;
import java.util.List;
public class TraverseUSB
{
public static void main(String argv[])
{
try
{
// Access the system USB services, and access to the root
// hub. Then traverse through the root hub.
UsbServices services = UsbHostManager.getUsbServices();
UsbHub rootHub = services.getRootUsbHub();
traverse(rootHub);
} catch (Exception e) {}
}
public static void traverse(UsbDevice device)
{
if (device.isUsbHub())
{
// This is a USB Hub, traverse through the hub.
List attachedDevices = ((UsbHub) device).getAttachedUsbDevices();
for (int i=0; i
{
traverse((UsbDevice) attachedDevices.get(i));
}
}
else
{
// This is a USB function, not a hub.
// Do something.
}
}
}
清单 4 展示了在应用程序成功地找到 Device 后,如何与 Interface 和 EndPoint 进行 I/O。这段代码还可以修改为进
行所有四种数据传输类型的 I/O。它对应 于上述步骤 4 到步骤 6。
清单 4. 用 JSR-80 API 进 行 I/O
public static void testIO(UsbDevice device)
{
try
{
// Access to the active configuration of the USB device, obtain
// all the interfaces available in that configuration.
UsbConfiguration config = device.getActiveUsbConfiguration();
List totalInterfaces = config.getUsbInterfaces();
// Traverse through all the interfaces, and access the endpoints
// available to that interface for I/O.
for (int i=0; i
{
UsbInterface interf = (UsbInterface) totalInterfaces.get(i);
interf.claim();
List totalEndpoints = interf.getUsbEndpoints();
for (int j=0; j
{
// Access the particular endpoint, determine the direction
// of its data flow, and type of data transfer, and open the
// data pipe for I/O.
UsbEndpoint ep = (UsbEndpoint) totalEndpoints.get(i);
int direction = ep.getDirection();
int type = ep.getType();
UsbPipe pipe = ep.getUsbPipe();
pipe.open();
// Perform I/O through the USB pipe here.
pipe.close();
}
interf.release();
}
} catch (Exception e) {}
}
JSR-80 项目从一开始就 非常活跃。2003年 2月发表了 javax.usb API、RI 和 RI 的 0.10.0 版本。看 起来这一版本会提交给 JSR-80 委员会做最 终批准。预计正式成为 Java 语言的扩展标准后,其他操作系统上的实现会 很快出现。Linux 开发者团体看来对 JSR-80 项目的兴趣比 jUSB 项目更 大,使用 Linux 平台的 javax.usb API 的项目 数量在不断地增加。
结束语
jUSB API 和 JSR-80 API 都为应 用程序提供了 从运行 Linux 操作系统 的计算机中访问 USB 设备的能力。JSR-80 API 提供了比 jUSB API 更多的 功能 ,很有可能成为 Java 语言的扩展标准。目前 ,只有 Linux 开发人 员可以利用 jUSB 和 JSR-80 API 的功能。不过,有 人正在积极地将这两种 API 移植到其他操作系统上。Java 开发人员应该在 不久就可以在其他 操作系统上访问 USB 设 备。从现在起就熟悉这些 API,当这些项目可以在多个 平台上发挥作用时,您就可以在自己的应用 程序 中加入 USB 功能了。
上一页 [1] [2] [3] [4]