# USB Geräte ansprechen



## buk (29. Jul 2010)

Guude,

mich interessiert es, wie ich unter Java USB Geräte ansprechen kann. Mit C++ spreche ich USB Geräte über die CreateFile/ReadFile/WriteFile/DeviceIoControl/ Funktionen an. Im speziellen geht es mir hierbei um, über USB angeschlossene Drucker. Es ist auch nichts wildes, ich will lediglich die DeviceID des Druckers auslesen, welche vom Typ her ein String ist. Diese will ich auswerten, ggfs. verändern und dann wieder zum Drucker senden. Unter C++ geschieht das Senden und Empfangen über die ReadFile und WriteFile Funktionen.

Ich bin beim suchen hier im Forum und per Google desöfteren über die JNI gestolpert. Nur wäre ich doch damit wieder an das Betriebssystem gebunden, da ich unter Windows zum Beispiel die <Windows.h> einbinden müsste um auf die WinApi32 zugreifen zu können. Hat Java da nichts eigenes?

Ihr merkt, ich stehe da auf dem Schlauch und mir fehlt komplett der Ansatz. Es wäre super wenn mich mal jemand in die richtige Richtung schubsen könnte.

Grüße,
buk


----------



## Atze (29. Jul 2010)

vielleicht hilft dir das

Access USB devices from Java applications


----------



## tuxedo (5. Aug 2010)

> Hat Java da nichts eigenes?




Leider nein ...  Entweder eine JNI/JNA Schnittstelle für jede Plattform anbieten, oder die Sprache wechseln...

- Alex


----------



## buk (5. Aug 2010)

Guude,

nach reichlicher Überlegung werde ich mich wohl mit C# und P/Invoke[1] beschäftigen.
Schade das mir Java da nichts anbieten kann, andererseits ist Java eine Platformunabhängige Sprache, und bevor ich mit JNI anfange bleibe ich besser bei C/C++ bzw. C# mit P/Invoke.

Danke für eure Antworten!

Regards,
buk

[1] pinvoke.net: the interop wiki!


----------



## tuxedo (5. Aug 2010)

Naja, ich seh das so... Entweder dir JVM bietet mir den Platformunabhängigen Zugriff auf die gewünschte HW, oder ich muss selbst für jede Plattform was basteln und eine einheitliche API drüber legen. Das Ergebnis ist, bis auf den Fakt dass ich die DLL für die Plattform mitliefere und nicht die JVM, das gleiche.

Mit C# wird die Sache nicht wirklich besser. Nur ist's da schon eingebaut. Aber mit Plattformunabhängig wäre ich da vorsichtig, auch wenn es Dinge wie MONO gibt.

- Alex


----------



## buk (5. Aug 2010)

Guude,

naja es geht ja eigentlich nur darum, an diesen String zu kommen, diesen auszulesen, auszuwerten, zu verändern, und wieder zum Drucker zu senden. In C++ spreche ich eben über die WinApi32 Funktionen CreateFile, ReadFile, WriteFile, ... mit dem Drucker. Das ich in Java dazu keine Möglichkeit habe, kann ich mir fast nicht vorstellen ...

Regards,
buk


----------



## tuxedo (5. Aug 2010)

Vorstellung hin oder her: Die JVM bzw. die Java Standard API bietet von Haus aus nichts an, mit dem du USB-mäßig lesen oder schreiben kannst. Die von die angesprochenen Methoden werden in Java nur in Verbindung mit dem Dateisystem genutzt.

Du kommst also um eine native Lösung nicht drum rum.


----------



## buk (5. Aug 2010)

Guude,


tuxedo hat gesagt.:


> Vorstellung hin oder her: Die JVM bzw. die Java Standard API bietet von Haus aus nichts an, mit dem du USB-mäßig lesen oder schreiben kannst. Die von die angesprochenen Methoden werden in Java nur in Verbindung mit dem Dateisystem genutzt.


Aus diesem Grund bleibe ich ja schlussendlich bei C/C++ und der WinApi32, bzw. schaue mal das ich das mit C# und P/Invoke hinbekomme.



tuxedo hat gesagt.:


> Du kommst also um eine native Lösung nicht drum rum.


Du hast ja recht. Aber es wäre schon schöne gewesen, mal meinen Horizont zu erweitern ...

Regards,
buk


----------



## tuxedo (5. Aug 2010)

buk hat gesagt.:


> Du hast ja recht. Aber es wäre schon schöne gewesen, mal meinen Horizont zu erweitern ...



Dem steht doch nichts im Wege? Wenn du unter Linux und MacOSX noch eine vergleichbare API findest, hast du die 3 Major-OS abgedeckt und kannst eine einheitliche Java-API drauf setzen und der Community anbieten. Dann hast du deine Plattformunabhängigkeit mit Java wieder 

- Alex


----------



## Gast2 (5. Aug 2010)

> Mit C# wird die Sache nicht wirklich besser. [...] Aber mit Plattformunabhängig wäre ich da vorsichtig, auch wenn es Dinge wie MONO gibt.


wenn man unter C# mit P/Invoke anfängt, gibt es Plattformunabhängigkeit nicht mehr ... da ist egal ob es mit Mono theoretisch geht



buk hat gesagt.:


> nach reichlicher Überlegung werde ich mich wohl mit C# und P/Invoke[1] beschäftigen. [...] bevor ich mit JNI anfange bleibe ich besser bei C/C++ bzw. C# mit P/Invoke.


wieso willst Du Dich selber mit P/Invoke geiseln?? ... nimm C++/CLI und binde die Assembly in C# ein ... C++/CLI ist genau dafür gedacht - #include "windows.h" und gut ist

hand, mogel

PS: C++/CLI != C/C++ !!


----------



## andiv (5. Aug 2010)

> PS: C++/CLI != C/C++ !!



C++/CLI != C++ && C++ != C

Und an deiner Stelle würde ich mich direkt entweder auf C oder C++ beschränken. Oder wozu brauchst du den .NET-Kram?


----------



## buk (5. Aug 2010)

Guude,


andiv hat gesagt.:


> Und an deiner Stelle würde ich mich direkt entweder auf C oder C++ beschränken. Oder wozu brauchst du den .NET-Kram?


den .NET-Kram brauch ich nicht. Wir benutzen die guten alten Microsoft Foundation Classes als Framework. Was auch super funktioniert. Es ging hier lediglich um meinen sportlichen Ehrgeiz mal was neues zu versuchen.

Regards,
buk


----------



## schubidu (20. Jan 2011)

Hmm,
vielleicht würde sowas helfen?
UsbDevice (JavaDOC for javax.usb API)


----------



## buk (20. Jan 2011)

Guude,

danke für den Link.


----------



## hansmueller (21. Jan 2011)

Hallo,

ist jetzt nicht so mein Gebiet, aber... es gibt in der Api eine Menge "PrinterXXX"-Klassen. Man kann mit Java zwar nicht die USB-Ports an die ein Drucker angeschlossen ist direkt abfragen, aber man kann sich so einige Infos über die im Betriebsystem installierten Drucker ausgeben lassen.

MfG
hansmueller


----------

