正在阅读:在Java应用程序中访问USB设备在Java应用程序中访问USB设备

2005-07-18 09:48 出处: 作者:yb 责任编辑:moningfeng

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 设备的配置
UsbConfigurationDescriptorUSB 配置描述符的接口
UsbDevice USB设备的接口
UsbDeviceDescriptor USB设备描述符的接口
UsbEndpoint USB端点的接口
UsbEndpointDescriptor USB端点描述符的接口
UsbHubUSB hub 的接口
UsbInterfaceUSB 接口的接口
UsbInterfaceDescriptorUSB 接口描述符的接口
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 功能了。
键盘也能翻页,试试“← →”键

关注我们

最新资讯离线随时看 聊天吐槽赢奖品