Websocket Steuerung

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo zusammen,

    ich versuche mich nun seit 4 Tagen an Websockets (überwiegend Tornado)
    und spiele alle Tutorial durch die ich irgendwie finde, aber meistens funktioniert irgendwas nicht. Oder besser gesagt, ich finde nicht die passenden Tutorial für mein Vorhaben.

    Ich bastel immernoch an meiner Multifunktionsfernbedienung rum. Im Moment läuft sie noch über php.

    Kennst zufällig jemand ein Tutorial in den über eine Weboberfläche auf dem Raspberry verschiedene Befehle ausgeführt werden.

    Zum Beispiel GPIO steuern LED, oder runterfahren, Reboot... völlig egal...
    sollte nur leicht verständlich sein, also nicht zu viel drum rum...

    Vielen Dank und viele Grüße
    Markus

  • Hallo Meigrafd,

    Der Link war einer der ersten, aber es ist so umfangreich und in den meisten Bereichen verstehe ich nur Bahnhof :)

    Ich hab heute Mittag ein Posting von dir gesehen ... Python-PHP-JS Rückgabewerte problem

    Das sah eigentlich recht einfach aus, aber irgendwie funktionierte es nicht...

    Die 5 Dateien die du gepostet hast habe ich in den web ordner gepackt (var/www)

    Gerade dachte ich, da fehlt noch ne Python datei und habe diese genommen (WebSocketControl.py)

    Wenn ich nun die Python datei ausführe und die Seite "192.168.178.37:7070" aufrufe
    erhalte ich "Can "Upgrade" only to "WebSocket"." und ich hab keine Ahnung was das bedeutet, bzw wo der fehler liegt :s

    Hoffe du kannst mir helfen, über das Thema verzweifel ich echt gerade...

    Irgendwo fehlt mir ein wichtiger Wissensbaustein... dass das alles nicht funktioniert was ich bisher getestet habe...

    Vielen Dank schon mal

    Markus


    Ach ja.... in der Konsole bekomme ich folgende Meldung:

    "WARNING:tornado.access:400 GET / (192.168.178.39) 10.10ms"

    Den sehe ich immer wieder... aber trotz Goggle komm ich nicht dahinter was es bedeutet...

    Einmal editiert, zuletzt von Markus1979 (10. Oktober 2014 um 21:51)

  • Ich versteh ebenfalls nur Bahnhof - wieso rufst du eine Seite über Port 7070 auf?

    Du musst die Webseite in form der PHP Dateien ansurfen (index.php). Da wird über das JavaScript eine Verbindung zum WebSocketControl.py hergestellt - das geschieht über Port 7070. Aber diesen Port 7070 musst du nicht ansurfen! Da bringst du also gewaltig etwas durcheinander...

    Und ich weiß auch nicht wo in der Konsole du diese WARNING Meldung gekriegt haben könntest :huh:

    Ich kann viel, aber hellsehen leider (noch) nicht

  • Gibt es einen besonderen Grund, dass Du PHP und Python gemischt verwendest? Ich hab extrem gute Erfahrungen mit Python + Flask + flask-socketio gemacht. Python hat den Vorteil, dass Du die zahlreichen Bibliotheken für den Raspberry Pi benutzen kannst.

    Ein genaues Tutorial dazu kenne ich nicht, es gibt allerdings zu den einzelnen Themen gute Tutorials: Easy WebSockets with Flask and Gevent und GPIO Python Library. Im Prinzip musst Du dann nur das Wissen aus beiden Tutorials in dein Projekt fließen lassen. ;)

  • Naja worüber man das letztlich realisiert ist denk ich wurscht - es muss aber in jedem Fall richtig gehandhabt werden... Nur Gott weiß wieso er versucht Port 7070 anzusurfen, das ist so gar nicht vorgesehen und kann halt auch nicht funktionieren... Er muss also erst mal generell die Funktionalität verstehen. Würde er jetzt Chris1705's Vorschlag versuchen umzusetzen aber auch da den WebSocket versuchen anzusurfen, würde er genauso scheitern.

    Ich hab den Ablauf hier ja bereits beschrieben:
    - Javascript stellt eine Verbindung über WebSocket zum Tornado-Python her.
    - Javascript setzt einen Befehl ab, zum Beispiel: get.system.uptime
    - Tornado übergibt diese Anfrage an eine "def" in der der Befehl bearbeitet wird -> auslesen der /proc/uptime Datei und den Richtigen Wert zurückgeben (return)
    - Tornado schickt den return über die selbe Verbindung wieder zurück
    - Javascript aktualisiert den entsprechenden div/id im HTML Code

    Das js Script stellt die Verbindung her. Man selber muss aber die PHP Datei (index.php) öffnen, nämlich über den Webbrowser. Die index.php bzw der Webserver verarbeitet alles.
    Die websocket.js verbindet sich dann zum WebSocketControl.py auf Port 7070
    Aber er selber muss Port 80 ansurfen, das ist der StandardPort vom HTTP Protokoll. Surft man dieses Forum an wird ebenfalls Port 80 genutzt.

    Keine Ahnung wie ich das sonst umschreiben soll...

  • Naja, ich bin nicht so der Fan von für ein Problem gleich mehrere Programmiersprachen zu nutzen, wenn man keinen besonderen Anlass dazu hat. Aber egal. :)

    Du hast natürlich recht. Er muss deine PHP-Skripte ansurfen und nicht den Websocket. Deswegen bekommt er auch den HTTP 400 Fehler (Bad Request), weil nur WebSockets erlaubt sind und er ein GET darauf versucht.

  • Hallo zusammen,

    vielen Dank für eure Hilfe, aber ich bin anscheinend zu blöd dafür... Ich habe den Raspberry gerade noch einmal neu aufgesetzt... Webser, Tornado usw...

    ich habe die Dateien aus "Python-PHP-JS Rückgabewerte problem" in /var/www gepackt... inklusive "include" und dem "js" Ordner...
    Die Datei WebSocketControl.py habe ich in /home/pi abgelegt und über putty mit "sudo python WebSocketControl.py" gestartet...

    Also Rückmeldung erscheint "Enabling DEBUG mode!"

    nun habe ich im Browser die IP Adresse des PIs aufgerufen... 192.168.178.37 (ohne Port)

    Aber es gibt keine Verbindung! Die ausgabe sieht wie folgt aus...

    Code
    Status: closed Uptime:  __:__:__
     
    [object WebSocket]
    Error detected: [object Event]
    Connection closed!
    Sent data: >>>get.system.loadavg get.system.uptime get.system.ram<<<
    Sent data: >>>get.system.loadavg get.system.uptime get.system.ram<<<
    Sent data: >>>get.system.loadavg get.system.uptime get.system.ram<<<
    Sent data: >>>get.system.loadavg get.system.uptime get.system.ram<<<
    Sent data: >>>get.system.loadavg get.system.uptime get.system.ram<<<

    und sobald ich die "192.168.178.37" aufrufe bekomme ich in Putty folgende Meldung

    WARNING:tornado.access:403 GET / (192.168.178.39) 11.60ms

    Ich verstehe es einfach nicht :wallbash:


    **************
    Edit:

    Ich habe gerade ein anderes Tutorial ausprobiert... Punkt 1 - bis 1.3 Demo

    Sobald ich auf "open" klicke öffnet sich das Alert-Fenster "Connection close"

    Da kann doch irgendwas grundsätzlich nicht stimmen, egal welches Tutorial ich ausprobiere sagt Singemäß "Connection close" oder ähnliches.

    Einmal editiert, zuletzt von Markus1979 (12. Oktober 2014 um 18:57)

  • Halten wir fest: Dein einziges Problem scheint es mit der WebSocketControl.py zu geben..

    Hast du pip installiert? Wenn ja mach mal folgendes:

    Code
    pip install tornado --upgrade

    Und dann führ das Script noch mal aus.

  • Hallo meigrafd,

    hab ich gerade gemacht, ist alles up-to-date, keine Besserung, Problem besteht immer noch

    Zitat

    Requirement already up-to-date: tornado in /usr/local/lib/python2.7/dist-packages
    Requirement already up-to-date: certifi in /usr/local/lib/python2.7/dist-packages (from tornado)
    Requirement already up-to-date: backports.ssl-match-hostname in /usr/local/lib/python2.7/dist-packages (from tornado)
    Cleaning up...

    Muss man vielleicht noch irgendwelche Berechtigungen vergeben?
    wie zB www-data und sudoers, wenn man über php shell-exce ausführen möchte?

    Oder Irgendwelche sonstigen Einstellungen vielleicht?

    Vielen Dank und viele Grüße
    Markus

  • Hallo meigrafd

    Code
    python pdb WebSocketControl.py

    funktionierte nicht

    python: can't open file 'pdb': [Errno 2] No such file or directory

    ich hab es dann wie folgt gemacht, hoffe das war richtig, so stand es auf der Internetseite

    Code
    python -m pdb WebSocketControl.py

    Ergebnis:

    Code
    > /home/pi/WebSocketControl.py(10)<module>()
    -> import tornado.web
    (Pdb)
  • Sorry, stimmt, python -m pdb ... musste es sein.

    Bei jedem (Pdb) Promt gibst du nun continue ein - so siehst du Schritt für Schritt was gemacht wird. Es reicht auch c . Siehe dazu: https://docs.python.org/2/library/pdb.html#debugger-commands
    Wenn er die Threads gestartet hat musste halt dein WebIf auf machen und ein Connect herstellen - dann gucken was bei dir schief läuft


    Ich seh aber auch gerade das ich im Javascript noch einen kleinen Fehler habe, es fehlt .data beim Ausgeben von error . Es sollte also wie folgt aussehen:
    [code=php]
    function WebSocket_Open() {
    ws = new WebSocket("ws://"+location.host+":7070");
    mylog(ws)
    ws.onerror = function(error) {
    mylog('Error detected: ' + error.data);
    }
    ws.onopen = function() {
    mylog('Connection opened!');
    set_ws_status("opened")
    }
    ws.onclose = function() {
    mylog('Connection closed!');
    set_ws_status("closed")
    }
    ws.onmessage = function(e) {
    var message = e.data;
    //mylog('Received message: >>>'+message+'<<<');
    parseResponse(message.split("\n"))
    }
    }
    [/php]
    Dann sollte die Fehlermeldung die dir im WebIf angezeigt wird auch aussagekräftiger ausfallen :fies:

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!