Bonjour à tous,
j'espère que vous avez la forme !
Cela fait des jours que je me casse la tête à vouloir récupérer avec un µ-Ctrl ESP-32 la météo (de Nantes) depuis le site https://www.prevision-meteo.ch/services/json/nantes pour ensuite parser le JSON
(Vous pouvez tester librement l'url dans votre navigateur)
Le code de base est de la forme :
Au final, soit j'arrive à afficher (immédiatement après le retour "code 200") les données sur la liaison série, mais il en manque (le JSON fait en gros 52 ko or j'en affiche +/-40ko) => Cela viens du fait que mon objet string est trop gros pour l'espace RAM contigu.Code:#include <HTTPClient.h> // Permet la connexion à un serveur HTTP .... WiFiClient client; // or WiFiClientSecure for HTTPS HTTPClient http; // Send request http.begin(client, "http://arduinojson.org/example.json"); http.GET(); // Print the response Serial.print(http.getString()); // Disconnect http.end();
J'ai essayé de faire :
String Donnes;
Donnes.reserve(52500); => retourne -1 => Car pas assez de "RAM heap" de libre en continu (fragmentation)
Par contre, en variable globale, en bon vieux C, j'arrive bien à allouer un tableau de char de 52500 octets, que je remplis avec :
MAIS ! Dans ce cas, après (une pause de plusieurs secondes )le serveur me renvoie -1 (HTTPC_ERROR_CONNECTION_REFUSE D) ou -5 (HTTPC_ERROR_CONNECTION_LOST)Code:strncpy(Toto, http.getString().c_str(), 54000);
Voici mon code :
Si vous avez des idées ? (ca marchait sur ESp8266 avec moins de RAM mais en utilisantCode:const char* host = "https://www.prevision-meteo.ch/services/json/nantes"; // Web site web où se connecter if (!WiFi.isConnected()) // On est pas connecté à internet => Quitte la fonction { #ifdef DEBUG_RS232 Serial.print(F("\r\nImpossible de récupérer la meteo : ")); Serial.print(host); Serial.print(F(". Aucune connexion internet n'est disponible...")); #endif return; // On a pas pu se connecter à internet => Quitte la fonction } HTTPClient http; // Instance un client HTTP http.setTimeout(10000); // timeout (avec ou sans c'est pareil) :( http.setConnectTimeout(10000); // timeout connexion (avec ou sans c'est pareil) :( http.useHTTP10(true); // Pour éviter l'erreur: deserializeJson() failed: InvalidInput cf : http.setFollowRedirects(HTTPC_FORCE_FOLLOW_REDIRECTS); // Permet les redirections http.begin(host); // connexion au site web int httpCode = http.GET(); // Envoi de la requête HTTP GET à l'API de prévision météo // Vérification du code de statut de la réponse (200 = > OK) mais j'ai -1 ou -5 if (httpCode > 0) { #ifdef DEBUG_RS232 Serial.print("\n\nHTTP Code : "); Serial.println(httpCode); #endif //////// Serial.println(http.getString()); // Test Affichage sur la liaison série (Ça marche mais il manque des données, on reçoit environ 40 ko) // OU strncpy(Toto, http.getString().c_str(), 54000); //(Avec un char Toto[52000]; déclaré dans main.cpp => Erreur -1 ou -5 Serial.println(Toto); // OU //WiFiClient* stream = http.getStreamPtr(); int idx = 0; while (http.available()) { char c = http.read(); // Toto[idx++] = stream->read(); //(Avec un char Toto[52000]; déclaré dans main.cpp => Erreur -1 ou -5 Serial.print(c); } Serial.println("\n\n"); Serial.println(Toto); /// OU // Analyse syntaxique du flux JSON recu du site web DeserializationError error = deserializeJson(doc, http.getStream(), DeserializationOption::Filter(filter)); // ===> Fichier tronqué deserializeJson écoue ////// // ON PARSE ENSUITE LE JSON [...] } else { #ifdef DEBUG_RS232 Serial.print("Erreur lors de la requête: "); Serial.println(httpCode); #endif } http.end(); // Déconnection du site web }
Version "chunked", mais j'arrive pas à le faire avec HTTPClient sur ESP32Code:std::unique_ptr<BearSSL::WiFiClientSecure> client(new BearSSL::WiFiClientSecure); bool mfln = client->probeMaxFragmentLength(host, HTTPS_PORT, 1024);
Avez vous une idée ?
Merci
-----