ESP8266 schnelle HTTP-GET-Antwortrate

13

Beim Programmieren des ESP8266, um ständig wechselnde Daten (Fahrzeugposition) von einem Server abzurufen, ist ein Problem aufgetreten: Der ESP8266 empfängt die Daten nicht mehr als dreimal pro Sekunde vom Server.

Die Datenrate wäre vorzugsweise 15 mal / Sekunde. Die empfangenen Daten sind eine Folge von 47 Elementen.

#include <ESP8266WiFi.h>
#include <WiFiClient.h>

// WiFi information
const char WIFI_SSID[] = "my-wlan";
const char WIFI_PSK[] = "123qwe123qwe";

// Remote site information
const char http_site[] = "10.13.137.144";
const int http_port = 8080;

// Pin definitions
const int LED_PIN = 16;

// Global variables
WiFiClient client;
String readString, readString1 ;
int x=0;
byte led_statuss = 0;
void setup() {

  // Set up serial console to read web page
  Serial.begin(115200);
  Serial.print("Thing GET Example");

  // Set up LED for debugging
  pinMode(LED_PIN, OUTPUT);

  // Connect to WiFi
  connectWiFi();
  }
//////////////////////////loop///////////////////////////////////////
void loop() {
  int time=millis();

    getPage();

    delay(100);
    // If there are incoming bytes, print them

     int lines_received = 0;

      while(client.available()) {
      String line = client.readStringUntil('\n');
      if (lines_received == 7) { 
      String k =(line.substring(0,line.length())); // removes headers from the server response

      Serial.println(k); // prints the raw data
      int time1 = millis()-time;
      Serial.print("Time is ");
      Serial.println(time1); // shows how much time the function takes    
      }
      lines_received++;

   }

     // Do nothing
    //Serial.println("Finished Thing GET test");
}

// Attempt to connect toFi///////////////////////////////////////////////////////////
void connectWiFi() {

  byte led_status = 0;

  // Set WiFi mode to station (client)
  WiFi.mode(WIFI_STA);

  // Initiate connection with SSID and PSK
  WiFi.begin(WIFI_SSID, WIFI_PSK);

  // Blink LED while we wait for WiFi connection
  while ( WiFi.status() != WL_CONNECTED ) {
    digitalWrite(LED_PIN, led_status);
    led_status ^= 0x01;
    delay(100);
  }

  // Turn LED on when we are connected
  digitalWrite(LED_PIN, HIGH);
}

// Perform an HTTP GET request to a remote page//////////////////////////////////////////
bool getPage() {

  // Attempt to make a connection to the remote server
  if ( !client.connect(http_site, http_port) ) {
    return false;
  }

  // Make an HTTP GET request
   //client.print("GET /cars" + "HTTP/1.1 \r\n" + "Host: " + "10.13.137.154" + "\r\n" + "Connection: close\r\n\r\n");
  client.println("GET /cars HTTP/1.1");
  client.print("Host: ");
  client.println(http_site);
  client.println("Connection: Close");
  client.println();
  delay(100); //some put delay, but why and how long?
  return true;
}

Wir führen eine GET-Anfrage vom Server durch und filtern die Rohdaten aus den Headern heraus. Die Antworten lauten:

Thing GET Example1;62.91;43.55;190.03;5.59;20.00;44.26;861503022
Time is 228
1;62.91;43.55;190.04;0.00;20.00;43.79;861503920
Time is 926
1;62.91;43.55;190.03;0.00;20.00;44.26;861504988
Time is 1050
1;62.91;43.55;190.08;5.76;20.00;43.83;861505980
Time is 1011
1;62.91;43.55;190.07;0.00;20.00;43.82;861506983
Time is 992
1;62.91;43.55;190.04;0.00;20.00;43.79;861508012
Time is 1036
1;62.91;43.55;190.11;0.00;20.00;43.86;861510045
Time is 2020
1;62.91;43.55;190.05;0.00;20.00;43.80;861510274
Time is 222
1;62.91;43.55;190.07;0.00;20.00;43.82;861511306
Time is 1026
1;62.91;43.55;190.07;0.00;20.00;43.82;861512410
Time is 1108
1;62.91;43.55;190.04;0.00;20.00;43.79;861512605
Time is 219
1;62.91;43.55;190.03;0.00;20.00;44.26;861512840
Time is 214
1;62.91;43.55;190.06;0.00;20.00;43.81;861513842
Time is 996

Es scheint, dass das ESP die GET-Antworten nicht schneller erhalten kann. Die Zeit ist in ms. Ich habe es geschafft, es gleichmäßig zum Laufen zu bringen, wenn die Verzögerungen ungefähr 400 ms betragen.

Was wäre der beste Weg, um die Geschwindigkeit des Verfahrens zu verbessern?

Raitis Bērziņš
quelle
getPageWas passiert in Ihrer Funktion, wenn Sie die Verzögerung entfernen oder erheblich verringern?
Bence Kaulics
1
Im Allgemeinen wird die Leistung dadurch nicht verbessert, nur bei einigen GETs wird sie schneller, aber es treten wiederum Verzögerungen von 900 bis 1000 ms auf. Ich habe versucht, einen einfachen Webserver auf einem anderen ESP und einen Client auf einem anderen ESP zu replizieren, und es hat dort hervorragend funktioniert. Die Antworten lagen bei 20-50ms. Ich vermute also, dass es etwas mit dem Netzwerk zu tun hat.
Raitis Bērziņš
Und die Kommunikation erfolgt über das übliche Wi-Fi am Arbeitsplatz.
Raitis Bērziņš
2
Müssen Sie wirklich jedes Mal eine Verbindung herstellen, wenn Sie eine Seite benötigen? Können Sie keine Verbindung herstellen und die Verbindung beibehalten und die Verbindung wiederherstellen, falls die Verbindung verloren geht oder abgelaufen ist?
Snake Sanders
2
Müssen Sie dafür HTTP verwenden? Es ist unglaublich ineffizient für diesen Anwendungsfall und nicht nur wegen des Keep-Alive-Problems.
Dan Hulme

Antworten:

5

Sie sollten vermeiden, dass die getPage () -Methode die Verbindung in der Länge zurücksetzt, indem Sie verwenden

Connection: Keep-Alive

Anstatt von

Connection: Close

Das kann eine Menge sparen.

mico
quelle