ESP8266 taux de réponse HTTP GET rapide

13

Lors du démarrage de la programmation de mon ESP8266 pour obtenir des données changeantes en continu (position de la voiture) à partir d'un serveur, j'ai rencontré un problème: je ne peux pas obtenir que l'ESP8266 reçoive les données du serveur plus de 3 fois / seconde.

Le débit de données serait de préférence de 15 fois / seconde. Les données reçues sont une chaîne de 47 éléments.

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

Nous faisons une requête GET depuis le serveur et nous filtrons les données brutes des en-têtes et les réponses sont:

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

Il semble que l'ESP ne puisse pas obtenir les réponses GET plus rapidement. Le temps est en ms. J'ai réussi à le faire fonctionner uniformément si les retards sont d'environ 400 ms.

Quelle serait la meilleure façon d'améliorer la vitesse de la procédure?

Raitis Bērziņš
la source
Dans votre getPagefonction, que se passe-t-il si vous supprimez le retard ou le diminuez de manière significative?
Bence Kaulics
1
En général, cela n'améliore pas les performances, juste pour certains GET, cela le rend plus rapide, mais là encore, vous avez 900, 1000 ms de retards. J'ai essayé de répliquer un simple serveur Web sur un autre ESP et un client sur un autre ESP, et cela a très bien fonctionné. Les réponses étaient d'environ 20 à 50 ms. Je suppose donc que cela a quelque chose à voir avec le réseau.
Raitis Bērziņš
Et la communication se fait sur les lieux de travail wi-fi communs.
Raitis Bērziņš
2
Avez-vous vraiment besoin de vous connecter à chaque fois que vous avez besoin d'une page? Vous ne pouvez pas vous connecter une fois et conserver la connexion, puis vous reconnecter au cas où la connexion serait perdue ou expirée?
Snake Sanders
2
Devez-vous utiliser HTTP pour cela? C'est incroyablement inefficace pour ce cas d'utilisation, et pas seulement à cause du problème de persistance.
Dan Hulme

Réponses:

5

Vous devez éviter de réinitialiser longuement la connexion sur votre méthode getPage () en utilisant

Connection: Keep-Alive

au lieu de

Connection: Close

Cela pourrait économiser beaucoup.

mico
la source