WifiClient et site

Bonsoir

Après avoir essayer le site d’eskimon sur le Client et requêtes HTTP et adapter pour un ESP WROOM-32 pour le site “perdu.com” la réponse est comme dans l’exemple.

#include <WiFi.h>
#include <WiFiClient.h>

WiFiClient client;

const char * ssid = "XXXXX";
const char * password = "xxxxxxxxxxxxxxxxxxxxxxxx";

char serveur[] = "arduino.cc";

void setup()
{
	Serial.begin(9600);
	Serial.print("Connecting to ");
	Serial.println(ssid);
	WiFi.begin(ssid, password);
	while (WiFi.status() != WL_CONNECTED)
	{
		delay(500);
		Serial.print(".");
	}
	Serial.println("");
	Serial.println("IP address: ");
	Serial.println(WiFi.localIP());
	client.connect(serveur, 80);
	client.println("GET /index.html HTTP/1.1");
	client.println(String("Host: ") + serveur);
	client.println();
}

void loop()
{
	char paquet = 0;
	while (client.available())
	{
		paquet = client.read();
		Serial.print(paquet);
	}
}

Mais en essayant sur un site comme arduino.cc cela ne fonctionne pas.

IP address: 
192.168.1.71
HTTP/1.1 301 Moved Permanently
Server: nginx/1.4.2
Date: Sat, 31 Oct 2020 20:44:37 GMT
Content-Type: text/html
Content-Length: 184
Connection: keep-alive
Location: https://arduino.cc/index.html

<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.4.2</center>
</body>
</html>

Est-ce parce que le site est en https ?

Par avance merci

si vous faites un curl à la main dans un terminal unix vous pouvez voir la réponse du site web:

[color=blue][b]curl -v arduino.cc[/b][/color]
[color=purple]*   Trying 3.212.190.255...
* TCP_NODELAY set
* Connected to arduino.cc (3.212.190.255) port 80 (#0)
> GET / HTTP/1.1
> Host: arduino.cc
> User-Agent: curl/7.64.1
> Accept: */*
> 
< HTTP/1.1 301 Moved Permanently
< Server: nginx/1.4.2
< Date: Sun, 01 Nov 2020 14:11:34 GMT
< Content-Type: text/html
< Content-Length: 184
< Connection: keep-alive
< Location: https://arduino.cc/
< 
<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.4.2</center>
</body>
</html>
* Connection #0 to host arduino.cc left intact
* Closing connection 0
[/color]

donc ce que vous recevez c’est bien ce qui est renvoyé par le serveur web qui répond à http://arduino.cc

un navigateur web se connectant sur cette même adresse en http va voir dans le header

 Location: https://arduino.cc/

et va faire une redirection là bas automatiquement.

Bonsoir

Donc pour fonctionné en https il faut utilisé le WiFiClientSecure

voici le code exemple de la librairie:

#include <WiFiClientSecure.h>

const char * ssid = "****";
const char * password = "****";

const char*  server = "www.arduino.cc";  
int portS = 443;


WiFiClientSecure client;

void setup() {

  Serial.begin(9600);
  delay(100);

  Serial.print("Attempting to connect to SSID: ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);


  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(1000);
  }

  Serial.print("Connected to ");
  Serial.println(ssid);


  Serial.println("\nStarting connection to server...");
  if (!client.connect(server, portS))
    Serial.println("Connection failed!");
  else {
    Serial.println("Connected to server!");
    // Make a HTTP request:
    client.println("GET https://www.arduino.cc/ "); 
    client.println("Host: www.arduino.cc");
    client.println("Connection: close");
    client.println();

    while (client.connected()) {
      String line = client.readStringUntil('\n');
      if (line == "\r") {
        Serial.println("headers received");
        break;
      }
    }

    while (client.available()) {
      char c = client.read();
      Serial.write(c);
    }

    client.stop();
  }
     Serial.println("fin setup");
}

void loop() {

}

Mais il se fige à :

Starting connection to server...
Connected to server!

Pourquoi ?

Et je ne comprends pas les lignes ;

    client.println("GET https://www.arduino.cc/ "); 
    client.println("Host: www.arduino.cc");

pourquoi indiquer le host ?

Par avance merci des réponses .

Fut un temps ça faisait partie des obligations pour certains serveurs web de savoir qui était le host. Sans certains headers ils ne répondent pas

Bonjour

Je me suis remis dessus aujourd’hui, j’arrive a faire afficher le code source de la page www.google.fr avec ce code:

#include <WiFiClientSecure.h>
WiFiClientSecure client;

const char* ssid     = "*ssid*";
const char* password = "*password*";
const char*  server =  "www.google.fr";
char erreur = 0;

void setup() {
  //Initialize serial and wait for port to open:
  Serial.begin(115200);
  delay(100);

  Serial.print("Attempting to connect to SSID: ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);


  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(1000);
  }

  Serial.print("Connected to ");
  Serial.println(ssid);


  Serial.println("\nStarting connection to server...");
  if (!client.connect(server, 443))
    Serial.println("Connection failed!");
  else {
    Serial.println("Connected to server!");
    client.println("GET https://www.google.fr HTTP/1.0");
    client.println("Host: www.google.fr");
    client.println("Connection: close");
    client.println();

    while (client.connected()) {
      String line = client.readStringUntil('\n');
      if (line == "\r") {
        Serial.println("headers received");
        break;
      }
    }

    while (client.available()) {
      char c = client.read();
      Serial.write(c);
    }
    client.stop();
  }
}

  void loop() {
  }

Mais il ne m’affiche pas toute la page…

Une idée pour’y remédier ?

Cordialement Julien

pourquoi vous avez deux boucles de lecture du contenu dont la deuxième qui n'est pas dans le
while (client.connected()) ?

    while (client.connected()) {
      String line = client.readStringUntil('\n');
      if (line == "\r") {
        Serial.println("headers received");
        break;
      }
    }

    while (client.available()) {
      char c = client.read();
      Serial.write(c);
    }

lisez tout ce qui est dispo pendant que vous êtes connecté

Merci cela fonctionne

J’arrive à afficher la page et je voudrais en extraire des données ,

j’ai vu avec la librairie ArduinoJson mais je n’arrive pas à trouver la syntaxe pour y parvenir car la page se présente comme ceci :

 <span>samedi 2</span>
</div>
<div class="tide-container">
    <div class="tide-line">
        <div class="tides">
                                <div class="low-tide">
        <svg class="icon icon-LowTide" aria-hidden="true"><use xlink:href="/image/int/svg/icons-forecast-v1.0.svg#low-tide" /></svg>
        <span class="label">Marée basse</span>
        <span class="hour">00h28</span>
        <span class="height">1.25m</span>
    </div>
                                            <div class="high-tide">
        <svg class="icon icon-HighTide" aria-hidden="true"><use xlink:href="/image/int/svg/icons-forecast-v1.0.svg#high-tide" /></svg>
        <span class="label">Marée haute</span>
        <span class="hour">06h04</span>
        <span class="height">5.30m</span>
    </div>
            
        </div>
        <div class="coef tide-coef-level-3">
            <span>80</span>
        </div>
    </div>
    <div class="separator"></div>
    <div class="tide-line">
        <div class="tides">
                                <div class="low-tide">
        <svg class="icon icon-LowTide" aria-hidden="true"><use xlink:href="/image/int/svg/icons-forecast-v1.0.svg#low-tide" /></svg>
        <span class="label">Marée basse</span>
        <span class="hour">13h00</span>
        <span class="height">1.20m</span>
    </div>
                                            <div class="high-tide">
        <svg class="icon icon-HighTide" aria-hidden="true"><use xlink:href="/image/int/svg/icons-forecast-v1.0.svg#high-tide" /></svg>
        <span class="label">Marée haute</span>
        <span class="hour">18h36</span>
        <span class="height">5.05m</span>
    </div>
                    </div>
                    <div class="coef tide-coef-level-3">
                <span>79</span>
            </div>
            </div>
</div>
<div class="ephemeris d-none d-l-block">
        <div class="holy">
        <div>
            <div class="moon-icon">
                <svg class="icon icon-Moon" aria-hidden="true"><use xlink:href="/image/int/svg/icons-forecast-v1.0.svg#moon" /></svg>
                <span class="label label-moon">Lune</span>
            </div>
            <div class="label label-moon">
                <span class="state">Lune gibbeuse décroissante</span>
            </div>
        </div>

                <div>
            <div class="holy-icon">
                <svg class="icon icon-Angel" aria-hidden="true"><use xlink:href="/image/int/svg/icons-forecast-v1.0.svg#angel" /></svg>
                <span class="label label-holy">Saint</span>
            </div>
            <div class="label label-holy">
                <span class="name">Saint Basile</span>
            </div>
        </div>
            </div>

    <div class="sun">
        <svg class="icon icon-Sunrise" aria-hidden="true"><use xlink:href="/image/int/svg/icons-forecast-v1.0.svg#sunrise" /></svg>
        <div class="label">
            <span>Lever</span>
            <span class="hour">08h54</span>
        </div>
        <div class="label duration">
            <div>13h12min</div>
            <div class="arrow">
                <svg class="icon icon-ChevronLeft" aria-hidden="true"><use xlink:href="/image/int/svg/icons-v1.0.svg#chevron-left" /></svg>
                <svg class="icon icon-ChevronRight" aria-hidden="true"><use xlink:href="/image/int/svg/icons-v1.0.svg#chevron-right" /></svg>
            </div>
            <div class="add">+1 min</div>
        </div>
        <svg class="icon icon-Sunset" aria-hidden="true"><use xlink:href="/image/int/svg/icons-forecast-v1.0.svg#sunset" /></svg>
        <div class="label">
            <span>Coucher</span>
            <span class="hour">17h31</span>
        </div>
    </div>
</div>            </div>
                    <div class="grid col-16 days-separator weekEnd"></div>
            <div class="grid col-16 tide">
                <div class="tide-date weekEnd">
    <span>dimanche 3</span>
</div>
<div class="tide-container">
    <div class="tide-line">
        <div class="tides">
                                <div class="low-tide">
        <svg class="icon icon-LowTide" aria-hidden="true"><use xlink:href="/image/int/svg/icons-forecast-v1.0.svg#low-tide" /></svg>
        <span class="label">Marée basse</span>
        <span class="hour">01h09</span>
        <span class="height">1.30m</span>
    </div>
                                            <div class="high-tide">
        <svg class="icon icon-HighTide" aria-hidden="true"><use xlink:href="/image/int/svg/icons-forecast-v1.0.svg#high-tide" /></svg>
        <span class="label">Marée haute</span>
        <span class="hour">06h46</span>
        <span class="height">5.20m</span>
    </div>
            
        </div>
        <div class="coef tide-coef-level-3">
            <span>77</span>
        </div>
    </div>
    <div class="separator"></div>
    <div class="tide-line">
        <div class="tides">
                                <div class="low-tide">
        <svg class="icon icon-LowTide" aria-hidden="true"><use xlink:href="/image/int/svg/icons-forecast-v1.0.svg#low-tide" /></svg>
        <span class="label">Marée basse</span>
        <span class="hour">13h43</span>
        <span class="height">1.25m</span>
    </div>
                                            <div class="high-tide">
        <svg class="icon icon-HighTide" aria-hidden="true"><use xlink:href="/image/int/svg/icons-forecast-v1.0.svg#high-tide" /></svg>
        <span class="label">Marée haute</span>
        <span class="hour">19h20</span>
        <span class="height">4.90m</span>
    </div>
                    </div>
                    <div class="coef tide-coef-level-3">
                <span>75</span>
            </div>
            </div>
</div>
<div class="ephemeris d-none d-l-block">
        <div class="holy">
        <div>
            <div class="moon-icon">
                <svg class="icon icon-Moon" aria-hidden="true"><use xlink:href="/image/int/svg/icons-forecast-v1.0.svg#moon" /></svg>
                <span class="label label-moon">Lune</span>
            </div>
            <div class="label label-moon">
                <span class="state">Lune gibbeuse décroissante</span>
            </div>
        </div>

                <div>
            <div class="holy-icon">
                <svg class="icon icon-Angel" aria-hidden="true"><use xlink:href="/image/int/svg/icons-forecast-v1.0.svg#angel" /></svg>
                <span class="label label-holy">Saint</span>
            </div>
            <div class="label label-holy">
                <span class="name">Sainte Geneviève</span>
            </div>
        </div>
            </div>

    <div class="sun">
        <svg class="icon icon-Sunrise" aria-hidden="true"><use xlink:href="/image/int/svg/icons-forecast-v1.0.svg#sunrise" /></svg>
        <div class="label">
            <span>Lever</span>
            <span class="hour">08h54</span>
        </div>
        <div class="label duration">
            <div>13h13min</div>
            <div class="arrow">
                <svg class="icon icon-ChevronLeft" aria-hidden="true"><use xlink:href="/image/int/svg/icons-v1.0.svg#chevron-left" /></svg>
                <svg class="icon icon-ChevronRight" aria-hidden="true"><use xlink:href="/image/int/svg/icons-v1.0.svg#chevron-right" /></svg>
            </div>
            <div class="add">+1 min</div>
        </div>
        <svg class="icon icon-Sunset" aria-hidden="true"><use xlink:href="/image/int/svg/icons-forecast-v1.0.svg#sunset" /></svg>
        <div class="label">
            <span>Coucher</span>
            <span class="hour">17h32</span>
        </div>
    </div>
</div>            </div>
                    <div class="grid col-16 days-separator week"></div>
            <div class="grid col-16 tide">
                <div class="tide-date week">
    <span>lundi 4</span>

je voudrais extraire les donées de marée par jour dans le mois mais elle ne se présente pas comme dans les exemples:

{
  "key1":"value1",
  "key2":"[1,2,3,4]",
  "key3":{
     "keya":"valuea",
     "keyb":"['a','b','c']"
  }
}

une idée ? merci

Ce n’est pas un json mais du html pas simple a analyser - il faudrait trouver un Texte invariant juste avant ce que vous voulez extraire (genre ou ) et le rechercher lors de la réception puis extraire ce qui suit, en supposant que tout est toujours dans le même ordre.

Pour les marées il doit y avoir des sites plus adéquats, avez vous regardé Access tide gauge data - Refmar par exemple ? Il semble qu’ils aient deux formats de données : le JSON et le XML en plus d’un format historique TXT

Bonjour

j’ai avancé sans succes :

#include <WiFiClientSecure.h>
#include <string.h>
#include <ArduinoJson.h>

WiFiClientSecure client;


const char* ssid     = "xxxxxx";
const char* password = "xxxxxxxx";


const char*  server =  "marine.meteoconsult.fr";


void setup() {
  StaticJsonBuffer<2000> jsonBuffer;

  Serial.begin(112500);
  delay(100);

  Serial.print("Attempting to connect to SSID: ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(1000);
  }

  Serial.print("Connected to ");
  Serial.println(ssid);


  Serial.println("\nStarting connection to server...");
  if (!client.connect(server, 443))
    Serial.println("Connection failed!");
  else {
    Serial.println("Connected to server!");
    client.println("GET https://marine.meteoconsult.fr/meteo-marine/horaires-des-marees/xxxxx HTTP/1.0");
    client.println("Host: marine.meteoconsult.fr/meteo-marine/horaires-des-marees/xxxxxxxxx");
    client.println("Connection: close");
    client.println();

    JsonObject& root = jsonBuffer.parseObject(client);
    if (!root.success()) {
      Serial.println(F("Parsing failed!"));
      return;
    }

    const char* tideDate  = root["tide-date week"]; //tide-date
    long time1 = root["time"];
    double hour1 = root["hour"][0];
    double height = root["data"][0];



    Serial.println(time1);
    Serial.println(hour1);
    Serial.println(height);


    client.stop();
  }
}

void loop() {


}

Pourquoi il me retourne :

Starting connection to server...
Connected to server!
Parsing failed!

Et est-ce qu’au moins je suis sur la bonne voie ?

Merci

je ne sais pas, votre URL est cachée https://marine.meteoconsult.fr/meteo-marine/horaires-des-marees/xxxxx… vous avez une URL qui retourne un JSON ?

Si je regarde Brest par exemple https://marine.meteoconsult.fr/meteo-marine/horaires-des-marees/brest-4/decembre-2020 ce n’est que du HTML

avez vous lu le lien proposé avant sur refmar.shom.fr s'abonner aux flux (mode expert) - Refmar ? ils proposent de récupérer un vrai flux JSON

Le format JSON pour JavaScript Object Notation est l’un des 3 formats de diffusion des données marégraphiques REFMAR mises à disposition sur data.shom.fr, Il s’agit d’un format de données textuelles dérivé de la notation des objets du langage JavaScript. Il permet de représenter de l’information structurée comme le permet XML.

Constitution du format JSON :

Le fichier JSON contient les données brutes sans en-tête.

 {    "data": [

{

“idstation”: 68,

“idsource”: 3,

“value”: 0.42,

“timestamp”: “2014/01/15 00:00:00”

},

{

“idstation”: 68,

“idsource”: 2,

“value”: 0.377,

“timestamp”: “2014/01/15 01:00:00”

}

]

}





Chaque bloc correspond à une hauteur d’eau pour une date/ heure donnée avec : 

idstation : l’identifiant du marégraphe, ici l'identifiant 68 correspondant à TOULON) ;
idsource : le type de donnée, ici 3 et 2 pour Validés temps différé et Brutes temps différé ;
value : la hauteur d’eau en mètre ;
timestamp : la date et l’heure de la donnée en UTC.

Chercher a ' parser Json' des données qui ne sont pas a ce format ne peut pas être la 'bonne voie' ....

J’avais déjà vu ce lien mais il ne donne que les données de marée passé et non futur.

Je voudrais récupère celle de 2021, voici une page type:

view-source:https://marine.meteoconsult.fr/meteo-marine/horaires-des-marees/ile-de-noirmoutier-l-herbaudiere-1021/janvier-2021

on peut lui faire démarrer a une plage précise ?

<div class="tide-date week">

à cette ligne commence les données a chaque journée

et les “” sont identique

“label” “hour” “height” etc.

ces données vont-elles varier en fonction de la météo ? si ce n’est pas le cas, pourquoi ne pas les noter à la main (ou un script shell avec CURL) et le coder dans votre programme ?

Sinon il faut analyser un flux qui arrive sur le port de communication. écrivez une fonction qui attend une chaîne particulière et regardez comment le HTML est formé

par exemple on voit que les jours sont effectivement séparés par <div class="tide-date week"> et vous savez que juste après vous avez la date <span>dimanche 3</span> et ensuite vous avez pour la marée basse

        <span class="label">Marée basse</span>
        <span class="hour">01h09</span>
        <span class="height">1.30m</span>

et pour la marée haute

        <span class="label">Marée haute</span>
        <span class="hour">06h46</span>
        <span class="height">5.20m</span>

donc avec une boucle qui attend <div class="tide-date week">

puis ensuite on attend <span> → lecture du jour et date

puis ensuite on attend <span class="hour"> et on lit l’heure de marée basse

puis ensuite on attend <span class="height"> et on lit la hauteur de marée basse

puis ensuite on attend <span class="hour"> et on lit l’heure de marée haute

puis ensuite on attend <span class="height"> et on lit la hauteur de marée haute

et on boucle en attendant le jour d’après

Avec la librairie ArduinoJSON ?

J4l13n:
Avec la librairie ArduinoJSON ?

:o NON....

on vous a dit déjà 2 fois que vous ne recevez pas un contenu en format JSON, vous recevez un flux en HTML.

Un parser qui attend du contenu formaté JSON ne peut pas fonctionner. Il faut écrire vous même votre analyseur dédié

Il y a les sites en http (port 80) et les sites en https (port 443)

Il faut un certificat pour la transaction sécurisée, c’est peut être possible de faire sans, j’ai vu un post mais pas testé.

Voici un exemple de test avec un certificat:
(il faut exporté le certificat à partir d’un navigateur web au format x509 base 64)
Vous trouverez la façon de le faire avec une recherche.

// code adapté de ce site
//http://www.iotsharing.com/2017/08/how-to-use-https-in-arduino-esp32.html

#include <WiFiClientSecure.h>

const char* ssid = "ici mettre le ssid";
const char* password =  "ici mettre le mot de passe";

void setup() {

  Serial.begin(115200);
  delay(1000);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi..");
  }

  Serial.println("Connected to the WiFi network");
}

const char* ca_cert = \
                      "-----BEGIN CERTIFICATE-----\n" \
                      "MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh\n" \
                      "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\n" \
                      "d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD\n" \
                      "QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT\n" \
                      "MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\n" \
                      "b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG\n" \
                      "9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB\n" \
                      "CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97\n" \
                      "nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt\n" \
                      "43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P\n" \
                      "T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4\n" \
                      "gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO\n" \
                      "BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR\n" \
                      "TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw\n" \
                      "DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr\n" \
                      "hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg\n" \
                      "06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF\n" \
                      "PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls\n" \
                      "YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk\n" \
                      "CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=\n" \
                      "-----END CERTIFICATE-----";


void loop() {

  if ((WiFi.status() == WL_CONNECTED)) { //Check the current connection status

    WiFiClientSecure client;

    client.setCACert(ca_cert);

    const char server[] = "marine.meteoconsult.fr";


    if (client.connect(server, 443)) {
      Serial.println("Connected to server!");
      /* create HTTP request */
      client.println("GET /meteo-marine/horaires-des-marees/ile-de-noirmoutier-l-herbaudiere-1021/janvier-2021 HTTP/1.0");
      client.println("Host: marine.meteoconsult.fr");
      client.println("Connection: close");
      client.println();

      Serial.print("Waiting for response ");
      while (!client.available()) {
        delay(1); //
        Serial.print(".");
      }
      /* if data is available then receive and print to Terminal */
      while (client.available()) {
        char c = client.read();
        Serial.write(c);
        time = millis();
      }
      /* if the server disconnected, stop the client */
      if (!client.connected()) {
        Serial.println();
        Serial.println("Server disconnected");
        client.stop();
      }
    } else {
      Serial.println("Connection failed!");
    }
  }

  while (1); // on s'arrête là pour éviter de boucler
}