ESP32 Server Callback Funktion reagiert nicht

Gast #7431828
Lesenswert?
• ▲
▼

Hallo,

ich arbeite mit WebServer.h und habe folgende Callback Funktionen

1
server.on("/switchButton", switchButton);    // Schalter darstellen
2
server.on("/button",ButtonPress);  // Reaktion auf Schalterdruck

Die erste ruft mir meine Seite mit den Buttons auf, die zweite soll auf GET Anfragen der Buttons reagieren

1
void ButtonPress() {
2
  if (server.args() > 0) {
3
    String nummer = server.arg("nummer");
4
  }
5
   // Verarbeitung der Numern
6
   ......... 
7

8
  /* Anfrage bestätigen */
9
  server.send(200, "text/html", "OK");
10
}

Die Buttons werden so im HTML dargestellt, was der Server an den PC sendet <button class="button-green" onclick="sendRequest(1)"> Batteriebetrieb OFF</button>

Im Head des HTML steht

<script> function sendRequest(value) { var url = "http:xxxxx/button?nummer=" + encodeURIComponent(value); var xhttp = new XMLHttpRequest(); xhttp.open("GET", url, true); xhttp.onreadystatechange = function() { if (xhttp.readyState === 4 && xhttp.status === 200) { location.reload(); } }; xhttp.send(); } </script>

Wobei diese Funktion geklaut ist, ich verstehe nichts von Javascript bzw nur wenig. Ist auch nicht Ziel meines Projektes da tiefer einzutauchen. Sie soll den GET Req auslösen und warten bis die ein 200,OK erhält. Dann die Seite neu laden.

Jedenfalls lösen die Buttons keine Reaktion aus ud Debuggen ist nicht möglich, jedenfalls nicht mehr als eine LED blinken lassen, nur funktioniert oder funktioniert nicht.

server.on("/button",HTTP_GETButtonPress);

ändert nichts. Es soll einfach nur ein GET request an den ESP32 gesendet werden, der dann abgearbeitet und mit OK beantwortet wird. Ersetze ich die onclick Methode durch einen href Link klappt es, nur dann wird die Seite mit den Buttons verlassen und OK erscheint und das ist nicht Sinn der Sache.

Wo könnte das Problem liegen?

Gast #7431891
Lesenswert?
• ▲
▼

Harald K. schrieb:

Wireshark. Damit kannst Du sehen, ob Dein Client überhaupt die richtigen Requests absetzt.

Habs schon. Es lag an einer dieser Zeichensetzungen im HTML String, also wenn man ' und "" verwechselt, dazu noch die \ Zeichen für " usw. und dass es im Browser keine Fehlermeldung bei mir gibt.

Jetzt klappt es, ich kann vom Handy und dem PC aus den ESP32 steuern bzw seine Relais.

Mit der ESP32Aync .... Library geht das alles aber komfortabler. Ich bin da etwas zurück mit Webserver.h. Das ist zu umständlich.

Gast #7432002
Lesenswert?
• ▲
▼

Leider funktioniert der loaction.reload noch nicht. Kann da vielleicht mal jemand helfen?

Die Button CB sendet server.send ("plain/text",200,"OK") zurück. Reicht das aus um die JS Funktion zu triggern? Testweise habe ich mal das & gegen || getauscht aber auch das hilft nicht. Refresh nur manuell. Die Buttons bauen sich aus der Serverantwort auf, je nachdem wie die Schalter beim ESP32 stehen sind die grau oder bunt. Drückt man drauf wird ein GET gesendet mit einem Parameter nummer, der auch richtig ankommt und bearbeitet wird. De Funktionalität ist da. Nachdem der Client die Nachricht erhielt, dass die Funktion auf dem esp32 abgearbeitet wurde soll der Chrome Browser refreshen und die neuen Buttons zu zeigen, die die Farbe und Beschriftung geändert haben.

1
function sendRequest(value) {
2
   var url = "http:xxxxx/button?nummer=" + encodeURIComponent(value);
3
          var xhttp = new XMLHttpRequest();
4
          xhttp.open("GET", url, true);
5
          xhttp.onreadystatechange = function() {
6
            if (xhttp.readyState === 4 && xhttp.status === 200) {
7
               location.reload();
8
            }
9
          };
10
          xhttp.send();
11
     }

Sachen wie location.reload(true) oder window.location.reload(true) habe ich ausprobiert, damit ein forced reload zustande kommt. Niente.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.