// --- Inclusion des librairies --- # Include // librairie SPI - obligatoire avec librairie Ethernet # Include // librairie Ethernet // --- Déclaration des variables globales --- //--- l'adresse mac = identifiant unique du shield // à fixer arbitrairement ou en utilisant l'adresse imprimée sur l'étiquette du shield byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x1A, 0x71 }; //----- l'adresse IP fixe à utiliser pour le shield Ethernet --- IPAddress ipLocal(192,168,1,150); // l'adresse IP locale du shield Ethernet // ATTENTION : il faut utiliser une adresse hors de la plage d'adresses du //routeur DHCP // pour connaitre la plage d'adresse du routeur : s'y connecter depuis un// //navigateur à l'adresse xxx.xxx.xxx.1 // par exemple : sur livebox : plage adresses DHCP entre .10 et .50 => on peut //utiliser .100 pour le shield ethernet // --- Déclaration des objets utiles pour les fonctionnalités utilisées --- //--- création de l'objet serveur ---- EthernetServer serveurHTTP(80); // crée un objet serveur utilisant le port 80 //=port HTTP String chaineRecue=""; // déclare un string vide global pour réception chaine //requete int comptChar=0; // variable de comptage des caractères reçus void setup() { // debut de la fonction setup() // --- ici instructions à exécuter 1 seule fois au démarrage du programme --- // ------- Initialisation fonctionnalités utilisées ------- Serial.begin(9600); // Initialise connexion Série //---- initialise la connexion Ethernet avec l'adresse MAC du module Ethernet, //l'adresse IP Locale //---- +/- l'adresse IP du serveurDNS , l'adresse IP de la passerelle internet et le //masque du réseau local //Ethernet.begin(mac); // forme pour attribution automatique DHCP - utilise plus //de mémoire Flash (env + 6Ko) Ethernet.begin(mac, ipLocal); // forme conseillée pour fixer IP fixe locale //Ethernet.begin(mac, ipLocal, serverDNS, passerelle, masque); // forme complète delay(1000); // donne le temps à la carte Ethernet de s'initialiser Serial.print("Shield Ethernet OK : L'adresse IP du shield Ethernet est :" ); Serial.println(Ethernet.localIP()); //---- initialise le serveur ---- serveurHTTP.begin(); Serial.println("Serveur Ethernet OK : Ecoute sur port 80 (http)"); } // fin de la fonction setup() void loop(){ // debut de la fonction loop() // crée un objet client basé sur le client connecté au serveur EthernetClient client = serveurHTTP.available(); if (client) { // si l'objet client n'est pas vide // le test est VRAI si le client existe // message d'accueil dans le Terminal Série Serial.println ("--------------------------"); Serial.println ("Client present !"); Serial.println ("Voici la requete du client:"); ////////////////// Réception de la chaine de la requete ////////////////////////// //-- initialisation des variables utilisées pour l'échange serveur/client chaineRecue=""; // vide le String de reception comptChar=0; // compteur de caractères en réception à 0 if (client.connected()) { // si le client est connecté /////////////////// Réception de la chaine par le réseau //////////////////////// while (client.available()) { // tant que des octets sont disponibles en lecture // le test est vrai si il y a au moins 1 octet disponible char c = client.read(); // l'octet suivant reçu du client est mis dans la variable c comptChar=comptChar+1; // incrémente le compteur de caractère reçus Série reçue Serial.print(c); // affiche le caractère reçu dans le Terminal //--- on ne mémorise que les n premiers caractères de la requete //--- afin de ne pas surcharger la RAM et car cela suffit pour l'analyse de la requete if (comptChar<=100) chaineRecue=chaineRecue+c; // ajoute le caractère reçu au String //pour les N premiers caractères //else break; // une fois le nombre de caractères dépassés sort du while } // --- fin while client.available = fin "tant que octet en lecture" Serial.println ("Reception requete terminee"); /////////////////// Affichage de la requete reçue ////////////////////// Serial.println(F("------------ Affichage de la requete recue ------------")); // affiche le String de la requete Serial.println (F("Chaine prise en compte pour analyse : ")); Serial.println(chaineRecue); // affiche le String de la requete pris en compte pour analyse /////////////////// Analyse de la requete reçue ////////////////////// Serial.println(F("------------ Analyse de la requete recue ------------")); //analyse le String de //la requete //------ analyse si la chaine reçue est une requete GET -------- if (chaineRecue.startsWith("GET")) { // si la chaine recue commence par GET Serial.println (F("Requete HTTP valide !")); //-- envoi de la réponse HTTP --- client.println("HTTP/1.1 200 OK"); // entete de la réponse : protocole HTTP 1.1 et //exécution requete réussie client.println("Content-Type: text/html"); // précise le type de contenu de la réponse qui //suit client.println("Connnection: close"); // précise que la connexion se ferme après la //réponse client.println(); // ligne blanche //--- la reponse à afficher dans le navigateur client.println("Reception de la reponse du serveur http !"); // message texte qui //va //s'afficher dans le navigateur client //--- envoi en copie de la réponse http sur le port série Serial.println("La reponse HTTP suivante est envoyee au client distant :"); Serial.println("HTTP/1.1 200 OK"); Serial.println("Content-Type: text/html"); Serial.println("Connnection: close"); Serial.println(); //------ début de la page HTML ------- client.println(""); // code HTML pour police jaune sur fond bleu // client.print(""); // "> client.println(" "); // affiche chaines caractères simples client.print("Coucou !"); client.println(" "); // saut de ligne HTML client.print("Tu vas bien ? "); client.println(" "); // saut de ligne HTML client.print("Arduino fait le serveur pour te servir !! "); client.println(" "); // saut de ligne HTML // code HTML pour inclure une image à partir lien web // client.println(" ");// client.print("[[Fichier:),client.print(]]"); // "> client.println(" ");// //-------- fin de la page HTML ------- } // fin if GET else { // si la chaine recue ne commence pas par GET Serial.println (F("Requete HTTP non valide !")); } // fin else //------ fermeture de la connexion ------ // fermeture de la connexion avec le client après envoi réponse delay(1); // laisse le temps au client de recevoir la réponse client.stop(); Serial.println(F("------------ Fermeture de la connexion avec le client------------")); // affiche //le String de la requete Serial.println (F("")); } // --- fin if client connected } //---- fin if client ---- } // fin de la fonction loop()