ESP8266 szybki wskaźnik odpowiedzi HTTP GET


13

Podczas rozpoczynania programowania mojego ESP8266 w celu ciągłego zmieniania danych (pozycji samochodu) z serwera napotkałem problem: nie mogę uzyskać ESP8266 do odbierania danych z serwera więcej niż 3 razy / sekundę.

Szybkość przesyłania danych wynosiłaby korzystnie 15 razy / sekundę. Otrzymane dane to ciąg 47 elementów.

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

Wykonujemy żądanie GET z serwera i odfiltrowujemy surowe dane z nagłówków, a odpowiedzi są następujące:

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

Wygląda na to, że ESP nie może szybciej uzyskać odpowiedzi GET. Czas w ms. Udało mi się sprawić, że działa równomiernie, jeśli opóźnienia wynoszą około 400 ms.

Jaki byłby najlepszy sposób na poprawę szybkości procedury?


Co stanie się w twojej getPagefunkcji, jeśli usuniesz opóźnienie lub znacznie je zmniejszysz?
Bence Kaulics,

1
Ogólnie rzecz biorąc, nie poprawia wydajności, tylko dla niektórych GET-ów sprawia, że ​​jest szybsza, ale znowu masz 900, 1000 ms opóźnień. Próbowałem zreplikować prosty serwer sieciowy na innym ESP i klienta na innym ESP, i działało to świetnie. Odpowiedzi wyniosły około 20-50 ms. Zgaduję, że ma to coś wspólnego z siecią.
Raitis Bērziņš

Komunikacja odbywa się za pośrednictwem zwykłego Wi-Fi w miejscu pracy.
Raitis Bērziņš

2
Czy naprawdę musisz się łączyć za każdym razem, gdy potrzebujesz strony? Czy nie możesz połączyć się raz i zachować połączenia, a także połączyć ponownie w przypadku utraty lub wygaśnięcia połączenia?
Snake Sanders,

2
Czy potrzebujesz do tego HTTP? Jest to niezwykle nieefektywne w tym przypadku użycia, i to nie tylko z powodu problemu utrzymywania się przy życiu.
Dan Hulme,

Odpowiedzi:


5

Należy unikać długotrwałego resetowania połączenia w metodzie getPage () za pomocą

Connection: Keep-Alive

zamiast

Connection: Close

To może sporo zaoszczędzić.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.