ESP8266 timeout

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
TomTP
Příspěvky: 37
Registrován: 19 lis 2017, 22:28

ESP8266 timeout

Příspěvek od TomTP » 25 led 2018, 15:06

Ahoj. Delší čas řeším jednu věc a už jsem ve slepé uličce. Možná to někdo řešil, tak budu rád, pokud se o informace podělí 8-) Potřebuji u ESP8266 zkrátit timeout v případě, že se nepodaří připojit na port 80 logovacího serveru. Pokud není server dostupný tak čas pro vypršení se mi pohybuje kolem 7 sec, po kterých se program fláká a nedělá co má (nekontroluje stavy I/O). Používám více knihoven, mimo jiné ESP8266WiFi.h a WiFiManager.h. Wifi manager by to měl mít pořešené (pokud jsem popis dobře pochopil) příkazem wifiManager.setConnectTimeout(); ale pokud zadám třeba sekundu, stejně to trvá výše zmiňovaných 7 sec. Zřejmě je knihovna Wifi8266 nadřízená a je potřeba udělat úpravu přímo v ní. Nebo to je úplně v něčem jiném :lol: Tak kdyby někdo věděl....... dík

jankop
Příspěvky: 1059
Registrován: 06 zář 2017, 20:04
Bydliště: Brno
Kontaktovat uživatele:

Re: ESP8266 timeout

Příspěvek od jankop » 25 led 2018, 18:05

Nerozumím tvojí otázce. Mluvíš o portu 80 logovacího serveru. Co si pod tím představuješ? Komunikace WiFi přece neprobíhá na úrovni nějakých portů, jak je běžně známe. WifiManager slouží pro připojení k tvému routeru respektive Access pointu. Buď se k dané Wifi připojí, nebo přejde sám do AP módu a můžeš se k němu připojit jiným zařízením. WifiManager podle mého názoru nemá nic společného s připojováním se k nějakému serveru a na timeouty pro tento případ nemůže mít žádný vliv.
Prostě se v ideálním případě esp8266 připojí do WiFi sítě, dostane od DHCP serveru IP adresu a pak se může jako klient připojovat( a v případě zabezpečení i logovat) k dalším zařízením nebo může zastávat roli serveru.
Nebo snad máš nějaký RADIUS server na portu 80?
Sám mám s WiFi Managerem celkem nedobré zkušenosti a pro případy, kdy autentizační údaje není vhodné vkládat do programu jsem začal používat WPS, což se mi báječně osvědčilo.
Zkus mi to trochu objasnit.

TomTP
Příspěvky: 37
Registrován: 19 lis 2017, 22:28

Re: ESP8266 timeout

Příspěvek od TomTP » 25 led 2018, 22:01

ESP8266 zpracuje data a posílá je prostřednictvím metody GET do logovacího serveru na port 80. Před předáním dat si testuje přítomnost serveru a jeho 80 portu /if (client.connect(server,80))/ Pokud není port 80 otevřen, nebo prostě není přítomen logovací server, vrací se v mém případě do programu a pokračuje dál ve vykonávání kódu. Bohužel ale až poté, co vyprší timeout tohoto testu a to trvá 7 sec, kdy mezitím čeká i smyčka loop() a program v této době nevyhodnocuje vstupy, popř. cokoliv jiného, prostě program stojí. Při dostupnosti serveru i portu je předání takřka okamžité, bez jakékoliv prodlevy.

Co se týká Wifi manageru, nemám to nastavené na autoconnect, ale mám změnu sítě na vyžádání (přes tlačítko), takže pokud není k dispozici poslední wifi síť uložená v eeprom, program pokračuje, žádný AP nespouští a čeká až bude tato síť opět dostupná.

Můj problém je v momentě, kdy je nedostupný výše zmiňovaný logovací server, nikoliv wifi na které ESP8266 běží, ta je v pořádku.

Při ethernetovém spojení je toto vyřešeno malou úpravou knihovny. V knihovně pro ESP8266 jsem to bohužel nikde nerozluštil.

jankop
Příspěvky: 1059
Registrován: 06 zář 2017, 20:04
Bydliště: Brno
Kontaktovat uživatele:

Re: ESP8266 timeout

Příspěvek od jankop » 25 led 2018, 22:30

A jak tedy souvisí timeout WifiManageru s odezvou serveru? Podle mě naprosto nijak.
Pokud se při procesu připojování k serveru zastaví všechny ostatní procesy, pak radu neznám. Pak přerušení od nějakého Tickeru nepomůže, protože to se zastaví také.

TomTP
Příspěvky: 37
Registrován: 19 lis 2017, 22:28

Re: ESP8266 timeout

Příspěvek od TomTP » 25 led 2018, 23:15

Vyčetl jsem, že by toto měl řešit příkaz wifiManager.setConnectTimeout() přes knihovnu manageru, tak jsem jen zkusil dát do kódu. Nic se nestalo. Vzhledem k tomu, že plno funkcí s Wifi přebírá právě Wifi manager a tak nějak netuším přesně co všechno, tak jsem to jen zkusil. Nastavení bude tedy zřejmě jistě v hlavní knihovně ESP8266WiFi.h. Někde, kde bude po jaké době se má vrátit False při testu log serveru.

Jde mi od začátku o to, jestli to už někdo neřešil, protože v době ethernet shieldů to trvalo ještě déle (a tam se to právě úpravou knihovny řešilo).

jankop
Příspěvky: 1059
Registrován: 06 zář 2017, 20:04
Bydliště: Brno
Kontaktovat uživatele:

Re: ESP8266 timeout

Příspěvek od jankop » 26 led 2018, 09:49

Ahoj,
zkus zakomponovat do svého programu něco takového:

Kód: Vybrat vše

/*set the timeout for the TCP connection*/
    HTTPClient http;                   // uprav podle definice sveho klienta
    uint16_t timeout = 3000;       // nejsem si jist, jestli jsou to sekundy, nebo milisekundy, spis to druhe
    http.setTimeout(timeout);
teoreticky by to mohlo fungovat, hledal jsem v knihovně ESP8266HTTPClient.cpp
Dej vědět, jak's dopadl.
Hezký den

jankop
Příspěvky: 1059
Registrován: 06 zář 2017, 20:04
Bydliště: Brno
Kontaktovat uživatele:

Re: ESP8266 timeout

Příspěvek od jankop » 26 led 2018, 17:51

Tak jsem to otestoval nepatrně upraveným examplem přímo z knihovny ESP8266HTTPClient.h
Funguje to naprosto podle předpokladů, ověřoval jsem to s kuchyňskejma minutkama v ruce, tak to musí být pravda :)
Našel jsem jediný rozpor. Defaultní naměřená hodnota timeoutu je 5 sekund. Někde ti tam palírujou dvě vteřiny.
Jinak parametr timeout je opravdu v milisekundách.
Nejprve jsem zkusil konekt na reálný server pro ověření a pak jsem zadal parametry nexistujícího serveru. V tom případě byly zadané časy timeoutu podle millis() velmi přesné.
Výstup jsem sledoval na sériovém monitoru.

Kód: Vybrat vše

/**   BasicHTTPClient.ino    Created on: 24.05.2015*/
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266HTTPClient.h>
#define USE_SERIAL Serial
ESP8266WiFiMulti WiFiMulti;
void setup() {
  USE_SERIAL.begin(115200);
  // USE_SERIAL.setDebugOutput(true);
  USE_SERIAL.println();
  USE_SERIAL.println();
  USE_SERIAL.println();
  for (uint8_t t = 4; t > 0; t--) {
    USE_SERIAL.printf("[SETUP] WAIT %d...\n", t);
    USE_SERIAL.flush();
    delay(1000);
  }
  //WiFi.mode(WIFI_STA);
  //WiFiMulti.addAP("SSID", "PASSWORD");
}
void loop() {
  // wait for WiFi connection
  if ((WiFiMulti.run() == WL_CONNECTED)) {
    HTTPClient http;                  // uprav podle definice sveho klienta
    uint16_t timeout = 2000;          // jsou to milisekundy
    http.setTimeout(timeout);
    USE_SERIAL.print("[HTTP] begin...\n");
    // configure traged server and url
    //http.begin("https://192.168.1.12/test.html", "7a 9c f4 db 40 d3 62 5a 6e 21 bc 5c cc 66 c8 3e a1 45 59 38"); //HTTPS
    http.begin("http://192.168.1.24"); //HTTP
    USE_SERIAL.print("[HTTP] GET...\n");
    // start connection and send HTTP header
    int httpCode = http.GET();
    // httpCode will be negative on error
    if (httpCode > 0) {
      // HTTP header has been send and Server response header has been handled
      USE_SERIAL.printf("[HTTP] GET... code: %d\n", httpCode);
      // file found at server
      if (httpCode == HTTP_CODE_OK) {
        String payload = http.getString();
        USE_SERIAL.println(payload);
      }
    } else {
      USE_SERIAL.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
      USE_SERIAL.println(millis());
    }
    http.end();
  }
  delay(10000);
}

TomTP
Příspěvky: 37
Registrován: 19 lis 2017, 22:28

Re: ESP8266 timeout

Příspěvek od TomTP » 26 led 2018, 21:59

To vypadá slibně, dostanu se k tomu ale až v pondělí, tak musím se zkouškou vydržet. Zatím ti moc děkuji za ochotu ;)

TomTP
Příspěvky: 37
Registrován: 19 lis 2017, 22:28

Re: ESP8266 timeout

Příspěvek od TomTP » 29 led 2018, 08:43

Tak nic :( Použil jsem i tvůj zmiňovaný program, pouze upravil wifi síť a http server. Pokud je server OK, pak je to taky OK /kód 400/. Ale pokud server není ok, opět čekání 7 sec (lze to vidět i na millis na obrázku) a poté chyba.
Přílohy
Výstřižek.JPG

jankop
Příspěvky: 1059
Registrován: 06 zář 2017, 20:04
Bydliště: Brno
Kontaktovat uživatele:

Re: ESP8266 timeout

Příspěvek od jankop » 29 led 2018, 10:14

To je divné, fyzicky jsem si ověřil, že to opravdu pěkně funguje. V tom se nemýlím. Pokusím se ověřit verze knihoven, které používám. IDE je 1.8.5 a ESP8266 v něm je 2.4.0

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 2 hosti