Hallo Ich habe ein Problem bei meinem aktuellen Projekt. Ich habe ein Java Programm geschrieben welches über eine GUI einzelne PINs des Arduinos schaltet. Der Arduino ist über ein USB Kabel mit dem PC verbunden. Für die Kommunikation zwischen dem Java Programm und dem Arduino habe ich die RXTX Bibliothek verwendet. Das hat soweit auch ohne Probleme funktioniert. Als nächstes wollte ich dann das Java Programm in ein Applet umschreiben und über Apache lokal bereitstellen. Das Applet funktioniert jetzt auch. Über den AppletViewer in Eclipse funktioniert es einwandfrei jedoch bekomme ich im Browser folgenden Fehlermeldung wenn ich die index.html Datei lokal aufrufe. Also noch ohne Apache. java.lang.ExceptionInInitializerError thrown while loading gnu.io.RXTXCommDriver Es muss ein Problem mit der RXTX Bibliothek sein. Die Exception wird erst geworfen wenn ich die serielle Verbindung zum Arduino öffne. Die GUI und die restlichen Funktionen funktionieren im Browser. Beim erstellen der Jar Datei welche dann in die HTML Datei eingebettet wird, habe ich die RXTX.jar und die beiden dll Dateien mit ausgewählt und zusätzlich die drei Dateien in das jre Verzeichnis kopiert. Hilft jedoch alles nix. Der HTML Code sieht wie folgt aus: <!DOCTYPE html> <html> <head> <meta charset="utf8" /> <title>File Javaapplet</title> </head> <body> <object type="application/x-java-applet;version=1.4.1" name="jsap" id="jsap" width="500" height="600"> <param name="archive" value="FileApplet.jar"> <param name="code" value="FileApplet"> <param name="mayscript" value="yes"> <param name="scriptable" value="true"> </object> </body> </html> Über einen Lösungsvorschlag würde ich mich rießig freuen.
Timo B. schrieb: > <object type="application/x-java-applet;version=1.4.1" name="jsap" version=1.4.1 Auf welcher Java-Version basiert die RXTX-Lib?
DirkZ schrieb: > Auf welcher Java-Version basiert die RXTX-Lib? bzw. mit welcher Java-Version führst Du das Applet aus?
Habe nicht wirklich Ahnung von Java, aber evtl. eine Idee. Kann es nach der Umwandlung in ein Applet ein Rechte-Problem sein? Applets werden doch auch häufig übers Web geladen und vom Browser gestartet - da dürfen die doch auch nicht so ohne Weiteres an der Hardware 'rummachen ... "Sandbox" und so ...
Ich weiß nicht, was genau das Problem ist, allerdings habe ich auch schon etwas mit RXTX gearbeitet (unter Mac OS X) und habe einen Verdacht. Zu der Bibliothek gehören bei mir die Dateien RXTXcomm.jar und librxtxSerial.jnilib. Ich denke, daß die JAR-Datei gefunden wird (sonst würde es vermutlich eine ClassNotFoundException geben), aber die andere Datei nicht. Das kann entweder an Pfaden oder an Sicherheitseinstellungen liegen. Für eins von beiden spricht auch, wenn es im AppletViewer geht und im Browser nicht. Es wäre zu prüfen, ob man im Webbrowser Debugausgaben aktivieren kann, z. B. mit welchen Pfaden und Environmentvariablen das Applet ausgeführt wird.
Und wo bleibt der Webserver aus dem Titel? Momentan scheint's mir so als wollte das Java-Applet mit dem Arduino über rxtx sprechen -- ist das so gewollt? Ohnehin würde ich heutzutage auf Java-Applets verzichten; HTML5 und Javascript haben sie überflüssig gemacht.
Nachtrag: Diese Lösung kann prinzipbedingt bestenfalls lokal funktionieren. Um die Steuerung tatsächlich von einem beliebigen Client übers Web zu steuern, brauchst Du eine Serverkomponente und eine Clientkomponente im Webbrowser, die mit der Serverkomponente kommuniziert. Bis jetzt bin ich allerdings von JavaScript wenig begeistert, außer für Frontends. Ich komme mir da vor wie in den 1980er Jahren, wo man mühsam von interpretierten BASIC-Programmen zu schnelleren und stabileren compilierten Programmen gekommen ist. Nur daß die Entwicklung heute schneller vorgeht. Ich vermisse mittlerweile einen Knopf im Webbrowser, der den JavaScript-Kram im Hintergrund abschaltet, da dieser teils den Rechner unglaublich ausbremst... Eine JavaScript-basierende Lösung könnte auch nicht einfach auf eine serielle Schnittstelle zugreifen...
Die Lösung wäre eine auf dem Server laufende Applikation, die TCP/IP-Zugriffe auf die lokale Serielle Schnittstelle umestzt. Dann könnte eine Smartphone-App entweder direkt darauf zugreifen, oder ein PHP-Script, dass gerade per Webserver abgerufen wird ...
Matthias H. schrieb: > Eine JavaScript-basierende Lösung könnte auch nicht einfach auf eine > serielle Schnittstelle zugreifen... Auf dem Client soll und darf das ohnehin keiner, auf dem Server: https://github.com/voodootikigod/node-serialport
Danke für die vielen Antworten. Also welche Version das ist kann ich dir garnicht genau sagen. Wo finde ich das?. Also mein jdk hat die Version 1.7.0_25. Mein Ziel ist es das ich in meinem lokalen Netzwerk auf einem beliebigen Client, die IP meines Servers in den Browser eingebe und dann einzelne PINs des Arduinos über Buttons starten kann. Der Arduino ist mit dem Server über USB verbunden. Das Programm soll also nicht auf die serielle Schnittstelle der Clients zugreifen sondern nur befehle am Server abschicken.
Timo B. schrieb: > Also welche Version das ist kann ich dir garnicht genau sagen. Wo finde > ich das?. Also mein jdk hat die Version 1.7.0_25. Verm. Windows? Start->Ausführen cmd eingeben und ausführen java -version ergibt zum Eintragen <object type="application/x-java-applet;version=1.7.0" name="jsap" dann funktioniert das Applet verm. immer noch nicht wie gewünscht. -> Sicherheit & Applet http://www.wikiservice.at/dse/wiki.cgi?JavaApplets [...] Normalerweise haben Applets, die aus dem Netz geladen wurden, nur eingeschränkte Zugriffsmöglichkeiten auf die Resourcen des Systems, auf dem sie ausgeführt werden. Sie laufen in einer sogenannten "Sandbox", in der sie nur harmlose Sachen machen dürfen. Will man erreichen, dass Applets auch Zugriff auf geschützte Resourcen haben, so muss man alle zu einem Applet gehörende Dateien in einem Jar-File verpacken und dieses Jar-File dann signieren. Ein Browser fragt immer nach, ob er ein signiertes Applet ausführen darf. Also vorsicht, wenn man hier auf "Ok" drückt. Um ein Jar-File signieren zu können, benötigt man zuerst ein Schlüsselpaar: keytool -genkey -alias testkey -dname "CN=Hans Mustermann, O=Test Verein, C=de" keystroke passwort: nullbock Ein Jar-Archive signieren: jarsigner -signedjar outjar injar testkey [...] Timo B. schrieb: > Mein Ziel ist es das ich in meinem lokalen Netzwerk auf einem beliebigen > Client, die IP meines Servers in den Browser eingebe und dann einzelne > PINs des Arduinos über Buttons starten kann. Der Arduino ist mit dem > Server über USB verbunden. Das Programm soll also nicht auf die serielle > Schnittstelle der Clients zugreifen sondern nur befehle am Server > abschicken. Hier ist IMHO eine einfache Webseite besser geeignet: z.B.: https://sites.google.com/site/xrobot17/project-1/web-server https://sites.google.com/site/arduinonetserver/home
Timo B. schrieb: > Mein Ziel ist es das ich in meinem lokalen Netzwerk auf einem beliebigen > Client, die IP meines Servers in den Browser eingebe und dann einzelne > PINs des Arduinos über Buttons starten kann. Im Prinzip stand schon alles in diesem Thread, aber dann werde ich die wichtigen Punkte noch mal zusammenfassen: - Du brauchst eine Client-Server-Lösung, wo der Server die Befehle über die serielle Schnittstelle an den Arduino absetzt usw. und der Client mit dem Server kommuniziert. - Die Lösung mit dem Java-Applet allein führt nicht weiter. Selbstverständlich kannst Du, falls gewünscht und falls Du Dich mit der Programmiersprache Java am wohlsten fühlst, ein Java-Applet als Client und eine Java-basierende Technologie auf dem Server einsetzen. - Direkte Client-Server-Kommunikation im Web ist noch relatives Neuland. Eine geeignete Technologie zur direkten Kommunikation über http bzw. eine http-Erweiterung nennt sich WebSocket. - Du kannst aber, wenn Du im lokalen Netz bleibst und nicht durch Firewalls, also über http mußt, einfach ein Client-Applet über normale Socket-Kommunikation mit einer vom Webserver unabhängigen Java-Application kommunizieren lassen. Das ist, was ich für diesen Anwendungsfall machen würde. Du kannst (aber wirklich nur für ein privates oder experimentelles Projekt im lokalen, kontrollierten Netz, sonst wäre es ein zu großes Sicherheitsrisiko!) einfach den Java-Server die Befehle an den Arduino vom Socket lesen und auf die serielle Schnittstelle schreiben und eventuelle Antworten von der seriellen Schnittstelle lesen und an den Socket schreiben lassen, dann kannst Du die Logik im Java-Applet, die Du schon fertig hast, weiter nutzen und mußt auf Client-Seite nur statt dem Ansprechen der seriellen Schnittstelle Socket-Kommunikation mit der Serverkomponente implementieren. Viel Erfolg!
Habe es jetzt in eine Client Server Lösung umgeschrieben. Der Server kommuniziert mit dem Arduino über die RXTX lib. Die Clients bauen eine Socket Verbindung zum Server auf. Beim Server wird jedem Client ein Thread zugewiesen, welcher auf Daten vom Client wartet und diese dann auswertet. Danach wird beim Server die passende Methode aufgerufen um dem Arduino die nötigen Befehle über die serielle Schnittstelle zu übermitteln. Dies funktioniert auch einwandfrei. Die client Software wird als jar Datei auf den Clients gestartet. Also im Moment als Application. Am liebsten wäre es mir aber wenn ich die client software über den Browser starten könnte. Jedoch bekomme ich folgende Exception, wenn ich die Client Software als Applet starte: java.lang.reflect.InvocationTargetException. In Eclipse funktioniert es auch hier wieder. Hat das Applet nicht die nötigen Berechtigungen um eine Socket Verbindung mit der Serversoftware aufzu bauen? Wie könnte ich das trotzdem realisieren?
Lege doch den server als Webserver aus, sodass du ihn über http ansprechen kannst. Was du über HTTP schickst (JSON, XML, etc.) ist dann egal. Dann braucht der Client auch kein Java-Applet mehr sein, AJAX und HTML tut's dann genauso. Ohnehin sind Java-Applets mittlerweile aus der Mode.
Timo B. schrieb: > java.lang.reflect.InvocationTargetException. Die Fehlermeldung war mit Sicherheit laenger...
ich würde halt gerne mein fertiges Clientprogramm weiterverwenden. ne leider nicht. Auch in der Konsole stand nix. Nur das browser popup mit dem obengenannten Fehler.
:
Bearbeitet durch User
Timo B. schrieb: > ich würde halt gerne mein fertiges Clientprogramm weiterverwenden. Problem: Das Applet darf per Default nur mit dem Webserver kommunizieren, von dem es geladen wurde. d.H.: dein Java-Server muss noch einen HTTP-Port aufmachen, das Applet dort ausliefern und den Apache sozusagen ersetzen. Alternativ: den Apache eine Location per Reverse-Proxy auf dein Server-Java-Programm legen lassen. Oder du forderst im Applet erweiterte Berechtigungen für beliebige Netzwerk-Verbindungen an.
Ok danke das klingt schonmal gut jedoch übersteigt das gerade meine Java Kenntnisse. Muss mich da jetzt erstmal drüber informieren aber schonmal vielen Dank. Welche der drei Lösungen wäre denn die empfehlenswerteste?
Timo B. schrieb: > ich würde halt gerne mein fertiges Clientprogramm weiterverwenden. > > ne leider nicht. Auch in der Konsole stand nix. Nur das browser popup > mit dem obengenannten Fehler. Aktivieren im Javacontrolpanel mal die Java Console, dann kannst du da auch debuggen. Falls deine HTML/Appletlösung nicht direkt vom (Java)Server ausgeliefert wird hast du das Problem, dass du ohne Signierung nicht mit anderen Servern reden darfst.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.