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“ ).

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/(见下一部分).

自动安装时也可以使用另一种方式,修改/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

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

译者注:在网上搜了很久,一直想找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

马上装新软件的设备驱动

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

java libusb_Windows下的Java访问USB设备解决之道(翻译Java libusb / libusb-win32 wrapper)收...相关推荐

  1. 在Java 应用程序中访问USB设备

    Java 平台一直都以其平台无关性自豪.虽然这种无关性有许多好处,但是它也使得编写与硬件交互的 Java 应用程序的过程变得相当复杂.在本文中,研究科学家蒋清野讨论了两个项目,它们通过提供使Java ...

  2. usb设备由生产到使用 java 114979888

    usb设备由生产到使用 java 114979888 定义好USB的生产标准 固定的宽高 可以运行 USB风扇 尊守USB标准 USB充电线 定义电脑类 public class Pc {// 品牌p ...

  3. Linux下的硬件驱动——USB设备(下)

    Linux下的硬件驱动--USB设备(下)(驱动开发部分) 文档选项 打印本页 将此页作为电子邮件发送 未显示需要 JavaScript 的文档选项 级别: 初级 赵明, 联想软件设计中心嵌入式研发处 ...

  4. Linux下的硬件驱动——USB设备

    想起当初对于破安卓手机,挂在系统上可是费了好些劲,今偶遇USB驱动开发,收集备用,哪天一生气,说不定也写一个linux下的手机驱动,类似于91手机助手的,也不用配置了. Linux下的硬件驱动--US ...

  5. Win10 Hyper-V设置文件、访问USB设备

    前言 之前使用了Win10 Hyper-V创建虚拟机,那么如何向虚拟机中导入资料呢,如此重要的步骤,如下展示. 设置共享文件 1.找到建立虚拟机文件夹时的目录下的Virtual Hard Disks文 ...

  6. Win7系统下插入新的usb设备都提示安装驱动失败的解决方法

    1.首先鼠标右击win7系统桌面上的计算机图标,选择"设备管理器"选项: 选择"设备管理器"选项 2.然后右键有叹号的USB设备,更新驱动程序.不要选自动搜索, ...

  7. java 写文件 权限不够_教你解决Linux系统中JAVA创建文件后权限不足的问题

    在作业中,项目使用文件上传. 这个功能很常见. 当Kai Ge今天更改其官方帐户时,他遇到了一个问题,即无法访问下载的文件,也无法通过浏览器访问该文件. 它是怎么发生的? 经过许多问题之后,事实证明这 ...

  8. 解决pd16虚拟机 mac 联网失败问题?pd16不能连接USB设备解决方法

    Parallels Desktop 16 被称为macOS上最强大的虚拟机软件,可以在 Mac 下同时模拟运行 Win.Linux.Android 等多种操作系统及软件而不必重启电脑,并能在不同系统间 ...

  9. 无法识别设备powerstate_win7系统无法识别usb设备如何解决 电脑无法识别usb设备解决步骤【图文】...

    相信很多用户都遇到过电脑无法识别usb设备的情况,其实出现这种情况的主要原因是因为硬件的问题,比如usb设备本身损坏和借口损坏,软件驱动问题usb驱动异常,那么win7系统无法识别usb设备怎么办呢? ...

最新文章

  1. 点击拖动放大该图片大小
  2. leetcode算法题-- 买卖股票的最佳时机
  3. 4.5 计算机网络之网络层路由选择协议(自治系统AS、RIP、OSPF、BGP)
  4. 我对创业和管理的一些看法
  5. BigDecimal转String,int,double及简单操作运算、方法
  6. c++椭圆最小二乘法原理_c++ 椭圆拟合之最小二乘法(图像处理)
  7. 超越 PyTorch,他立志做全球最有影响力的深度学习框架!
  8. 浅谈n个球和m个盒子之间的乱伦关系
  9. Direct3D的初始化
  10. MySQL - 查询今天的数据(以及昨天、本月、上个月、今年...)
  11. UI设计中关于按钮的那些事
  12. andriod studio 自带模拟器设置开发者模式
  13. 四招搞定托业(TOEIC)英语阅读
  14. 6 cocos2dx粒子效果,类图关系,系统原生粒子和自定义粒子效果,粒子编译器软件,爆炸粒子效果,烟花效果,火焰效果,流星效果,漩涡粒子效果,雪花效果,烟雾效果,太阳效果,下雨效果
  15. 深圳超美海边烧烤场 深圳户外烧烤攻略
  16. docker 实践(十一)docker swarm
  17. 立创eda学习笔记二十六:手把手教你使用立创eda的官方教程
  18. 【枚举】CF809A
  19. pytorch自学笔记
  20. learn-css 学习总结

热门文章

  1. linux可视化界面黑屏,Fedora 14 不能进入图形界面 显示黑屏的解决办法
  2. cesium实用功能-选中gltf、glb拖动修改位置,bim没试
  3. 带音效的计算机软件,音效增强软件哪个好用?好用的音效增强软件推荐
  4. 【考研政治】2021肖八整理(毛中特部分)
  5. 高质量的原创对于搜索引擎来说是非常的友好的
  6. Django项目127.0.0.1 拒绝了我们的连接请求。
  7. 解决“javac不是内部或外部命令,也不是可运行的程序”问题
  8. ngrok转发mysql连接_ngrok内网转发
  9. 基于c语言的象棋游戏
  10. web高德地图路线规划(多条)