Ein ESP tauscht mit einem anderen Daten aus - der Client braucht allerdings recht lange (ca 1,5 - 2 sec) bis er die Daten bekommt. Daten sind überschaubar - ca 10Messwerte, die in einem String vom Server zur Verfügung gestellt werden. Dauert auch ähnlich lang, wenn es weniger Datenfelder sind
Am Server liegt es anscheinend nicht, hab sowohl synchronen als auch asynchronen Webserver ausprobiert .
Gibt es für den HTTP Client eine schnellere oder evtl eine asynchrone Methode, damit ich in der Hauptloop weitermachen kann, während im Hintergrund die Daten empfangen werden?
(hatte mit den DS18B20 Sensoren ein ähnliches Thema, bisich auf die asynchrone Methode zur Sensorabfrage umgestellt habe)
Oder vlt generell eine andere Methode
Client:
#include <HTTPClient.h>
// --------- ---
void getData(char espx[]){
// holt Daten von einem anderen ESP in Form eines String mit Datenfeldern
// INPUT: IP Adresse des hosts , von dem die Daten (in Form eines Strings) geholt werden - ip.Adresse hier in espx
// OUTPUT: Rückgabe der Daten in Form vom String data_esp
//Serial.println(" ... in the get Data subroutine ... start..");
WiFiClient client;
if(!client.connect(espx, 80)) {
Serial.println("Connection to Client " + String(espx) + " failed");
data_esp =("xx|xx");
return;
}
Serial.print("Requesting URL: ");
Serial.println (url);
client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + espx + "\r\n" + "Connection: close\r\n\r\n");
unsigned long letzterconnect = millis();
while (!client.available() && ((millis()-letzterconnect)<5000)) {
delay(1);
}
while (client.available()) {
String line = client.readStringUntil('\r');
if (line != "") data_esp = line;
}
Serial.println("Closing connection to: " + String(espx));
Serial.print("String data_esp: " + data_esp);
Serial.println("");
} // end void getData
... und der Server:
da sieht es dann so aus: z|40|22.0|37.6|17.0|36.0|37.6|26.5|-52|
#include <ESPAsyncWebServer.h>
AsyncWebServer asyncserver(80);
// setup
asyncserver.on("/data", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(200, "text/html", transfer);
});
// loop:
if (millis() > letztedaten + 5000) {
transfer = sendData();
letztedaten = millis();
}
// stringerstellung - mit Zufallswerten zum Testen
String sendData(){
measuredValue = analogRead(A0)/1024.0 * 3.3;
measuredValue = random(100) / 2.5;
delay(10);
float measuredValue2 = random(100) / 2;
delay(6);
float measuredValue3 = random(100) /1.75;
String transfer2 = ""; // zum test mal 8 Datenfelder mit | getrennt und mit z beginnend
transfer2 += "z|" + String(feuchteEG, 0) + "|" + String(tempEG, 1) + "|" + String(measuredValue, 1) + "|";
transfer2 += String(measuredValue2, 1) + "|" + String(measuredValue3,1) +"|" + String(measuredValue,1) + "|";
transfer2 += "26.5|" + String(WiFi.RSSI()) + "|";
Serial.println(String(transfer2));
return transfer2;
}