Fernsteuerung eines Raspberry Pi über HTML-Seite

  • Guten Tag zusammen,


    ich realisiere gerade ein Projekt mit einem Raspberry Pi. Ich möchte diesen per WLAN fernsteuern können.


    WLAN-AccessPoint habe ich eingerichtet, funktioniert alles. Vom Online-Projekt "BrickPi" gibt es eine Anleitung, den Raspi per HTML-Website fernzusteuern.


    Dies funktionert vom Computer aus auch wirklich wunderbar.


    Nur vom Smartphone aus funktioniert es leider nicht (ausprobiert mit 3 verschiedenen Browsern)


    Ich kenne mich in dieser HTML-Seitenur mäßig aus, wie gesagt, sie kommt aus einer Anleitung. Meine Frage ist nun, was der Grund dafür sein könnte, dass sie auf dem Computer einwandfrei läuft und auf dem Smartphone nicht? Also dargestellt wird sie auch auf dem Smartphone einwandfrei. Sobald ich aber die IP-Adresse des Raspberry eingebe und auf den dafür vorgesehenen Bestätigungs-Button klicke, passiert nichts. Wenn ich das ganze am PC mache, bekomme ich auf meinem Raspi in der Konsole die entsprechenden Ausgaben.


    Worin unterscheiden sich evtl. die Browser auf dem Computer zu denen auf dem Smartphone? Da kenne ich mich leider nicht aus.


    Wie könnte ich dieses Problem evtl. beheben? Den Code der HTML Seite füge ich nachfolgend ein: Falls das nicht funktionieren sollte, ist er auch hier einzusehen:


    https://github.com/DexterInd/B…/Browser_Client_Code.html




    Die Anleitung selbst: http://www.dexterindustries.com/BrickPi/projects/browserbot/




    Ich hoffe mir kann hier jemand helfen..




    Mit freundlichen Grüßen




    Tobias


    HTML
    <!-- ######################################################################## # Program Name: Browser_Client_Coder.html # ================================ # This code is for controlling a robot by a web browser using web sockets # http://www.dexterindustries.com/ # History # ------------------------------------------------ # Author Comments # Joshwa Initial Authoring # # These files have been made available online through a Creative Commons Attribution-ShareAlike 3.0 license. # (http://creativecommons.org/licenses/by-sa/3.0/) # ######################################################################## --> <!-- This code implements the web socket connection between client(web page on a Computer) and a server(raspberry pi) --> <!-- It sends data from web page using buttons and Keyboard presses to control the BrickPi robot --> <!DOCTYPE html> <html> <head> <title>WebSockets Client</title> <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script> </head> <body> </br></br> </br> <p> <!-- Creating press buttons on the webpage--> <input id="touch" style="height: 100px; width: 100px; position: absolute; left: 550px; top: 100px" type="button" value="Accelerate" onclick="accelerate(); " /> </p> <p> <input id="touch" style="height: 100px; width: 100px; position: absolute; left: 450px; top: 200px" type="button" value="Steer Left" onclick="steer_left(); " /> </p> <p> <input id="touch" style="height: 100px; width: 100px; position: absolute; left: 550px; top: 200px" type="button" value="Stop" onclick="stop(); " /> </p> <p> <input id="touch" style="height: 100px; width: 100px; position: absolute; left: 650px; top: 200px" type="button" value="Steer Right" onclick="steer_right(); " /> </p> <p> <input id="touch" style="height: 100px; width: 100px; position: absolute; left: 550px; top: 300px" type="button" value="Reverse" onclick="reverse(); " /> </p> </br></br></br></br> <div id="send"> </br></br></br></br></br></br></br></br></br></br></br></br> <p> Enter the hostname/ip address to make the websocket connection </p> <input type="text" id="data" size="100"/><br> <input id="clickMe" type="button" value="clickme" onclick="setup2()" /> </br></br> <p><span style="font-weight:bold">Instructions for keyboard controls:</span></p> <p>Press Up arrow key - Acceleraate </p> <p>Press Down arrow key - Reverse </p> <p>Press Right arrow key - Steer Right</p> <p>Press Left arrow key - Steer Left</p> <p>Press cltr/shift key to Stop</p> </div> </div> <div id="output"></div> <script> var up; var down; var left; var right; var brakes; // defines a variable that controls the forward movement function accelerate() { up = "u"; // when up == "u" the bot moves forward down = "aaa";left = "aaa";right = "aaa";brakes = "aaa"; // When up button is pressed other buttons(variables) should be turned off. setup2(); // Goes to websocket connection function } // defines a variable that controls the backward movement function reverse() { down = "d"; up = "aaa";left = "aaa";right = "aaa";brakes = "aaa"; setup2(); } // defines a variable that controls the left movement function steer_left() { left = "l"; up = "aaa";down = "aaa";right = "aaa";brakes = "aaa"; setup2(); } // defines a variable that controls the right movement function steer_right() { right = "r"; up = "aaa";down = "aaa";left = "aaa";brakes = "aaa"; setup2(); } // defines a variable that stops the robot function stop() { up = "aaa";down = "aaa";left = "aaa";right = "aaa";brakes = "b"; setup2(); } // Creates the websockets connection function setup2() { var $txt = $("#data"); // assigns the data(hostname/ip address) entered in the text box name = $txt.val(); // Variable name contains the string(hostname/ip address) entered in the text box var host = "ws://"+name+":9093/ws"; // combines the three string and creates a new string var socket = new WebSocket(host); var $txt = $("#data"); var $btnSend = $("#sendtext"); $txt.focus(); // event handlers for UI $btnSend.on('click',function() { var text = $txt.val(); if(text == "") { return; } $txt.val(""); }); $txt .keypress(function(evt) { if(evt.which == 13) { $btnSend.click(); } }); // event handlers for websocket if(socket) { var count =1; socket.onopen = function() { count = 0; arrows(); // function for detecting keyboard presses buttons(); // function for detecting the button press on webpage } //Send the button pressed backed to the Raspberry Pi function buttons() { if(up== "u") { socket.send("u"); } if(down== "d") { socket.send("d"); } if(left== "l") { socket.send("l"); } if(right== "r") { socket.send("r"); } if(brakes == "b") { socket.send("b"); } } function arrows() { document.onkeyup = KeyCheck; function KeyCheck() { var KeyID = event.keyCode; switch(KeyID) { case 16: socket.send("b"); break; case 17: socket.send("b"); break; case 37: socket.send("l"); break; case 38: socket.send("u"); break; case 39: socket.send("r"); break; case 40: socket.send("d"); break; } } } socket.onmessage = function(msg) { showServerResponse(msg.data); } socket.onclose = function() { //alert("connection closed...."); showServerResponse("The connection has been closed."); } } else { console.log("invalid socket"); } function showServerResponse(txt) { var p = document.createElement('p'); p.innerHTML = txt; document.getElementById('output').appendChild(p); } } </script> </body> </html> <script> jQuery(function($) { if (!("WebSocket" in window)) { alert("Your browser does not support web sockets"); } }); </script>
  • Hey,


    Habe jetzt nur kurz über den Code geguckt, rein Scriptmäßig sollte es gehen, Sockets etc, werden eigentlich breitenmäßig unterstützt.
    Bist du mit dem Handy im gleichen WLAN-Netzwerk? Oder versucht du das übers mobile Netz? (Das würde so einfach nicht funktionieren).


    Ansonsten guck dochmal, ob du von deinem Handy aus den Pi anpingen kannst (Dafür gibt es Apps, bzw consolen).


    Lg Kanu


    PS: Ich glaube das gehört eher nciht in die HTML Abteilung, sondern in Sonstiges oder JavaScript

  • Im Script "fehlt" ein onerror() event.
    ergänze mal das Folgende:


    Dann versuch das ganze nochmal. Evtl tritt ein Fehler auf, der Dir ja so sonst entgeht.
    Ansonsten was kanu sagt.


    EDIT: evtl wurde auch in der console (Browser) geloggt:

    JavaScript
    console.log("invalid socket");


    falls die Verbindung nicht zustande kam.

  • Danke für eure Antworten.


    Ich geh jetzt die einzelnen Schritte mal alle durch und schreibe hier nebenbei einen "Live-Erfahrungsbericht".


    Zum ersten Punkt: Natürlich bin ich mit dem Handy im WLAN-Netz des Raspberry, aber auch danke für den Hinweis :D


    Ok dann probiere ich das jetzt mal mit dem Ping, hätte ich auch selbst drauf kommen können, mal schnell googeln wie das am Smartphone geht. Ach nee halt mal, hab ich ja auch vergessen zu erwähnen, ich greife auf die HTML-Seite vom jeweiligen Gerät per Webserver zu, der auf dem Raspi läuft. Von daher klappt die Übertragung ja, das kann es nicht sein, also lass ich das gleich mal mit dem Ping. (Kurz zur Erläuterung, ich habe die Datei "Browser_Client_Code.html" in den /var/WWW (Webserver) kopiert und in index.html umbenannt. Greife dann im Browser über die IP des Raspi darauf zu. Das funktioniert vom PC aus, von daher, ist bis dahin alles ok.




    So zum nächsten: Jetzt habe ich das Stück QUellcode von Cotton eingefügt, ich weiß zwar noch nicht genau, wie im Falle auf einen Fehler hingewiesen werden, aber ich probiere es jetzt einfach mal. Ok alles gestartet, vom PC mit dem Internet Explorer probiert -> geht nicht (damit geht es irgendwie nicht immer, wieso auch immer). Chrome gestartet -> geht. Ok, dann greif ich nun mal zum Smartphone. WLAN verbindet sich sofort. Test mit dem Standard-Android-Browser: Seite öffnet sich, bei Klick passiert nichts. Nächster Versuch: Firefox: Genau das selbe. Chrome: Auch nicht. Fehler wurde mir übrigens keiner offensichtlich angezeigt, oder wo müsste dieser erscheinen?


    So was war der nächste und leider schon letzte Tipp? Ob was in der Konsole geloggt wurde. Hmm Google ist heute irgendwie nicht mein Freund, ich finde leider nicht, wie ich die Konsole am Smartphone öffnen kann..




    Was nun? Hoffe dass ihr weiter so toll versucht mir zu helfen, Danke!




    Gruß Tobias

  • Hallo,


    Das Problem sollte daran liegen, dass jQuery eigentlich nicht für den mobilen Browser gemacht wurde.


    Du siehst im Quellcode den Event .on('click' ........
    Dieser bedeutet für jQuery es erwartet einen Mausklick. Stell dir es so vor. Dein Finger ist keine Maus ;)


    Sollte funktionieren, wenn du jQuery Mobile einbindest und einen vclick Event draus machst. Angabe aber ohne Gewähr.


    Gruß

  • Das Problem sollte daran liegen, dass jQuery eigentlich nicht für den mobilen Browser gemacht wurde.


    Falsch!


    jQuery ist für jegliche art von Geräten entwickelt worden und unterstützt diese auch.
    jQuery-mobile stellt nur noch mehr auf Mobilgeräte angepasste Funktionen bereit (wie z.B. .tap() anstatt .click() ) ... .click() funktioniert aber auf dem iPhone ebensogut wie auf einem normalen Rechner!

  • Das Scipt ist "Mist". (Sieht auch zusammen-kopiert aus)
    Bei jedem Klick baut es eine neue Verbindung auf.
    Kann mir vorstellen, dass aufm mobilen Browser Probleme macht.
    Hast Du eine Alternative?


    EDIT:
    probier mal das hier:


    BTW: hab mich gerade wiedermal mit css geärgert - wir könn uns gegenseitig echt nicht ausstehen :D
    Hat jemand ne idee, wie man die Buttons immer schön mittig platziert? Aber trotzdem als Kreuz?
    Hatte das mit position relative probiert, aber irgendwie .. naja.


    EDIT: updated buttons


    EDIT:
    js abgeändert -- etwas vereinfacht:

  • Was meinst mit schön mittig? :D
    Nummst einen wrap -> .buttons und gibst dem pos: absolute + left = top = right = bottom: 0 + margin: auto + width + height (verstehst du? :D)

    CSS
    .buttons{
      width: 200;
      height: 200;
      position: absolute;
      left:0;top:0;right:0;bottom:0;
      margin: auto;
      background: black;
    }


    oder einfach flexbox :)


    EDIT:
    hier gibts was tolles :D

  • Ja es kann durchaus sein, dass das Skript Mist ist. Wie gesagt, ich habe es nur kopiert. Javascript habe ich selbst leider nie gemacht, deswegen war ich eigentlich froh, ein solches Skript zu finden. Ich werde mir dein Skript jetzt mal anschauen und ausprobieren.
    Also ich habe dein Skrip ausprobiert, bekomme aber beim Klick auf "clickme" folgenden Fehler: error: unknown disonnected! [#1006]
    Ich werde es mirjetzt mal genauer anschauen, und versuchen es zu verstehen, bzw. das Problem zu finden, aber ich glaub da jetzt nicht dran, dass ich das hinkriege.
    Hat sonst jemand eine Idee?


    Vielen Dank bis hierher für eure Unterstützug..


    Tobias

  • Hast den Fehler aufm PC oder Smartphone?


    Die Meldung deutet darauf hin, dass der Server die Verbindung verweigert.
    code 1006:

    Zitat von https://tools.ietf.org/html/rfc6455

    that the
    connection was closed abnormally, e.g., without sending or
    receiving a Close control frame.


    Kann man das Server-Script irgendwo einsehen?


    EDIT: hab script oben editiert:
    von

    JavaScript
    socket = new WebSocket("ws://" + host + ":9093");


    zu

    JavaScript
    socket = new WebSocket("ws://" + host + ":9093/ws");


    hatte /ws weggelassen. Glaube zwar nicht, dass der Server das prüft, kann ja aber sein ...
    (bin Nachmittags wieder online)

  • Es lag tatsächlich an dem /ws. Es funktionierte jetzt sofort per PC und auch per Smartphone. Vielen Vielen Dank! Die Darstellung der Seite auf dem normalen Android-Browser ist zwar eine Katastrophe, aber mit dem Firefox funktioniert es super! Woran könnte das liegen, dass der normale Andorid-Browser die Seite so verhunzt?


    Nochmal vielen Dank an alle, die sich beteiligt haben!!

  • Soo da bin ich wieder..


    Erstmal noch ein großes Dankeschön für eure bisherige Hilfe. Mein Projekt kommt gut voran.


    Was mich allerdings noch stört ist die Website über Smartphone aufzurufen. Also am PC klappt die Darstellung mit iExplorer, Firefox und Chrome sehr gut. Am Handy allerdings machen es die Standard-Browser nicht mit, also der Browser von Android und auch Safari auf iOS. Die Buttons zum steuern werden hier alle übereinandergelegt, was eine Steuerung natürlich unmöglich macht. Man muss sich zum steuern also immer einen weiteren Browser wie Chrome oder Firefox laden. Warum ist das denn so?


    Muss ich diese Einschränkung hinnehmen oder gibt es vielleicht eine einfache Lösung für dieses Problem?


    Mit freundlichen Grüßen


    Tobias

  • am Code hat sich bislang kaum was geändert. Habe die Datei grade leider nicht dabei (bin unterwegs). Aber der Code, den cotton oben gepostet hatte, ist eigentlich noch aktuell, da hat sich nix geändert, zumindest am CSS nicht.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!