Hi zusammen,
ich hab mal wieder ne Sache, bei der ich einfach nicht weiter komme ;-(
Mir ist noch nicht ganz klar, wie man eine Funktion per Javascript auf dem ESP antriggert und dann den Server-Response auswertet.
Als Beispiel habe ich mal den folgenden Sketch erstellt (soll wirklich nur ein fiktives Beispiel sein):
In dem Beispiel baut der ESP ja einen Accesspoint auf und versucht zugleich, sich mit meinem WLAN zu verbinden (WiFi_AP_STA eben). Da die Zugangsdaten falsch sind, schlägt das in dem Beispiel fehl.
Auf der Serverseite gibts den Button "Verbinden".
Sollzustand wäre:
Wenn man auf den Button klickt, soll die Funktion "WiFi_conn()" aufgerufen werden. Innerhalb dieser Funktion versucht der ESP dann 15 Sekunden lang, eine Verbindung aufzubauen
Auf Seite des Servers (also auf der Seite mit dem Button) soll dann eine Meldung ausgegeben werden, ob die Verbindung geklappt hat, oder nicht.
In meinem kläglichen Versuch kommt aber gar keine Rückmeldung.
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
unsigned long connTimer = 0;
unsigned long connCancel = 0;
unsigned long mainTimer = 0;
ESP8266WebServer server(80);
char indexPage[] PROGMEM = R"=====(
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Test</title>
</head>
<body>
<button onclick="neu_verbinden();">Verbinden</button>
</body>
</html>
<script>
function neu_verbinden() {
var url="/neu_verbinden";
var xmlhttp = new XMLHttpRequest();
xmlhttp.open('POST', url, false); //False, weil ich ja eine synchrone Abfrage machen will...
xmlhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4) {
if(xmlhttp.status == 200) {
var onlinestatus=xmlhttp.responseText;
alert(onlinestatus);
if (onlinestatus=="1") {
alert("Verbunden!");
} else {
alert("Nicht verbunden!");
}
}
}
};
xmlhttp.send();
}
</script>
)=====";
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
// Accesspoint aufbauen
WiFi.mode(WIFI_AP_STA);
WiFi.softAP("TestAP12345678", "123456789");
// Verbindung mit meinem Router-WLAN aufbauen
WiFi_conn();
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Startseite / Tageswerte
server.on("/", display_root);
server.on("/neu_verbinden", WiFi_conn);
server.begin(); // Server starten
}
void loop() {
// put your main code here, to run repeatedly:
server.handleClient();
mainTimer=millis();
delay(100);
}
void display_root() {
Serial.println("Display root");
server.send(200, "text/html", indexPage);
}
void WiFi_conn() {
Serial.println("Neu verbinden!");
WiFi.begin("MeineSSID", "MeinPW");
connTimer = millis();
connCancel = mainTimer + 15000;
while (WiFi.status() != WL_CONNECTED && connTimer < connCancel)
{
yield();
connTimer = millis();
Serial.print(".");
delay(500);
}
if (WiFi.status() == WL_CONNECTED) {
Serial.println("Verbunden!");
server.send(200, "text/plain", "1");
} else {
Serial.println("Nicht verbunden!");
server.send(200, "text/plain", "2");
}
}
Ich würd mich sehr freuen, wenn mir jemand vom Holzweg runter helfen könnte
Danke schon mal für eure Tips.
LG und schönen Restsonntag allen.
Daniel