ESP8266 tasa de respuesta HTTP GET rápida

13

Al comenzar a programar mi ESP8266 para obtener datos que cambian continuamente (posición del automóvil) de un servidor, me encontré con un problema: no puedo hacer que el ESP8266 reciba los datos del servidor más de 3 veces / segundo.

La velocidad de datos sería preferiblemente 15 veces / segundo. Los datos recibidos son una cadena de 47 elementos.

#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;
}

Hacemos una solicitud GET del servidor y filtramos los datos sin procesar de los encabezados y las respuestas son:

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

Parece que el ESP no puede obtener las respuestas GET más rápido. El tiempo es en ms. Me las arreglé para que funcione de manera uniforme si los retrasos son de alrededor de 400 ms.

¿Cuál sería la mejor manera de mejorar la velocidad del procedimiento?

Raitis Bērziņš
fuente
En su getPagefunción, ¿qué sucede si elimina el retraso o lo disminuye significativamente?
Bence Kaulics
1
En general, no mejora el rendimiento, solo para algunos GET lo hace más rápido, pero nuevamente tiene 900, 1000ms de retraso. Traté de replicar un servidor web simple en otro ESP y un cliente en otro ESP, y funcionó muy bien allí. Las respuestas fueron de alrededor de 20-50 ms. Así que supongo que tiene algo que ver con la red.
Raitis Bērziņš
Y la comunicación se realiza a través de los lugares de trabajo wi-fi comunes.
Raitis Bērziņš
2
¿Realmente necesitas conectarte cada vez que necesitas una página? ¿No puede conectarse una vez y mantener la conexión, y volver a conectar en caso de que la conexión se pierda o caduque?
Snake Sanders
2
¿Tienes que usar HTTP para esto? Es increíblemente ineficiente para este caso de uso, y no solo por el problema de mantener vivo.
Dan Hulme

Respuestas:

5

Debe evitar restablecimientos de conexión largos en su método getPage () utilizando

Connection: Keep-Alive

en lugar de

Connection: Close

Eso puede ahorrar bastante.

mico
fuente