Raspberry Roboter Websteuerung
Hallo,
ich möchte gerne meinen Roboter mit Raspberry-Gehirn unter anderem über eine Webseite steuern können.
Auf dem Raspberry läuft ein lighttpd Webserver und ein Pythonscript (Steuerung der Motoren usw.).
Die Webseite soll bei Tastendruck auf Buttons die jeweiligen Informationen ohne die Seite neu laden zu müssen an das Pythonscript weiterleiten. Aber es sollte auch möglich sein Informationen wie Sensorwerte and die Webseite zu senden (auch ohne laden der Seite).
Das Pythonscript soll als Schleife laufen ,da es auch noch andere Schnittstellen verarbeitet.
Wie kann ich die Kommunikation realisieren?
Da die Webseite sich aktualisieren soll, ohne die Seite neu zu laden, muss ich da wohl etwas Javascript anwenden?
Doch wie kann ich vom Javascript aus Informationen mit einem unabhängig laufendem Pythonprogramm austauschen?
Meine Suche im Netz hat mir schon einige Stichworte wie ajax und cgi gebracht, doch weiß ich nicht so ganz, wie man die Kommunikation damit umsetzen kann.
Denn bei Cgi und ajax habe ich nur Beispiele gefunden, wie diese Pythonscripte starten können. Nicht aber das, was ich gerne haben möchte.
Würde mich freuen, wenn mir einer helfen könnte...
Der Einsteiger
Liste der Anhänge anzeigen (Anzahl: 1)
Danke für die Antworten :)
Zu Ceos: warum ist es denn dann keine Websteuerung über Browser mehr? Wenn ich im Browser die Webseite des Pis eingebe und dann das Javascript( welches die Tcp Verbindung mit dem Server beginnt) mit einem Button starte, dann steuere ich den Roboter doch über den Browser, oder funktioniert das so nicht? Browser(TCP/Javascript) <=> Server(TCP/Python)
Zum Thema HTML, PHP und auch GPIO:
So wollte ich das auch erst lösen. Doch habe ich herausgefunden, dass PHP nur serverseitig ausgeführt wird. Und das schafft gleich mehrere Probleme, die ich für meine Websteuerung nicht haben möchte.
1. Muss bei jeder Interaktion (Button click) die Webseite komplett neu geladen werden. Das habe ich früher schon mal ausprobiert. Wenn man nur einen festen Aufbau wie eine Lampe hat ist das nicht so schlimm, da diese eh nicht häufig Steuerimpulse bekommt... Da der Robi aber im WLAN ist und recht zügig Befehle empfangen muss funktioniert das nicht so toll wenn ständig die Seite neu geladen wird...
2. Ist keine gute bidirektionale Verbindung möglich, da bei z.B. Button click man nur per PHP entweder ein Pythonscript starten könnte, was dann die Ausgabe von Steuerimpulsen erlaubt, oder man direkt per PHP wie piggituX gesagt hat die GPIOs ansteuern könnte.
3. Möchte ich nicht die GPIOs normal nutzen, sodern möchte z.B. über I2C Motoren steuern oder Kommunikation mit anderen Dingen durchführen. Dies klappt aber nur, wenn das Script in einer Schleife laufen kann und nicht für jeden Vorgang neu gestartet werden muss...
4. Über PHP lassen sich von einem Pythonscript keine Informationen an die Webseite schicken... (jedenfalls wenn die Bedingung 3. erfüllt sein soll)
Das was shedepe beschreibt, hört sich doch schon mal gut an. Werde ich auf jeden Fall drüber nachdenken. Momentan habe ich das nämlich noch nicht durchblickt... Einen Nachteil sehe ich dabei aber. Es würde nicht mehr so einfach sein mehrere Webseiten mit unterschiedlichen Dingen zu basteln. Die Webseiten brauchen ja auch noch CSS und so... :D
Ich möchte erst mal noch ein bisschen probieren, ob ich die TCP Lösung hinbekomme, wenn nicht, dann komme ich auf diesen Ansatz zurück.
Der Tcp Ansatz müsste mir doch eigentlich noch einen Vorteil bringen...Theoretisch kann man doch auch die Serverseite mit dem Python Code auf einen anderen PC auslagern??
Probiere gerade die Lösung aus: http://stackoverflow.com/questions/1...-communication
Ich verwende gerade die Lösung Html5 socket von Antwort 1 aus dem Link für mein Javascript im Browser und für das Pythonscript(auf meinem PC, nicht auf PI!!):
Code:
import socketserver
class ChatRequestHandler(socketserver.BaseRequestHandler):
def handle(self):
addr = self.client_address[0]
print("[{}] Verbindung hergestellt".format(addr))
while True:
s = self.request.recv(1024)
if s:
print("[{}] {}".format(addr, s.decode()))
else:
print("[{}] Verbindung geschlossen".format(addr))
break
server = socketserver.TCPServer(("", 50000), ChatRequestHandler)
server.serve_forever()
Wenn ich das Javascript von Microsoft Edge aus ausführe passiert nichts, wenn ich die Seite aber von Chrome aus verwende gibt mir mein Pythonscript das aus:
Anhang 32518
Leider schaffe ich es noch nicht Nachrichten zu senden oder zu empfangen...
Wenigstens verbindet sich da was. Darauf lässt sich ja aufbauen...
Ich verstehe nur noch nicht, wie das mit dem Handshake dings weiter unten im Link funktioniert??