Requête HTTP avec un ESP32 : comment gérer les time-out ?

Bonjour !
Ça fait maintenant plusieurs mois que j'ai un montage qui tourne, celui-ci fait des requêtes HTTP sur plusieurs appareils de mon réseau Wifi domestique (le routeur faisant partie d'une Freebox)
Tout cela fonctionne plutôt bien, à part à certains moments où j'ai des "blocages" de plusieurs secondes durant une requête. Ces blocages disparaissent souvent si je relance ma freebox (et donc le routeur).
Pour éviter ces blocages, je cherche un moyen de forcer la sortie de ma requête si elle n'a pas abouti dans la seconde (par exemple).

Voici le code actuel de l'une de mes requêtes HTTP (lancée toutes les 5 secondes à partir du loop de mon programme) :

void lect_ShellyEM()
{
  HTTPClient http;
  http.begin("http://192.168.1.12/emeter/0");   // Extrait du ShellyEM les données du "emeter" 0, c.à.d. la conso EDF
  http.setConnectTimeout(500);                  // IP locale >> abandon direct après 0,5 s si pas de connexion
  httpCode = http.GET();
    if (httpCode == HTTP_CODE_OK)               // Vérif que la transmission s'est bien passée
    {
      StaticJsonDocument<256> doc;
      deserializeJson(doc, (http.getString())); // Extraction par ArduinoJson des variables
      Pedf = doc["power"]; Pedft = doc["total"];
      if (top_m1 == true)                       // Quand on change de jour
      {
        Pedf_m = Pedft;                         // Mémorisation du total du ShellyEM à minuit
        pref.begin("memo_infos", false);        // Ecriture du total dans l'emplacement "Pedf_m" de l'EEPROM
        pref.putFloat("Pedf_m", Pedf_m);        // en cas de reset ou de coupure de courant
        pref.end();
        top_m1 = false;                         // RàZ de top_m1
      }
    }
  http.end();
}

J'ai bien rajouté une ligne http.setConnectTimeout(500); mais ça n'a pas l'air de servir à grand chose...
Peut-être passer par un "watchdog" qui sortirait de la requête après un certain temps ?
Mais je ne vois pas trop comment faire...

Alors je suis à la recherche de tous vos conseils avisés !

En vous remerciant par avance, Roland

Bonjour,

Une solution radicale est de faire "tourner" un timer en // et de tester sa progression en espérant que la méthode 'lect_ShellyEM()' soit interruptible, ce qui est la moindre des choses

Cf. la documentation Timer de chez Expressif qui fournit 2 exemples (timer cadencé à 1 Sec et justement un watchdog) dont je me suis inspiré dans mes développements...

1 Like