| | | | | | | [文章信息] | | | 作者: | 羽斌 | | 时间: | 2005-05-28 | | 出处: | Java研究组织 | | 责任编辑: | 方舟 | |
| [文章导读] | | | 在本文通过提供使Java 应用程序可以使用 USB 设备的 API 而使这个过程变得更容易 | |
| |
|
| | | |
|
|
|
|
|
jUSB API
jUSB 项目是由 Mojo Jojo 和 David Brownell 于 2000年 6月创立的。其目标是提供一组免费的、在 Linux 平台上访问 USB 设备的 Java API。这个 API 是按照 Lesser GPL (LGPL)条款发表的,这意味着您可以在专有和免费软件项目中使用它。这个 API 提供了对多个物理 USB 设备的多线程访问,并支持本机和远程设备。具有多个接口的设备可以同时被多个应用程序(或者设备驱动程序)所访问,其中每一个应用程序(或者设备驱动程序)都占据一个不同的接口。该 API 支持控制传输、批量传输和中断传输,不支持等时传输,因为等时传输用于媒体数据(如音频和视频),JMF API 已经在其他标准设备驱动程序上对此提供了很好的支持(参阅 参考资料)。当前,该 API 可以在具有 Linux 2.4 核心或者以前的 2.2.18 核心的 GNU/Linux 版本上工作。因此可支持大多数最新的版本,例如,该 API 可以在没有任何补丁或者升级的 Red Hat 7.2 和 9.0 上工作。
jUSB API 包括以下包: ·usb.core: 这个包是 jUSB API 的核心部分。它使得 Java 应用程序可以从 USB 主机访问 USB 设备。
·usb.linux: 这个包包含 usb.core.Host 对象的 Linux 实现、bootstrapping 支持和其他可以提升 Linux USB 支持的类。这个实现通过虚拟 USB 文件系统(usbdevfs)访问 USB 设备。
·usb.windows: 这个包包含 usb.core.Host 对象的 Windows 实现、bootstrapping 支持和其他可以提升 Windows USB 支持的类。这个实现仍然处于非常初级的阶段。
·usb.remote: 这个包是 usb.core API 的远程版本。它包括一个 RMI proxy 和一个 daemon 应用程序,它让 Java 应用程序可以访问远程计算机上的 USB 设备。
·usb.util: 这个包提供了一些有用的实用程序,可以将 firmware下载到 USB 设备上、将 USB 系统的内容转储到 XML 中、以及将只有 bulk I/O 的 USB 设备工具转换成一个套接字(socket)。
·usb.devices: 这个可选包收集了用 jUSB API 访问不同 USB 设备的 Java 代码,包括柯达数码相机和 Rio 500 MP3 播放器。这些 API 经过特别编写以简化访问特定 USB 设备的过程,并且不能用于访问其他设备。这些 API 是在 usb.core API 之上构建的,它们可以工作在所有支持 jUSB 的操作系统上。
·usb.view: 这个可选包提供了基于 Swing 的 USB 树简单浏览器。它是一个展示 jUSB API 应用的很好的示例程序。
尽管 usb.core.Host 对象的实现对于不同的操作系统是不同的,但是 Java 程序员只需要理解 usb.core 包就可以用 jUSB API 开始应用程序的开发。表 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 |
提供对 USB hub 描述符以及一些 hub 操作的访问 |
| Interface |
描述一组端点,并与一个特定设备配置相关联 |
| PortIdentifier |
为 USB 设备提供稳定的字符串标识符,以便在操作和故障诊断时使用 | 用 jUSB API 访问一台 USB 设备的正常过程如下:
·通过从 HostFactory 得到 USB Host 进行 Bootstrap。
·从 Host 访问 USB Bus,然后从这个 Bus 访问 USB root hub(即 USB Device)。
·得到 hub 上可用的 USB 端口数量,遍历所有端口以找到正确的 Device。
·访问附加到特定端口上的 USB Device。可以用一台 Device 的 PortIdentifier 直接从 Host 访问它,也可以通过从 root hub 开始遍历 USB Bus 找到它。
·用 ControlMessage 与该 Device 直接交互,或者从该 Device 的当前 Configuration 中要求一个 Interface,并与该 Interface 上可用的 Endpoint 进行 I/O 。
清单 1 展示了如何用 jUSB API 获得 USB 系统中的内容。这个程序编写为只是查看 root hub 上可用的 USB 设备,但是很容易将它改为遍历整个 USB 树。这里的逻辑对应于上述步骤 1 到步骤 4。
清单 1. 用 jUSB API 获得 USB 系统的内容
import usb.core.*;
public class ListUSB { public static void main(String[] args) { try { // Bootstrap by getting the USB Host from the HostFactory. Host host = HostFactory.getHost();
// Obtain a list of the USB buses available on the Host. Bus[] bus = host.getBusses(); int total_bus = bus.length;
// Traverse through all the USB buses. for (int i=0; i<total_bus; i++) { // Access the root hub on the USB bus and obtain the // number of USB ports available on the root hub. Device root = bus[i].getRootHub(); int total_port = root.getNumPorts();
// Traverse through all the USB ports available on the // root hub. It should be mentioned that the numbering // starts from 1, not 0. for (int j=1; j<=total_port; j++) { // Obtain the Device connected to the port. Device device = root.getChild(j); if (device != null) { // USB device available, do something here. } } } } catch (Exception e) { System.out.println(e.getMessage()); } } |
|
|
|
|
|
|
|
|