Infos Tempo par éthernet

Bonjour,
Ayant réussi grâce aux nombreux internautes sur différents sujets à récupérer sur le site de RTE des informations Tempo et les exploiter, aujourd’hui je souhaiterai récupérer ces infos par le biais d'une liaison Ethernet sur ma box, d'un shield et bien sur un module Arduino (Nano). Beaucoup d'essais n'ont pas donner de résultat positifs en dehors d'un retour moniteur d'initialisation et d'un prêt mais pas de connexion !

Si un bienveillant pouvait m'orienter je serai preneur ? C'est mon premier projet dont j'utilise une liaison éthernet et donc je rame !!
Merci d'avance.
Voici mon code récupéré sur un site modifié pour mon usage.

https://www.google.com/url?sa=t&source=web&rct=j&opi=89978449&url=https://zestedesavoir.com/tutoriels/686/arduino-premiers-pas-en-informatique-embarquee/1213_internet-of-things-arduino-sur-internet/4847_arduino-et-ethernet-client/&ved=2ahUKEwjN2snOsPCKAxUUKvsDHV_WGU0QFnoECBwQAQ&usg=AOvVaw0WijsdQsrSMqMXGOi-BkrA

#include <UIPEthernet.h>

// L'adresse MAC du shield
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0E, 0xA5, 0x7E };
// L'adresse IP que prendra le shield
IPAddress ip(192,168,18,243);
// L'objet qui nous servira a la communication
EthernetClient client;
// Le serveur à interroger
char serveur[] = "services-rte.com/cms/open_data/v1/tempo?season=2024-2025";

// pour lire les caractères
char carlu = 0;
// moment de la dernière requête
long derniereRequete = 0;
// temps minimum entre deux requêtes
const long updateInterval = 10000;
// mémorise l'état de la connexion entre deux tours de loop
bool etaitConnecte = false;

void setup() {
  // On démarre la voie série pour déboguer
  Serial.begin(115200);

  char erreur = 0;
  // On démarre le shield Ethernet SANS adresse IP (donc donnée via DHCP)
  erreur = Ethernet.begin(mac);

  if (erreur == 0) {
    Serial.println("Parametrage avec ip fixe...");
    // si une erreur a eu lieu cela signifie que l'attribution DHCP
    // ne fonctionne pas. On initialise donc en forçant une IP
    Ethernet.begin(mac, ip);
  }
  Serial.println("Init...");
  // Donne une seconde au shield pour s'initialiser
  delay(1000);
  Serial.println("Pret !");
}

void loop()
{
  // on lit les caractères s'il y en a de disponibles
  if(client.available()) {
    carlu = client.read();
    Serial.print(carlu);
  }

  // SI on était connecté au tour précédent
  // ET que maintenant on est plus connecté
  // ALORS on ferme la connexion
  if (etaitConnecte && !client.connected()) {
    Serial.println();
    Serial.println("Deconnexion !");
    // On ferme le client
    client.stop();
  }

  // Si on est déconnecté
  // et que cela fait plus de xx secondes qu'on a pas fait de requête
  if(!client.connected() && ((millis() - derniereRequete) > updateInterval)) {
    requete();
  }

  // enregistre l'état de la connexion (ouvert ou fermé)
  etaitConnecte = client.connected();
}

void requete() {
  // On connecte notre Arduino sur "perdu.com" et le port 80 (defaut pour l'http)
  char erreur = client.connect(serveur, 80);

  if(erreur == 1) {
      // Pas d'erreur ? on continue !
      Serial.println("Connexion OK, envoi en cours...");

      // On construit l'en-tête de la requête
      client.println("GET / HTTP/1.1");
      client.println("Host: services-rte.com/cms/open_data/v1/tempo?season=2024-2025");
      client.println("Connection: close");
      client.println();

      // On enregistre le moment d'envoi de la dernière requête
      derniereRequete = millis();
  } else {
    // La connexion a échoué :(
    // On ferme notre client
    client.stop();
    // On avertit l'utilisateur
    Serial.println("Echec de la connexion");
    switch(erreur) {
      case(-1):
        Serial.println("Time out");
        break;
      case(-2):
        Serial.println("Serveur invalide");
        break;
      case(-3):
        Serial.println("Tronque");
        break;
      case(-4):
        Serial.println("Reponse invalide");
        break;
    }
  }
}

L'Arsène57

Il faudrait tester avec le mode debug de ton navigateur.
Mais il me semble qu'il faut deux retour à la ligne pour mettre fin à la requête, un pour la séparation Header-Body et un pour le Body.
Cela doit être aussi indiqué dans les RFC, mais c'est pénible à lire :slight_smile:

PS: Pour information quand je teste ta requête, je reçois une redirection sur le https.

Merci Terwal,

Je continue à chercher et en m'inspirant d'un exemple sur le GitHub j'ai au moins maintenant une connexion par Google mais sans plus !

/*
 Web client
 */

#include <UIPEthernet.h>

// Entrez ci-dessous une adresse MAC pour votre contrôleur.
// Les boucliers Ethernet les plus récents ont une adresse MAC imprimée sur un autocollant sur le bouclier
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

// si vous ne souhaitez pas utiliser DNS (et réduire la taille de votre sketch)
// utilise l'IP numérique au lieu du nom du serveur :
//Serveur d'adresse IP (74 125 232 128 );  // IP numérique pour Google (pas de DNS)
char server[] = "www.google.com";    // nom de l'adresse pour Google (en utilisant DNS)

// Définit l'adresse IP statique à utiliser si le DHCP ne parvient pas à l'attribuer
IPAddress ip(192, 168, 18, 249);
IPAddress myDns(192, 168, 0, 1);

// Initialise la bibliothèque client Ethernet
// avec l'adresse IP et le port du serveur
// auquel vous souhaitez vous connecter (le port 80 est par défaut pour HTTP) :
EthernetClient client;

// Variables pour mesurer la vitesse
unsigned long beginMicros, endMicros;
unsigned long byteCount = 0;
bool printWebData = true;  // défini sur false pour une meilleure mesure de la vitesse

void setup() {
  // Vous pouvez utiliser Ethernet.init(pin) pour configurer la broche CS
  Ethernet.init(10);    // La plupart des boucliers Arduino
  //Ethernet.init(5);   // MKR ETH Shield
  //Ethernet.init(0);   // Teensy 2.0
  //Ethernet.init(20);  // Teensy++ 2.0
  //Ethernet.init(15);  // ESP8266 with Adafruit FeatherWing Ethernet
  //Ethernet.init(33);  // ESP32 with Adafruit FeatherWing Ethernet

  // Ouvrir les communications série et attendre que le port s'ouvre :
  Serial.begin(115200);
  while (!Serial) {
    ; // attend que le port série se connecte. Nécessaire uniquement pour le port USB natif
  }

  // démarre la connexion Ethernet :
  Serial.println("Initialisez Ethernet avec DHCP :");
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Échec de la configuration d'Ethernet à l'aide de DHCP");
    // Check for Ethernet hardware present
    if (Ethernet.hardwareStatus() == EthernetNoHardware) {
      Serial.println("Le schiel Ethernet n'a pas été trouvé.  Désolé, je ne peux pas fonctionner sans matériel. :(");
      while (true) {
        delay(1); // ne fait rien, inutile de fonctionner sans matériel Ethernet
      }
    }
    if (Ethernet.linkStatus() == LinkOFF) {
      Serial.println("Le câble Ethernet n'est pas connecté.");
    }
    // essayez de configurer en utilisant l'adresse IP au lieu de DHCP :
    Ethernet.begin(mac, ip, myDns);
  } else {
    Serial.print("  IP attribuée par DHCP ");
    Serial.println(Ethernet.localIP());
  }
  // give the Ethernet shield a second to initialize:
  delay(1000);
  Serial.print("se connecter à : ");
  Serial.print(server);
  Serial.println("...");

  // si vous obtenez une connexion, faites un rapport via série :
  if (client.connect(server, 80)) {
    Serial.print("connecté à ");
    Serial.println(client.remoteIP());
    // Faites une requête HTTP :
    client.println("GET /search?q=services-rte.com/cms/open_data/v1/tempo?season=2024-2025 https/1.1");
    client.println("Host: www.google.com");
    client.println("Connection: close");
    client.println();
  } else {
    // si vous n'avez pas obtenu de connexion au serveur :
    Serial.println("la connexion a échoué");
  }
  beginMicros = micros();
}

void loop() {
// s'il y a des octets entrants disponibles
  // depuis le serveur, lisez-les et imprimez-les :
  int len = client.available();
  if (len > 0) {
    byte buffer[80];
    if (len > 80) len = 80;
    client.read(buffer, len);
    if (printWebData) {
      Serial.write(buffer, len); // s'affiche sur le moniteur série (ralentit certaines cartes)
    }
    byteCount = byteCount + len;
  }

  // si le serveur est déconnecté, arrête le client :
  if (!client.connected()) {
    endMicros = micros();
    Serial.println();
    Serial.println(" si le serveur est déconnecté, arrête le client :");
    client.stop();

    // ne fait plus rien pour l'instant :
    while (true) {
      delay(1);
    }
  }
}

Je cherche ................

lorsque tu met ton URL, tu ne reçoit pas le "response code" 301?

J'ai cette réponse:

14:46:21.743 -> Initialisez Ethernet avec DHCP :
14:46:28.160 -> IP attribuée par DHCP 192.168.18.34
14:46:29.170 -> se connecter à : www.google.com...
14:46:29.925 -> connecté à 172.217.20.196
14:46:29.925 -> HTTP/1.0 400 Bad Request
14:46:29.925 -> Content-Type: text/html; charset=UTF-8
14:46:29.958 -> Referrer-Policy: no-referrer
14:46:29.958 -> Content-Length: 1555
14:46:29.958 -> Date: Tue, 14 Jan 2025 13:46:29 GMT
14:46:29.958 ->
14:46:29.958 ->
14:46:29.958 ->
14:46:29.958 -> Error 400 (Bad Request)!!1
14:46:29.958 ->
14:46:29.958 -> {margin:0;padding:0}html,code{font:15px/22px arial,sans-serif}html{background:#fff;color:#222;padding:15px}body{margin:7% auto 0;max-width:390px;min-height:180px;padding:30px 0 15px} > body{background:url(//www.google.com/images/errors/robot.png) 100% 5px no-repeat;padding-right:205px}p{margin:11px 0 22px;overflow:hidden}ins{color:#777;text-decoration:none}a img{border:0}@media screen and (max-width:772px){body{background:none;margin-top:0;max-width:none;padding-right:0}}#logo{background:url(//www.google.com/images/branding/googlelogo/1x/googlelogo_color_150x54dp.png) no-repeat;margin-left:-5px}@media only screen and (min-resolution:192dpi){#logo{background:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat 0% 0%/100% 100%;-moz-border-image:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) 0}}@media only screen and (-webkit-min-device-pixel-ratio:2){#logo{background:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat;-webkit-background-size:100% 100%}}#logo{display:inline-block;height:54px;width:150px}
14:46:30.055 ->
14:46:30.055 ->
14:46:30.094 ->

400. That’s an error.
14:46:30.094 ->

Your client has issued a malformed or illegal request. That’s all we know.
14:46:30.094 ->
14:46:30.094 -> si le serveur est déconnecté, arrête le client :

Je voulais dire avec ton URL pour tempo.

J'ai le même résultat !
Je continue à chercher.

Tu reçois aussi une code 400 ?

Oui, 14:46:29.958 -> Error 400 (Bad Request)!!1 et 400. That’s an error.
14:46:30.094 ->

ok, désolé mais tu peux remettre toutes la trace avec ta vrai URL ?

Je n'ai plus la trace car trop d'essais ! Sorry.
Les exemples de la bibliothèque UIPEthernet.h ont des lignes de programme différentes.
Je vais faire des essais. Une autre bibliothèque Ethercard.h plutôt pro existe à essayer !

L'Arsène.

Je ne pense pas que ton soucis provient de la librairie.
Ton soucis principal est que lorsque l'on test à la main, il est clairement marqué que le serveur attends un requête sécurisé en https.

Après effectivement ta requête en l'état doit te renvoyer un code HTTP 301, si ce n'est pas le cas, ce n'est pas normal.
mais de tout façon, même si tu as le bon code HTTP, il faut passer en https.

Merci pour ces détails. Mes essais avec le code HTTPS n’ont pas été concluants non plus.

Je comprends bien, mais tempo ne semble suporté que ce protocol, ce qui est plutot normal.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.