java jusb_如何在 Java 应用程序中访问USB设备 (2)

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());

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值