Forum: Mikrocontroller und Digitale Elektronik ESP32 Server Callback Funktion reagiert nicht


von Thorsten M. (cortex_user)


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?

: Bearbeitet durch User
von Harald K. (kirnbichler)


Lesenswert?

Thorsten M. schrieb:
> Debuggen ist nicht möglich

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

von Thorsten M. (cortex_user)


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.

: Bearbeitet durch User
von Thorsten M. (cortex_user)


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.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.