Forum: PC-Programmierung Arduino mit Java Applet über Webserver steuern


von Timo B. (bits10)


Lesenswert?

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.

von DirkZ (Gast)


Lesenswert?

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?

von DirkZ (Gast)


Lesenswert?

DirkZ schrieb:
> Auf welcher Java-Version basiert die RXTX-Lib?

bzw. mit welcher Java-Version führst Du das Applet aus?

von Frank (Gast)


Lesenswert?

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

von Matthias H. (experimentator)


Lesenswert?

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.

von Lukas K. (carrotindustries)


Lesenswert?

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.

von Matthias H. (experimentator)


Lesenswert?

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

von Frank (Gast)


Lesenswert?

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

von Lukas K. (carrotindustries)


Lesenswert?

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

von Timo B. (bits10)


Lesenswert?

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.

von DirkZ (Gast)


Lesenswert?

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

von Matthias H. (experimentator)


Lesenswert?

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!

von Timo B. (bits10)


Lesenswert?

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?

von Lukas K. (carrotindustries)


Lesenswert?

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.

von Fux (Gast)


Lesenswert?

Timo B. schrieb:
> java.lang.reflect.InvocationTargetException.

Die Fehlermeldung war mit Sicherheit laenger...

von Timo B. (bits10)


Lesenswert?

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
von Εrnst B. (ernst)


Lesenswert?

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.

von Timo B. (bits10)


Lesenswert?

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?

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.