ta fonction void GET (EthernetClient cl)
est inexploitable : la requête du client (le navigateur) est perdue.
Déjà tu fais une copie de l'objet cl
en le passant en paramètre : cette copie est inutile, voire même source de problèmes. Tu dois passer l'objet cl
par référence : void GET (EthernetClient& cl)
note bien le caractère & rajouté.
Ensuite, dans ta fonction, je te suggère d'afficher clairement la question posée par le client:
void GET ( EthernetClient& cl ) {
while ( cl.available() ) { // tant qu'il a des infos à lire
char c = cl.read(); // on lit le caractère
Serial.print ( c );
}
// C'EST TOUT POUR L'INSTANT,
// APRES IL FAUDRA DECIDER DE LA REPONSE A DONNER
// SELON LA QUESTION RECUE
}
Le but est de bien saisir le dialogue qui se déroule entre le navigateur client et ton serveur HTTP dans l'Arduino.
A priori dans ton navigateur, tu vas taper l'adresse IP de l'Arduino (le port 80 est sous entendu), le navigateur va t'envoyer quelque chose comme :
GET / HTTP/1.1
Host: 192.168.1.177:80
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.1.2 Safari/603.3.8
Referer: http://192.168.1.177:80/
Cache-Control: max-age=0
Accept-Language: fr-fr
Ca dépend de ton navigateur, ce qui est important, c'est :
- la ligne
GET /
qui demande au serveur d'envoyer la ressource de plus haut niveau. Dans ton cas tu n'as qu'une seule page HTML, donc ton serveur Arduino va envoyer le code HTML de cette page (c'est ce que font tes fonctions entete()
, corps()
, etc).
- la ligne vide à la fin qui signale la fin du message. Donc quand tu reçois le séquence "\r\n\r\n", tu sais que la question est finie, pas besoin d'attendre un time-out pour le savoir.
Donc tu envoies le code HTML de ta page, et dans ce code, dans le "body", il y a la ligne
<img src="flocon.jpg">
Le navigateur reçoit ce code, et il comprend donc qu'il va devoir afficher une image, qui se trouve dans un fichier nommé flocon.jpg. Du coup, il pose au serveur une nouvelle question "envoie moi l'image flocon.jpg". Donc il envoie:
GET flocon.jpg HTTP/1.1
Host: 192.168.1.177:80
Accept: image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5
Connection: keep-alive
Cookie: first=1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.1.2 Safari/603.3.8
Accept-Language: fr-fr
Referer: http://192.168.1.177:80
Accept-Encoding: gzip, deflate
Le contenu exact dépend de ton navigateur, ce qui est important, c'est
- la ligne
GET flocon.jpg
: il dit clairement ce qu'il veut !
- la ligne vide en fin (voir plus haut)
A ce moment ton serveur doit répondre et envoyer le contenu du fichier JPEG. Voici ce qu'il faut envoyer :
HTTP/1.1 200 OK
Content-Type: image/jpeg
Content-Length: LA_TAILLE_DE_TON_FICHIER_JPEG_EN_OCTETS
(ne pas oublier la ligne vide !)
Puis il faut envoyer dans la foulée le contenu du fichier JPEG, comme je te l'ai expliqué plus haut.
Au final tu vois l'importance d'analyser la question posée par le client, afin de lui répondre correctement.
Bon courage !