Hi zusammen,
der folgende Sketch funktioniert schon fast, wie ich will.
Klar: Man könnte mit fetch API arbeiten statt Ajax aber ich möchte maximale Browser-Kompatibiliät.
Von daher soll das nicht Thema dieses Beitrags sein.
Jedenfalls will ich Formular-Daten per JSON an den ESP-webserver senden und dort dann die Werte entsprechenden char-Arrays zuweisen.
Wie gesagt: Funktioniert soweit.
Nur möchte ich nicht über den Key-Index parsen sondern den Key-Namen.
Hier der aktuelle Sketch.
Wie zum Henker komme ich an den Namen der JSON-Keys? Ich bin zu doof.
#include <WiFi.h>
#include <WiFiAP.h>
#include <WebServer.h>
WebServer server(80);
#include <Arduino_JSON.h>
char APssid[25] = "MyAccesspoint";
char APpassword[20] = "123456789";
char ssid[30]="";
char password[30]="";
const char indexPage[] PROGMEM = R"=====(
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">
</head>
<body>
<form>
<p>SSID:</p>
<input type="text" id="ssid" value="">
<p>Passwort:</p>
<input type="password" id="password" value="">
<button type="button" onclick="setData()">Submit</button>
</form>
</body>
<script>
function setData() {
const json_data = {};
var ssid=document.getElementById("ssid").value;
json_data["ssid"]=ssid;
var password=document.getElementById("password").value;
json_data["password"]=password;
var http = new XMLHttpRequest();
http.onreadystatechange = function () {
if (this.readyState == 4 && this.status == 200) {
var data=this.responseText;
alert("Serverantwort:"+data);
}
};
http.open('POST', '/setData', true);
http.setRequestHeader('Content-Type', 'application/json');
http.send(JSON.stringify(json_data));
}
</script>
</html>
)=====";
void setup(){
Serial.begin(115200);
server.on("/", display_root);
server.on("/setData", setData);
WiFi.mode(WIFI_AP);
WiFi.softAP(APssid, APpassword);
server.begin();
}
void loop(){
server.handleClient();
}
void display_root() {
const char * httpType PROGMEM = "text/html";
server.send_P(200, httpType, indexPage);
}
void setData() {
JSONVar myObject = JSON.parse(server.arg(0));
if (JSON.typeof(myObject) == "undefined") {
return;
}
JSONVar keys = myObject.keys();
for (int i = 0; i < keys.length(); i++) {
JSONVar value = myObject[keys[i]];
// Das hier funktioniert
switch (i) {
case 0:
strcpy(ssid, value);
break;
case 1:
strcpy(password, value);
break;
}
/* Aber ich möchte "sinngemäß" lieber sowas
// Bin aber zu doof um an den Key zu kommen ;-(
if (key=="ssid") {
strcpy(ssid, value);
} else if (key=="password") {
strcpy(password, value);
}
*/
}
Serial.println("SSID:" + (String)ssid + ", Password:" + (String)password);
server.send(200, "text/plain", "OK");
}
Könnt ihr mich von der Leitung ziehen? Mein Hirn anstupsen?
Danke ![]()
