| 首页 | 新闻 | 网页 | 设计 | 色彩 | 原创 | 视觉 | 素材 | 动漫 | 酷站 | 策划 | 文案 | 访谈 | 运营 | 编程 | 数据库 | 服务器 | 下载 | 图库 | 
您的位置: 幽幽天空 > 网页 > 编程开发 > Java教程 > Java基础教程 > 文章正文 用户登录
利用javascri
[翻译]javasc
Flash javasc
Java和Flash通讯
javascript与
flash8与java
RIA 开发感想(二
Flash & Ajax
Java与flash的TCP
谈谈自己使用flas

在Java应用程序中访问USB设备详解           

在Java应用程序中访问USB设备详解

作者:佚名 来源:赛迪网 更新:2006-8-25 21:05:35 错误报告 我要投稿

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] 

文章录入:skyuu    责任编辑:skyuu 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    发表评论:
    姓名:  评 分: 1分 2分 3分 4分 5分
     
  • 严禁发表危害国家安全、政治、黄色淫秽等内容的评论。
  • 用户需对自己在使用幽幽天空服务过程中的行为承担法律责任。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表机友个人观点,与本网站立场无关。