Bonjour,
J'ai un projet qui concerne la récupération de données sur l'API de RTE pour ecowatt (signal qui permet de savoir si le réseau FR est en surcharge ou non, pour ensuite faire du délestage).
J'utilise une carte Arduino MEGA avec un shield ethernet. J'ai déjà fait ce genre de manipulation avec la récupération de données météos sur openweathermap, mais ici je bloque.
L'API ecowatt utilise un token OAUTH pour s'identifier et ensuite faire notre requête. Je bloque à cette étape d'authentification. J'ai fais des tests sur SOAPUI avant et aucun problème :
Mais dès que je passe à la carte Arduino ma requête me renvoie cela :
Parametrage adresse MAC...
Parametrage adresse IP en DHCP...
Initialisation de la carte...
Fin de la configuration de la carte
Adresse IP de la carte Arduino est : 10.2.43.199 , Masque de sous reseau : 255.255.248.0
Get key
Serveur RTE connecte
Resultat recu : HTTP/1.0 302 Found
Location: https://digital.iservices.rte-france.com/token/oauth/
Server: BigIP
Connection: close
Content-Length: 0
Je suis donc dans une impasse j'ai du mal à comprendre le pourquoi ? (je ne suis pas du tout calé en requête HTTP ou en réseau, il est très possible que je n'utilise pas bonne méthode), si quelqu'un saurait me dépanner ou me donner des conseils cela m'aiderait fortement, merci.
Mon code est le suivant :
#include <SPI.h> // Bibliothèque pour le shield ethernet qui passe par la COM SPI
#include <Ethernet.h> // Bibliothèque pour shield ethernet
saisissez ou collez du code ici
#include <JsonListener.h> // Bibliothèque Json qui permet de lire les réponses http
#include <ArduinoJson.h> // idem
#include <time.h> // Bibli pour gérer le temps réel sur la carte
int cpt = 1800; // Compteur pour le nombre d'appel par jour de l'API
char serveur[] = "digital.iservices.rte-france.com"; // Nom de domaine du serveur à intéroger
byte mac[] = { 0xA8, 0x61, 0x0A, 0xAE, 0x68, 0xFA }; // Adresse mac marquée sur le shield ethernet
IPAddress ip(10, 2, 46, 252); // IP adresse forcée si DHCP ne fonctionne pas
char RTEid[] = "ZDBmNGZkZWEtMzNhZi00ZTFjLTg2NDUtODIwZDdhN2FiN2RmOjNlYjQzNjU1LTg0NmItNDNjYi04N2IzLWFhMTQ5NjczNjNhMg==";//id fournie par RTE
EthernetClient client; // Définie une variable pour le client ethernet
void setup()
{
Serial.begin(9600); // Démarre le port série sur 9600bauds pour les tests
char erreur = 0; // On défini une variable d'erreur qui renvoie 0 si il y a erreu
erreur = Ethernet.begin(mac); // Démarre l'ethernet en DHCP donc seulement avec l'adresse mac
Serial.print("Parametrage adresse MAC"); // Affiche un retour état sur l'écran
delay(1000);
Serial.print(".");
delay(1000);
Serial.print(".");
delay(1000);
Serial.println(".");
delay(1000);
Serial.print("Parametrage adresse IP en DHCP"); // Affiche un retour état sur l'écran
delay(1000);
Serial.print(".");
delay(1000);
Serial.print(".");
delay(1000);
Serial.println(".");
delay(1000);
if (erreur == 0) // Si on a une erreur sur le paramètrage IP en DHC
{
delay(1000);
Serial.println("Erreur IP en DHCP"); // Affiche retour état sur l'écran
Serial.println("Parametrage adresse MAC..."); // Affiche un retour état sur l'écran
Serial.println("Parametrage IP forcee sans DHCP..."); // Affiche retour état sur l'écran
Ethernet.begin(mac, ip); // Démarre la carte avec notre MAC en forçant l'IP
}
Serial.print("Initialisation de la carte"); // Affiche retour état sur l'écran
delay(1000);
Serial.print(".");
delay(1000);
Serial.print(".");
delay(1000);
Serial.println(".");
delay(2000); // Pause de 2s le temps d'initialiser la carte
Serial.println("Fin de la configuration de la carte"); // Affiche retour état sur l'écran
delay(1000);
Serial.print("Adresse IP de la carte Arduino est : "); // Affiche retour état sur l'écran
Serial.print(Ethernet.localIP()); // Affiche l'IP en retour état sur l'écran
Serial.print(" , Masque de sous reseau : ");
Serial.println(Ethernet.subnetMask());
}
void loop()
{
delay(2000); // Pause de 2s avant de démarrer le programe
if (cpt >= 3) // Si le compteur cpt est supérieur ou égale à 1800 (3 pour test)
{
getKey(); // On appelle la fonction pour récupérer le token d'identification
cpt = 0; // On remet le compteur à 0
}
else // Sinon
{
cpt++; // On incrémente le compteur de 1
Serial.print("Compteur = "); // Affiche retour état sur l'écran du compteur
Serial.println(cpt); // Ecrit la variable du compteur
}
}
/*
void getData()//servira que quand le toekn sera récupérer
{
String result = ""; // Création d'une variable qui permet de stocker le résultat reçu
EthernetClient client; // Définie l'ethernet en client
const int httpPort = 80; // Le port http sur 80
if (!client.connect(serveur, httpPort)) // Si le client ethernet n'est pas connecté au site par le bon port on quitte le programme
{
Serial.println("Serveur RTE injoignable");
return; // On sort de la fonction
}
Serial.println("Serveur RTE connecte");
String url = "/open_api/ecowatt/v3/signals";
client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + serveur + "\r\n" + "Connection: close\r\n\r\n"); // Envoie de la requète au serveur suivant la construction demandé par le site WEB
unsigned long timeout = millis(); // Compteur de temps pour faire une temporisation
while (client.available() == 0) // Tant que le client ne répond pas
{
if (millis() - timeout > 5000) // Si le temps écoulé est supérieur à 5s
{
client.stop(); // On stope le client
Serial.println("Le serveur RTE ne repond pas ");
return; // On sort de la fonction
}
}
while (client.available()) // Tant que le client est disponible
{
result = client.readStringUntil("\r"); // Result prend la valeur de ce que l'on reçoit par le client tant que l'on a pas reçu \r qui marque la fin de la trame
}
Serial.print("Resultat sans decomposition : ");// On affiche un suivi l'écran
Serial.println(result);// On affiche le résultat reçue par l'API web
Serial.println("Test");
}
*/
void getKey()
{
Serial.println("Get key");// test fonction
String result = ""; // Création d'une variable qui permet de stocké le résultat reçu
EthernetClient client; // Définie l'ethernet en client
const int httpPort = 80;//port http
if (!client.connect(serveur, httpPort)) // Si le client ethernet n'est pas connecté au site par le bon port on quitte le programme
{
Serial.println("Serveur RTE injoignable");
return; // On sort de la fonction
}
Serial.println("Serveur RTE connecte");
String url = "/token/oauth/";
client.print(String("POST ") + url + " HTTP/1.1\r\n" + "Content-Type: application/json\r\n" + "Authorization: Basic " + RTEid + "\r\n" + "Content-Lenght: 0\r\n" + "Host: " + serveur + "\r\n" + "Connection: close\r\n\r\n"); // Envoie de la requète au serveur suivant la construction demandé par le site WEB
//Serial.print("Requete envoyee :");
//Serial.println(String("POST ") + url + " HTTP/1.1\r\n"+"Content-Type: application/json\r\n"+"Authorization: Basic " + RTEid + "\r\n"+"Content-Length: 0\r\n"+"Host: " + serveur + "\r\n" + "Connection: close\r\n\r\n");
unsigned long timeout = millis(); // Compteur de temps pour tester le temps réponse serveur
while (client.available() == 0) // Tant que le client ne répond pas
{
if (millis() - timeout > 5000) // Si le temps écoulé est supérieur à 5s
{
client.stop(); // On stope le client
Serial.println("Le serveur RTE ne repond pas ");
return; // On sort de la fonction
}
}
while (client.available()) // Tant que le client est disponible
{
result = client.readStringUntil("\r"); // Result prend la valeur de ce que l'on reçoit par le client tant que l'on a pas reçu \r qui marque la fin de la trame
}
Serial.print("Resultat recu : ");// On affiche un suivi l'écran
Serial.println(result);// On affiche le résultat reçue par l'API web
Serial.println("Test");
}
Bonne journée

