Windows下的Java訪問USB裝置解決之道(翻譯Java libusb / libusb-win32 wrapper)收

來源:互聯網
上載者:User
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

馬上裝新軟體的裝置驅動

重啟,即可識別新裝置驅動

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.