现在的位置: 首页 > 综合 > 正文

Windows下的Java访问USB设备解决之道(翻译Java libusb / libusb-win32 wrapper)收

2013年08月06日 ⁄ 综合 ⁄ 共 6634字 ⁄ 字号 评论关闭

Java libusb / libusb-win32 封装包

概要

Java libusb 封装包是对libsub和libusb-win32 USB library的Jave封装.

  • libusb 旨在创建一个平台无关性的、面向应用程序级别的、访问USB设备的类库,基于C/C++的实现,方便地通过第三方接口扩展到不同的操作系统上,作为开源的类库,可从http://libusb.sourceforge.net/获取相关的信息,目前包括Linux, FreeBSD, NetBSD, OpenBSD, Darwin, MacOS X等。

  • libusb-win32 是libusb在Windows操作系统上的实现。 该版本的类库允许WIndows环境中的用户无需在内核模式下(需要借助DDK和SDK,并可通过第三方开发工具DriverStudio等生成框架开发,核心代码在Visual C++ 6.0中开发)编写驱动即可以让应用程序访问USB设备的通用解决方案,可从http://libusb-win32.sourceforge.net/上获取相关的信息。

     

    已知的Java libusb 封装包可以在Linux和Windows上使用, 而由于libusb和Java(这两个方面都在跨平台上具备优势)的支持必然可以推广到任意的操作系统上。

     

实现

Java libusb 封装包基于Java Native Interface(Java本地接口,即JNI)技术通过调用共享库(Windows下Dynamic Link Library,dll)及Java类文件访问libusb/libusb-win32。类ch.ntb.usb.LibusbJava 装载了共享库并提供了访问libusb的本地接口。

在libusb中, 总线结构(包含设备(device),设置(configuration),接口(interface),和端点(endpoints))是以C语言的struct组织的. 对每个struct实例化一个Java对象(命名为Usb_xxx),同时把相应的信息保存到Java对象中. 这一过程通过调用LibusbJava.usb_get_busses()来完成。此后,总线和附属设备的信息可以从一个树型结构的Java对象中得到。

一个简单的类对象Device即可展示一个USB设备并相当容易地进行读写操作,错误(Errors)和超时(Timeouts)将会抛出异常。

注意当前该类库是BETA版本! 它已经在我们的两个程序中得到了应用:编程与调试接口(Programming and Debugging Interface (Cypress FX2)) 、实验板(Experimental Board (AVR AT90USB1287)) ,这两个应用都使用了批传输(bulk transfers) 和中断传输(Interrupt transfers)并能正常地在测试外设上工作。

演示

UsbView

UsbView 为现有的USB总线提供了一个树型结构视图。它展现了包括字符描述符在内的不同的描述符参数。 UsbView基于Swing实现因而只依赖于Java基本类库(standard java libraries)。

当你右键一个接口描述符(interface descriptor )时,你可以打开另一个应用程序„USB TestApp“ ,它将显示设备描述符的属性值。

USB TestApp

这个简单的USB测试程序允许块读写和中断读写数据到设备中。它可以通过„UsbView“或自身的main方法调用。

实例

第一个例子(LogBus) 使用USB共享库直接初始化libusb, 获得表示相关设备和描述符的对象树并把它打印到标准输出上去。

第二个例子 (ReadWrite) 示范了如何获得设备实例,使用ch.ntb.usb.Device 类读写设备。这个类隐藏了libusb 的方法并实现了出错时的异常处理。

API

在线的Java API 文档可以在此处获得here.

安装

Windows

手动安装

安装libusb-win32 并使用包含在libusb-win32/bin中的testlibusb-win.exe 测试你的安装. 你必须安装一个定制的设备驱动文件(inf-file)以使得libusb-win32能够检测到你的设备(参看 „Device Installation“ ).

„Binaries and Source“中下载jar和 Dll 文件 。

Inf USB Library 安装程序(自动安装)

另一种安装方法是执行提供的安装程序为用户自己的设备安装USB library (查看„Download and Installation“ ) 。它已经包含了libusb-win32文件,以及Java封装包中的dll文件和三个我们将会使用到的设备驱动程序。

安装过程大体上执行了以下步骤: 

  • 安装libusb-win32 (CVS build 20060920)

    • 复制libusb0.dll 到windows/system32/

    • 复制libusb0.sys 到windows/system32/drivers/

  • 安装the Java wrapper dll

    • 复制LibusbJava.dll 到windows/system32/

  • 为我们的USB设备安装三个驱动程序(.inf-files)

  • 创建一个卸载程序及一个包含inf和dll文件的驱动文件夹。 

安装程序将在开始时询问你是否希望更改安装目录。

Device Installation(设备安装)

如上所述,要使用libusb-win32你必须先为你的设备安装设备驱动(inf文件)。以下两种方法(对应于上面的手动安装和自动安装)可以创建这样一个文件。

手动安装时,名为inf-wizard.exe 的程序可以在libusb-win32/bin文件夹下找到。它将使用你提供的设备信息产生设备驱动文件(inf和cat文件)。当Windows 询问你插入的设备的驱动时,定位到相应的inf和cat文件上。它将安装使设备能在libusb上正常工作所需要的所有文件。然而,LibusbJava.dll 就需要你自己复制到windows/system32/(见下一部分).

自动安装时也可以使用另一种方式,修改<INSTALLDIR>/driver/ 文件夹下已有的inf文件,它是由Inf USB Library 安装程序生成的。你需要在 [Devices] 部分中修改厂商和产品序号。例如"My Devicename"=LIBUSB_DEV, USB/VID_1234&PID_6789 表示厂商序号为0x1234,产品序号为0x6789。自动安装同时将libusb的所以文件和LibusbJava.dll 安装到了Windows/System32 目录下。

要验证安装已成功可以运行libusb-win32/bin文件夹下的testlibusb-win.exe 或运行 UsbView 程序,你也可以在Windows的设备管理器中找到已安装的设备。

 

Linux

libusb需要被安装并能运行,确保你拥有足够的权限以访问设备(查看this post). 要执行原文件中包含的build.xml 的编译等任务,你就需要先安装Ant

从这里获得libusb的Linux下版本源代码并运行 (查看„Binaries and Source“ )

# ant linux

在LibusbJava 目录下运行,这将创建名为libusbJava.so.x.x.x 的共享库,其中x.x.x为当前版本好,并创建一个标识链接到该库:

# ln -s libusbJava.so.x.x.x libusbJava.so

注意该库文件须在java.library.path 的路径下 (查看 JNI-Howto 以获取更多信息).

 

Binaries and Source(二进制及源代码文件)

你可以在此获得 Java jar文件here。共享库(Windows Dll)可以在此处下载here

Java和C++的源文件可以在Subversion repository 中匿名获取https://svn.ntb.ch/svninf/ch.ntb.usb/.

License(许可证)

Java libusb-win32封装包是基于GNU Lesser General Public License (LGPL)的。你可以在他们的页面上查看libusb-win32相关的许可证信息their page.

Feedback and Support(反馈和支持)

任何的反馈和支持请mail 给Simon Pertschy .

Links(链接)

  • libusb-win32, 支持的平台: Win98SE, WinME, Win2k, WinXP

  • libusb, 支持的平台: Linux, FreeBSD, NetBSD, OpenBSD, Darwin, MacOS X

Refence: http://inf.ntb.ch/infoportal/help/index.jsp?topic=/ch.ntb.infoportal/projects_usbInterface.html

http://libusbjava.sourceforge.net/wp

  以及之前发过的本文的原文,另外同一系列的还有两篇未读,也一并发了。

 

译者注:在网上搜了很久,一直想找WIndows下的Java的USB通用设备驱动API,之前找过jUSB和JSR80(javax.usb)然而这两个的可用版本还只提供了Linux下的实现,困惑了,难道要回归DDK,回归win32 API,本人对设备驱动编程和win32可谓一窍不通,也只能用OOP编几个简单的小程序,于是盯上了C#,原想都是M$的东西,你总该会照顾一点吧,然而总还只有一个开源的实现#libusb(Sharplibusb)。其实无论哪种方法,本质都是调用dll以实现动态调用方法。于是,Visual Studio 2005都下好了,也准备暂时把Java搁下的时候,想多了解下这个libusb,不知它提供了怎么样的解决方案,结果,就想去搜搜看libusb在Java上的扩展,说来也气人,之前用baidu,google怎么也搜不到,一输libusb java,就冒出了一篇文章用java实现在Windows下的USB API,看了它才恍然大悟,原来还有这个东东啊。慨叹不得法,无以入其门!

原来的是英文版本的,一时心血来潮,便翻译了一下,第一次作翻译工作,心情那个激动啊,所以难免有生硬和不当之处,又对这方面的了解浅显,有不懂装懂的地方,就请大家看它的原文吧,出错的地方也请指出,我会不断修改的。

至于Java libusb-win32,原文的安装方法多半让人看了头疼,我简单复述一下,其实都已经做成独立的安装程序了,下那个来装了就行,之后的步骤也容易。我自己为了能懂得原理以便开发,舍近求远,自己手动安装了下,受益匪浅啊。

首先,下载ch.ntb.usb.jar文件和LibusbJava.dll文件,还有就是libusb-win32-device-bin-0.1.12.1.tar.gz,这三个就是所需的全部了,解压最后者,安装用到的只是bin文件夹里的东西,复制其中的libusb0.dll 到windows/system32/ ,复制libusb0.sys 到windows/system32/drivers/,x64的用这两个文件的x64版本,inf-wizard.exe文件之后还有用处,留意一下。这样libusb-win32就已安装完毕,使用testlibusb-win.exe测试安装成功,可以显示一些信息;

接下来安装Java对libusb-win32的封装包,其实要安装的只是一个dll文件,让jni调用的功能而已,复制LibusbJava.dll 到windows/system32/,这样就好了。

那么,接下来如何使用呢?插入你要使用的USB设备,先不管Windows提示你安装硬件驱动程序的信息(放一边,我们后面再填),运行之前提到的inf-wizard.exe文件,如果它无法帮你识别得到的话才要自己输入厂商序号和产品序号,一步步操作下去就得到了inf和cat文件,这就是你这个设备的驱动了,保管好,在通过刚才Windows提示的安装硬件驱动指向这些文件,或者自己从设备管理器中安装设备的驱动为这些文件,这样,你自己的USB设备的驱动就安装好了,可以在设备管理器中查看到。这就是手动安装的过程,自动安装的话有它更简单的步骤,也有它另外生成dll和cat的方法,暂时没有考虑研究。

接着,用java运行jar中的ch.ntb.usb.usbView.usbView,它使用main方法,就可以得到如图示中的显示信息,再右键描述符启动usbTestApp,接下来的操作就要读者自己研究了,建议下它提供的svn源代码以及看它的在线API doc。

后面讲一些开发中的心得,本人目前尝试开发Java桌面应用程序,便学边用相关的api,包括打印,串口通信,USB通信,波形绘图,国际化和IO读写等,感觉受益很多,同时也很吃力,Java在桌面开发中并非强项,尽管6.0多了一些简单的东西,如任务栏图标,启动加载图片等,Java要想在桌面上分一杯羹,如一篇文章中说的,要努力实现核心类库的充实,使开发者尽量少用到jni实现,而对开源社区的吸纳和导向作用,也正依赖于标准APIs的制定。桌面开发中用到的IDE主要是Netbeans,本人同时用5.5和6的M10,感觉6改进很大,隐隐已有与Eclipse并驾齐驱之势,集成化和组件化是两个不同的趋势,撇开基本编译调试中使用到的智能化不讲(Netbeans 6 提供不少神奇的功能),两种趋势走到极端都无法成功,相互的借鉴和寻找恰如其分的平衡点才是一个IDE需要努力的地方。

尽管libusb API已经找到,但是否能成功地运用到项目中,针对特殊的硬件芯片所要调整的参数和所要适应的读写速率仍然很没底,本人不放弃可能使用WDM自行开发USB驱动的可能性(尽管就本人的实力会是impossible mission),同样的,未纳入标准类库的javax.comm是否适应于实际的串口通信产品(最近找到了rxtx),也仍是未知数,即便是java,在与.Net等其他技术的混战能否脱颖而出,得到广泛的使用和确立其OOP Language  No.1的地位,仍然是很不明确的:)学软件很累啊,前几天有空还看了点ruby入门,不知什么时候才有空看ajax,你说学C++的好点吧,可是我偏偏就喜欢java啊...

libusb-win32临时卸载方法(为了能用其他旧版本的驱动,需要先卸载,后来发现其实在任务管理器中卸载然后马上安装就足够了,下面的方法也不一定总是有效。)

以系统管理员身份进去系统

在设备管理器中卸载设备驱动

删除
C:/WINDOWS/system32/libusb0.dll
C:/WINDOWS/system32/drivers/libusb0.sys

删除注册表中项
HKEY_LOCAL_MACHINE/SYSTEM/ControlSet001/Control/Class/{EB781AAF-9C70-4523-A5DF-642A87ECA567}
HKEY_LOCAL_MACHINE/SYSTEM/ControlSet001/Services/libusb0
HKEY_LOCAL_MACHINE/SYSTEM/ControlSet002/Control/Class/{EB781AAF-9C70-4523-A5DF-642A87ECA567}
HKEY_LOCAL_MACHINE/SYSTEM/ControlSet002/Enum/USB/Vid_5345&Pid_1234
上一项可能不太好删,改一下权限再试试
HKEY_LOCAL_MACHINE/SYSTEM/ControlSet002/Services/libusb0
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Class/{EB781AAF-9C70-4523-A5DF-642A87ECA567}
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/libusb0

马上装新软件的设备驱动

重启,即可识别新设备驱动

抱歉!评论已关闭.