HTTPClient beschleunigen oder asynchron

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;

}   



Hallo
Wenn du sonst nichts anderes vorhast als nur Daten zwischen zwei ESP zu versenden, dann könnte auch ESPNow interessant für dich sein.

TCP wird sicher auch etwas schneller sein. aber 1,5 s ist schon lange. Hast du mal mit einem Diagnose Tool nachgesehen.

Wireshak oder der Paketsender fallen mir da ein.

Danke - nachdem im Netz sonst alles flott ist und auch die Webseite die der Server produziert mit dem Browser schnell da ist, liegt es wohl am ESP HTTP Client .
die Methode ist halt synchron und damit dauert es - mir würde es schon reichen, wenn es asynchron geht..

Hallo,
ich muss da noch mal nachfragen,
welchen ESP vermutlich ESP32 ?

Du hast ja nur einen Teil deines Sketches hier gepostet. Unter den Beispielen zum ESP gibt es eines "BasicHTTPClient" darauf solltest Du aufbauen.

gibts da ein "\r" in der Antwort , ansonsten gibt es einen Timeout von readString() der bei 1,5s liegen kann.
Dann vermisse ich ein
http.end();

damit die Verbindung vernünftig geschlossen wird .

Du kannst auch gerne mal hier lesen

https://werner.rothschopf.net/202009_iot_webserver_intro.htm

1 Like

.
ich glaub hier kann zu gemacht werden. Es geht dort weiter: