Hi everyone !
I have a project to display the next metro train in the station down my appartement above my door !
I have a LoLin V3. I succeded in conecting the card to the wifi, talking to the api server, donwloading the Json file but i cannot acces the data in it.
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <ESP8266HTTPClient.h>
#include <ArduinoJson.h>
// Informations de connexion Wi-Fi
const char* ssid = "SSID"; // Nom du réseau Wi-Fi
const char* password = "PASSWORD"; // Mot de passe Wi-Fi
// URL de l'API
const char* serverUrl = "https://prim.iledefrance-mobilites.fr/marketplace/stop-monitoring?MonitoringRef=STIF:StopPoint:Q:463134:&LineRef=STIF:Line::C01387:";
// Clé API
const char* apiKey = "APIKEY";
// Objet WiFiClientSecure pour HTTPS
WiFiClientSecure client;
void setup() {
// Initialisation de la communication série
Serial.begin(115200);
// Connexion au Wi-Fi
Serial.println("Connexion au réseau WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("\nConnecté au WiFi!");
// Ajouter le certificat SSL à la connexion
client.setInsecure(); // Désactiver la validation SSL pour tester
// Initialisation de l'HTTPClient
HTTPClient http;
http.begin(client, serverUrl); // Utiliser HTTPS avec WiFiClientSecure
http.addHeader("accept", "application/json");
http.addHeader("apiKey", apiKey);
int httpResponseCode = http.GET(); // Faire une requête GET
if (httpResponseCode > 0) {
Serial.print("Code de réponse HTTP : ");
Serial.println(httpResponseCode);
// Afficher la réponse brute du serveur
String payload = http.getString();
Serial.println("Réponse brute du serveur : ");
Serial.println(payload); // Afficher le JSON brut pour inspection
// Au lieu de désérialiser l'ensemble du JSON, traiter par morceaux
DynamicJsonDocument doc(10000); // Plus petit document pour éviter l'erreur "TooDeep"
DeserializationError error = deserializeJson(doc, payload);
if (error) {
Serial.print("Erreur de désérialisation JSON : ");
Serial.println(error.f_str());
return;
}
// Parcourir progressivement chaque morceau du JSON
JsonObject serviceDelivery = doc["Siri"]["ServiceDelivery"];
JsonArray stopMonitoringDelivery = serviceDelivery["StopMonitoringDelivery"].as<JsonArray>();
for (JsonObject stop : stopMonitoringDelivery) {
JsonArray monitoredStopVisit = stop["MonitoredStopVisit"].as<JsonArray>();
// Traiter par morceaux pour éviter une profondeur excessive
for (JsonObject visit : monitoredStopVisit) {
const char* recordedAtTime = visit["RecordedAtTime"];
const char* destination = visit["MonitoredVehicleJourney"]["DestinationName"][0]["value"];
// Afficher certaines informations extraites
Serial.print("Heure d'enregistrement : ");
Serial.println(recordedAtTime);
Serial.print("Destination : ");
Serial.println(destination);
}
}
} else {
Serial.print("Erreur dans la requête HTTP : ");
Serial.println(http.errorToString(httpResponseCode));
}
http.end();
}
void loop() {
// Rien à faire dans la boucle principale
}
Apparently the Json is "TooDeep". I cannot solve the problem so I'm asking if any of you got some insight !