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
{
// 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());
}
}