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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren