Ethernet

De Wiki L.A.B
Révision de 3 janvier 2016 à 13:42 par Nedseb (discussion | contributions)

(diff) ← Version précédente | Voir la version courante (diff) | Version suivante → (diff)
Aller à : navigation, rechercher
Matériel
  • 1 Arduino UNO
  • 1 Shield Ethernet
Principe
Programme

Le premier exemple, est un client/serveur minimaliste de chat :

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1, 177);
IPAddress gateway(192,168,1, 1);
IPAddress subnet(255, 255, 0, 0);


// port telnet par défaut
EthernetServer server(23);
boolean alreadyConnected = false;

void setup() {
  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();
  Serial.begin(9600);
  Serial.print("Adresse du Chat:");
  Serial.println(Ethernet.localIP());
}

void loop() {
  // attendre un nouveau client
  EthernetClient client = server.available();

  // quand le client commence à nous écrire dire "Hello"
  if (client) {
    if (!alreadyConnected) {
      client.flush();    
      Serial.println("Nous avons un nouveau client");
      client.println("Hello, client!");
      alreadyConnected = true;
    }

    if (client.available() > 0) {
      char thisChar = client.read();
      server.write(thisChar);
      Serial.write(thisChar);
    }
  }
}

Maintenant le client associé :

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = {  
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEE };
IPAddress ip(192,168,1,178);

// IP de votre serveur de chat
IPAddress server(192,168,1,177);
EthernetClient client;

void setup() {
  Ethernet.begin(mac, ip);
  Serial.begin(9600);

  // delai d'initialisation du shield
  delay(1000);

  Serial.println("connexion...");

  if (client.connect(server, 23)) {
    Serial.println("connecté");
  }
  else {
    Serial.println("échec de connexion");
  }
}

void loop()
{
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  while (Serial.available() > 0) {
    char inChar = Serial.read();
    if (client.connected()) {
      client.print(inChar);
    }
  }

  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
    while(true);
  }
}

Nous allons faire un petit programme qui va interroger un serveur HTTP et qui affiche la réponse sur le port série :

#include <SPI.h>
#include <Ethernet.h>

// Adresse MAC du shield Ethernet
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
char server[] = "www.google.com";  

// Réglage de l'adresse de secours utilisée si le DHCP échoue
IPAddress ip(192,168,0,177);

EthernetClient client;

void setup() {
  Serial.begin(9600);
  // démarrage de la session Ethernet:
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // En cas d'échec de l'allocation dynamique d'IP on configure manuellement
    Ethernet.begin(mac, ip);
  }
  // Laisser le temps au shield de terminer toutes ses initialisation.
  delay(1000);

  Serial.println("connexion...");

  if (client.connect(server, 80)) {
    Serial.println("connected");
    // Faire une requete HTTP
    client.println("GET /search?q=nedseb HTTP/1.1");
    client.println("Host: www.google.com");
    client.println("Connection: close");
    client.println();
  }
  else {
    Serial.println("échec de connexion");
  }
}

void loop()
{
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  // Si l'on perd la connexion, les ressources du client sont libérées
  if (!client.connected()) {
    Serial.println();
    Serial.println("déconnexion.");
    client.stop();

    // Plus rien à faire
    while(true);
  }
}

L'exemple suivant créé un serveur HTTP affichant une page web donnant l'état des entrées analogiques

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};

IPAddress ip(192, 168, 0, 177);

//Créer un serveur en écoute sur le port 80 (celui utilisé par défaut pour les navigateurs Web)
EthernetServer server(80);

void setup() {
  Serial.begin(9600);


  // démarrage de la connexion et du serveur 
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("le serveur écoute sur l'adresse  ");
  Serial.println(Ethernet.localIP());
}

void loop() {
  // Écoute si un nouveau client est arrivé
  EthernetClient client = server.available();
  if (client) {
    Serial.println("nouveau client");
    // Une requête HTTP se termine par une ligne vide
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        if (c == '\n' && currentLineIsBlank) {
          // La requête est terminée, on envoie une réponse HTTP standard
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close"); 
          client.println("Refresh: 5");  // Rafraichir la page toute les 5 secondes
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          // afficher la valeur courante des entrées analogiques
          for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
            int sensorReading = analogRead(analogChannel);
            client.print("L'entrée analogique ");
            client.print(analogChannel);
            client.print(" à pour valeur ");
            client.print(sensorReading);
            client.println("<br />");
          }
          client.println("</html>");
          break;
        }
        if (c == '\n') {
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          currentLineIsBlank = false;
        }
      }
    }
    delay(1);
    client.stop();
    Serial.println("client déconnecté");
  }
}


#include <SPI.h>
#include <Ethernet.h>

boolean incoming = 0;
char* etatLed;
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};

IPAddress ip(192, 168, 0, 177);

//Créer un serveur en écoute sur le port 80 (celui utilisé par défaut pour les navigateurs Web)
EthernetServer server(80);

void setup()
{
  pinMode(2, OUTPUT);
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.begin(9600);
}

void loop()
{
  EthernetClient client = server.available();
  if (client) {
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if(incoming && c == ' '){ 
          incoming = 0;
        }
        if(c == '$'){ 
          incoming = 1; 
        }
        
        //vérifier si l'URL contient $1 ou $2
        if(incoming == 1){
          Serial.println(c);
          
          if(c == '1'){
            etatLed = "ON";
            Serial.println("ON");
            digitalWrite(2, HIGH);
          }
          if(c == '2'){
            etatLed = "ON";
            Serial.println("OFF");
            digitalWrite(2, LOW);
          }
        }

        if (c == '\n' && currentLineIsBlank) {
          // La requête est terminée, on envoie une réponse HTTP standard
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close"); 
          client.println("Refresh: 5");  // Rafraichir la page toute les 5 secondes
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html><body>");
          client.print("<h1> Etat LED 2 : ");
          client.print("etatLed");
          client.print("</h1>");
          client.println("</body></html>");
          break;
        }
        if (c == '\n') {
          currentLineIsBlank = true;
        } 
        else if (c != '\r') {
          currentLineIsBlank = false;
        }
      }
    }
    delay(1);
    client.stop();
    Serial.println("client déconnecté");
  }
}