Ethernet
De Wiki L.A.B
Révision de 3 janvier 2016 à 13:42 par Nedseb (discussion | contributions)
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é");
}
}