esp32_httpclient.md | Last modified: 1755693432 | Edit | Home

Requête HTTP avec ESP32

ESP32

Voir Premier pas avec ESP32

Client Wifi

Le wifi est géré par la lib WiFi. Deux modes: Station (WIFI_STA) et Acces Point (WIFI_AP), pour vulgariser c'est équivalent respectivement au client et au server WiFi. On travaille en mode Station, c'est le mode par défaut; il n'y a rien à déclarer. Très intéressant site qui explique tout -> https://www.upesy.fr/blogs/tutorials/how-to-connect-wifi-acces-point-with-esp32

Une session démarre avec WiFi.begin("your SSID", "p4sswOrd");. La fonction WiFi.status() == WL_CONNECTED permet de vérifier la connexion. La ligne while (WiFi.status() != WL_CONNECTED) delay(500); attend que la connexion soit effective.

#include <WiFi.h>
WiFi.begin("SSID", "P4ssw0rd");
while (WiFi.status() != WL_CONNECTED) delay(500);
Serial.println(WiFi.localIP());

La plateforme s'est connectée en DHCP; la fonction WiFi.localIP() permet de connaître l'IP.

Pour comprendre WiFi.status: voir la fonction get_wifi_status(int status) sur la page web de upesy.fr (lien supra). Ce que je retiens, c'est qu'en cas de déconnection, le wifi tente de se reconnecter et que cette reconnection est assez rapide.

Dans la loop() on vérifie la connection avant d'en faire quelque chose:

if (WiFi.status() == WL_CONNECTED) {
  Serial.println("Connected"); 
} else {
  Serial.println("Network unreachable");
}

HTTPClient

Pour la requête HTTP, on a besoin de la lib HTTPClient. Dès lors que la connexion est établie, on crée une instance HTTPClient qu'on fait démarrer avec la méthode begin("URL"). La méthode GET() renvoie le code HTTP qui, si égal à HTTP_CODE_OK, soit 200, annonce que tout va bien. La méthode getString() renvoie la réponse du serveur. Celle-ci est dans la plupart des cas une page Html, ou du texte, ou des données sous format JSON. Si le code HTTP n'est pas 200, on a une erreur. Ne pas oublier de fermer l'objet http.

#include <HTTPClient.h>
HTTPClient http;
http.begin("https://example.com");
int httpCode = http.GET();
f (httpCode == HTTP_CODE_OK) {
 Serial.println(http.getString());
} else {
  Serial.printf("failed, error: %s\n", http.errorToString(httpCode).c_str());
}
http.end();

JSON

Le cour du Bitcoin est disponible via l'API de Kraken (notamment) à l'adresse suivante: https://api.kraken.com/0/public/Ticker?pair=XXBTZEUR. La doc nous aide à lire ces informations et l'on déduit que la valeur qui nous intéresse, c'est Last trade closed disponible par le chemin result -> XXBTZEUR -> c -> 0.

Cette information est sous le format JSON, on va donc utiliser la bibliothèque AdruinoJson qu'il faudra importer dans Arduino-API via le menu Stetch → Include libraries → Manage Libraries → Recherche par mot clef → Install. Concernant ce format, l'assistant sur le site de la lib est très sympa, ca permet de comprendre la structure JSON et il nous explique même comment récupérer les donner.

Donc, on désérialise la réponse à la requête, ca crée un tableau que l'on parcourt doc["result"]["XXBTZEUR"]["c"][0].as<double>(); pour aller chercher la valeur attendue et on transforme le résultat en réel (c'est pas forcément indispensable, ca dépend de que que l'on veut faire de cette information). Puis il reste à l'imprimer dans la sortie série.

#include <ArduinoJson.h>
http.begin("https://api.kraken.com/0/public/Ticker?pair=XXBTZEUR");
String response = http.getString();
JsonDocument doc;
DeserializationError error = deserializeJson(doc, response);
if (error) {
  Serial.println(error.f_str());
} else {
  Serial.println(doc["result"]["XXBTZEUR"]["c"][0].as<double>());
}

le code

#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>

void setup() {

  Serial.begin(115200);
  while (!Serial) delay(100);

  WiFi.begin("SSID", "P4ssw0rd");
  while (WiFi.status() != WL_CONNECTED) delay(500);
  Serial.println("Connected.");
}

void loop() {

  if (WiFi.status() == WL_CONNECTED) {

    HTTPClient http;

    // https://docs.kraken.com/api/docs/rest-api/get-ticker-information
    http.begin("https://api.kraken.com/0/public/Ticker?pair=XXBTZEUR");

    int httpCode = http.GET();

    if (httpCode == HTTP_CODE_OK) {

      String response = http.getString();

      JsonDocument doc;
      DeserializationError error = deserializeJson(doc, response);
      if (error) {
        Serial.print(F("deserializeJson() failed: "));
        Serial.println(error.f_str());
      } else {
        Serial.print("BTC: ");
        Serial.println(doc["result"]["XXBTZEUR"]["c"][0].as<double>());
      }

    } else {

      Serial.printf("failed, error: %i %s\n", httpCode, http.errorToString(httpCode).c_str());

    }

    http.end();

  } else {

    Serial.println("Network unreachable");

  }

  delay(5000);
}