Projet de veille réseau switch d-link

Bonjour,

Je souhaiterais créer un projet qui consiste à effectuer des pings réguliers tournants toutes les 5 minutes sur les switchs manageable de mon réseau (une vingtaine) à partir d’un arduino (uno ou mega) et d’un shield ethernet.

Je dispose de leds ws2812b programmables que je souhaite disposer sur une carte murale correspondant aux emplacement physiques des switchs.

ces leds changeront de couleurs en fonction du résultat du ping

  • Verte pour un ping <150ms
  • Orange pour un ping entre 150 et 450ms
  • Rouge pour un ping supérieur à 450ms
  • Rouge clignotant pour un ping sans réponse

Je maitrise toute la partie led et les conditions pour la couleur de celles-ci, par contre je pêche sur shield ethernet pour créer un ping sur une adresse IP et exploiter les données qui en résultent, je n’ai pas trouvé d’exemples là dessus.

Par avance merci pour votre aide.

Cordialement.

jketter:
Bonjour,

Je souhaiterais créer un projet qui consiste à effectuer des pings réguliers tournants toutes les 5 minutes sur les switchs manageable de mon réseau (une vingtaine) à partir d’un arduino (uno ou mega) et d’un shield ethernet.

Je dispose de leds ws2812b programmables que je souhaite disposer sur une carte murale correspondant aux emplacement physiques des switchs.

ces leds changeront de couleurs en fonction du résultat du ping

  • Verte pour un ping <150ms
  • Orange pour un ping entre 150 et 450ms
  • Rouge pour un ping supérieur à 450ms
  • Rouge clignotant pour un ping sans réponse

Je maitrise toute la partie led et les conditions pour la couleur de celles-ci, par contre je pêche sur shield ethernet pour créer un ping sur une adresse IP et exploiter les données qui en résultent, je n’ai pas trouvé d’exemples là dessus.

Par avance merci pour votre aide.

Cordialement.

bonsoir
regarde ce playground

Merci Artouste , ça m'a l'air fort sympathique...

Je vous ferais parvenir le code final quand je l'aurais fais ^^ (si je n'ai pas d'autres soucis avant...)

Bonsoir,

Alors j’ai réussi a finir le corps de mon programme, mais j’ai un soucis :

j’ai créé une boucle while pour que quand la 14ème adresse (incluant la position 0) est affichée, le compteur retombe a 0. Sauf qu’il y a un lag enorme à la sortie de cette boucle, je n’arrive pas à la corriger, comme si le shield ethernet rebootait…

Si vous avez une idée ?

/*
  Ping Example
 
 This example sends an ICMP pings every 500 milliseconds, sends the human-readable
 result over the serial port. 

 Circuit:
 * Ethernet shield attached to pins 10, 11, 12, 13
 
 created 30 Sep 2010
 by Blake Foster
 
 */

#include <SPI.h>         
#include <Ethernet.h>
#include <ICMPPing.h>
int finip[] = {140, 139, 130, 150, 131, 132, 133, 141, 138, 137, 134, 135, 142, 136};
int Cpt = 0;
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; // max address for ethernet shield
byte ip[] = {172,22,20,177}; // ip address for ethernet shield
IPAddress pingAddr(172,22,20,finip[Cpt]); // ip address to ping

SOCKET pingSocket = 0;

char buffer [256];
ICMPPing ping(pingSocket, (uint16_t)random(0, 255));

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

void loop()
{
while (Cpt <= 13) {
IPAddress pingAddr(172,22,20,finip[Cpt]); // ip address to ping
  ICMPEchoReply echoReply = ping(pingAddr, 4);
  sprintf(buffer,"%ld",millis() - echoReply.data.time);
    Serial.println(finip[Cpt]);
  Serial.println(buffer);
     Cpt = Cpt + 1;
     delay(1000);
   }
  Cpt = 0;
  
   
  }

P.S. : J’ai testé avec 2 shields ethernet sur un nano et un mega, ça fait la même chose.

jketter:
Bonsoir,

Alors j’ai réussi a finir le corps de mon programme, mais j’ai un soucis :

j’ai créé une boucle while pour que quand la 14ème adresse (incluant la position 0) est affichée, le compteur retombe a 0. Sauf qu’il y a un lag enorme à la sortie de cette boucle, je n’arrive pas à la corriger, comme si le shield ethernet rebootait…

Si vous avez une idée ?

/*

Ping Example

This example sends an ICMP pings every 500 milliseconds, sends the human-readable
result over the serial port.

Circuit:

  • Ethernet shield attached to pins 10, 11, 12, 13

created 30 Sep 2010
by Blake Foster

*/

#include <SPI.h>        
#include <Ethernet.h>
#include <ICMPPing.h>
int finip = {140, 139, 130, 150, 131, 132, 133, 141, 138, 137, 134, 135, 142, 136};
int Cpt = 0;
byte mac = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; // max address for ethernet shield
byte ip = {172,22,20,177}; // ip address for ethernet shield
IPAddress pingAddr(172,22,20,finip[Cpt]); // ip address to ping

SOCKET pingSocket = 0;

char buffer [256];
ICMPPing ping(pingSocket, (uint16_t)random(0, 255));

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

void loop()
{
while (Cpt <= 13) {
IPAddress pingAddr(172,22,20,finip[Cpt]); // ip address to ping
 ICMPEchoReply echoReply = ping(pingAddr, 4);
 sprintf(buffer,"%ld",millis() - echoReply.data.time);
   Serial.println(finip[Cpt]);
 Serial.println(buffer);
    Cpt = Cpt + 1;
    delay(1000);
  }
 Cpt = 0;
 
 
 }




P.S. : J'ai testé avec 2 shields ethernet sur un nano et un mega, ça fait la même chose.

Je n’ai pas là sous la main de quoi faire un test , mais si je me souviens bien le shield ethernet W5100 ne supporte que 4 socket de connections simultanées.

Idée rapide
ça donne quoi de refaire un Ethernet.begin(mac, ip); lorsque tu es en fin de tes 14 IP ?
ou entre chaque IP ans la mesure où tu a un delay de 1000

/*
  Ping Example

  This example sends an ICMP pings every 500 milliseconds, sends the human-readable
  result over the serial port.

  Circuit:
   Ethernet shield attached to pins 10, 11, 12, 13

  created 30 Sep 2010
  by Blake Foster

*/

#include <SPI.h>
#include <Ethernet.h>
#include <ICMPPing.h>
int finip[] = {140, 139, 130, 150, 131, 132, 133, 141, 138, 137, 134, 135, 142, 136};
int Cpt = 0;
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; // max address for ethernet shield
byte ip[] = {172, 22, 20, 177}; // ip address for ethernet shield
IPAddress pingAddr(172, 22, 20, finip[Cpt]); // ip address to ping

SOCKET pingSocket = 0;

char buffer [256];
ICMPPing ping(pingSocket, (uint16_t)random(0, 255));

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

void loop()
{
  while (Cpt <= 13) {
    IPAddress pingAddr(172, 22, 20, finip[Cpt]); // ip address to ping
    ICMPEchoReply echoReply = ping(pingAddr, 4);
    sprintf(buffer, "%ld", millis() - echoReply.data.time);
    Serial.println(finip[Cpt]);
    Serial.println(buffer);
    Cpt = Cpt + 1;
    delay(1000);
  }
  Cpt = 0;
  Ethernet.begin(mac, ip); // relance begin ip

}

Bonjour, Merci en tout cas pour le coup de main.

Bon alors ça me fais la même chose, C’est bizarre car ça fonctionne quand même bien pendant un cycle

Il me donne le temps du millis() sans soustraire le ping lors du reset du cycle

Ci dessous le résultat sérial

140
9ms
139
8607ms  <--
130
13ms
150
6ms
131
12ms
132
9ms
133
12ms
141
9ms
138
9ms
137
12ms
134
7ms
135
8ms
142
6ms
136
15ms
140
9ms
139
30339ms  <--
130
33ms
150
5ms
131
16ms
132
9ms
133
14ms
141
15ms
138
9ms
137
9ms
134
5ms
135
6ms
142
7ms
136
11ms
140
9ms
139
52091ms  <--
130
12ms
150
5ms
131
27ms
132
9ms
133
16ms
141
5ms
138
11ms
137
17ms
134
6ms
135
6ms
142
6ms
136
11ms
140
10ms
139
73837ms <--
130
13ms
150
10ms
131
10ms
132
9ms
133
10ms
141
6ms
138
9ms
137
18ms
134
29ms

je vais essayer de faire 2 pings sur une adresse avant de passer à la suivante pour garder le second résultat.

Je vois peut-être un peu gros pour un premier vrai projet (mais je me régale alors…)

J’ai mis en P/J une esquisse de la partie visuelle.

jketter:
Bonjour, Merci en tout cas pour le coup de main.

Bon alors ça me fais la même chose, C’est bizarre car ça fonctionne quand même bien pendant un cycle

Il me donne le temps du millis() sans soustraire le ping lors du reset du cycle

Ci dessous le résultat sérial

140

9ms
139
8607ms ←
130
13ms
150
6ms
131
12ms
132
9ms
133
12ms
141
9ms
138
9ms
137
12ms
134
7ms
135
8ms
142
6ms
136
15ms
140
9ms
139
30339ms ←
130
33ms
150
5ms
131
16ms
132
9ms
133
14ms
141
15ms
138
9ms
137
9ms
134
5ms
135
6ms
142
7ms
136
11ms
140
9ms
139
52091ms ←
130
12ms
150
5ms
131
27ms
132
9ms
133
16ms
141
5ms
138
11ms
137
17ms
134
6ms
135
6ms
142
6ms
136
11ms
140
10ms
139
73837ms ←
130
13ms
150
10ms
131
10ms
132
9ms
133
10ms
141
6ms
138
9ms
137
18ms
134
29ms




je vais essayer de faire 2 pings sur une adresse avant de passer à la suivante pour garder le second résultat.

Je vois peut-être un peu gros pour un premier vrai projet (mais je me régale alors...)

J'ai mis en P/J une esquisse de la partie visuelle.

Elle est pas mal celle là ! En fait c’est le switch 139 qui ne répond pas aux pings (paramètre désactivé certainement, à voir.) !!! en fait le programme fonctionne parfaitement ! millis() - 0 = millis() ^^

Ca y est, mon programme est terminé et fonctionne parfaitement ! Reste plus qu’a l’optimiser et harmoniser les pixels.

Merci pour tout Artouste !

Le code ci-dessous pour les intéressé.e.es :

/*
  Ping d'une série de matériel et affichage sur des leds WS2812B (Neopixels) du résultat
 Circuit:
 Ethernet shield attached to pins 10, 11, 12, 13
 
 créé par Julien KETTER
 le 17/01/2018 avec l'aide technique d'Artouste.
 
 */

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h>
#endif
#include <SPI.h>         
#include <Ethernet.h>
#include <ICMPPing.h>

// Which pin on the Arduino is connected to the NeoPixels?
// On a Trinket or Gemma we suggest changing this to 1
#define PIN            6 //Pin correspondant a la sortie pour les NeoPixels

// How many NeoPixels are attached to the Arduino?
#define NUMPIXELS      60 //Nombre de NeoPixels sur la bande

// When we setup the NeoPixel library, we tell it how many pixels, and which pin to use to send signals.
// Note that for older NeoPixel strips you might need to change the third parameter--see the strandtest
// example for more information on possible values.
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

int finip[] = {140, 139, 130, 150, 131, 132, 133, 141, 138, 137, 134, 135, 142, 136}; //Liste de fin des IP du matériel à pinger
int Resultat[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; //Indiquer autant de "1" que de matériel a pinger certainement optimisable
int NumPixel[] = {0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39}; //Emplacement des pixels sur la bande le zero compte (ici un anneau de 60)
int Cpt = 0;
byte mac[] = {0xBA, 0xBA, 0xBE, 0xBE, 0xB0, 0xB0}; // Adresse mac a renseigner ici
byte ip[] = {172,22,20,177}; // adresse ip de l'arduino
IPAddress pingAddr(172,22,20,finip[Cpt]); // zone d'adresses a pinger ici classe C
SOCKET pingSocket = 0;

char buffer [256];
ICMPPing ping(pingSocket, (uint16_t)random(0, 255));

void setup() 
{
  pixels.setBrightness(50); //Luminosité des pixels
  // Démarrage du shield ethernet de l'arduino
  Ethernet.begin(mac, ip);
  Serial.begin(19200);
  // Validation des paramètres des Neopixels
  #if defined (__AVR_ATtiny85__)
  if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
#endif


  pixels.begin(); // Activation de la librairie des NeoPixels
}

void loop()
{
  while (Cpt <= 12) { //Boucle correspondant au nombre de matériels à Pinger + 1 Le Zero compte
      IPAddress pingAddr(172,22,20,finip[Cpt]); // Adresse à Pinger
      ICMPEchoReply echoReply = ping(pingAddr, 4);
      sprintf(buffer,"%ldms",millis() - echoReply.data.time); // Création du résultat
      Serial.println(finip[Cpt]); // Affichage de la fin de l'adresse IP
      Serial.println(buffer); // Affichage du résultat en ms
      Resultat[Cpt] = millis() - echoReply.data.time; //Variable résultat en ms exploitable pour les conditions
      Serial.println(Resultat[Cpt]); //Affiche la variable Resultat pour s'assurer du bon fonctionnement
      delay(500); //Délai entre 2 pings
      Ethernet.begin(mac, ip); //Rappel pour éviter un bug lors de la fin de boucle à tester si possible à supprimer

      //Conditions d'affichage et couleurs correspondantes des NeoPixels
      //Verte entre 0 et 10ms
        if ((Resultat[Cpt] > 0) && (Resultat[Cpt] < 10)) {
        pixels.setPixelColor(NumPixel[Cpt], pixels.Color(0,255,0));
        pixels.show(); } 
      //Bleue entre 10 et 30ms  
        if ((Resultat[Cpt] >= 10) && (Resultat[Cpt] < 30)) {
        pixels.setPixelColor(NumPixel[Cpt], pixels.Color(0,0,255));
        pixels.show(); }
      //Orange entre 30 et 150ms  
        if ((Resultat[Cpt] >= 30) && (Resultat[Cpt] < 150)) {
        pixels.setPixelColor(NumPixel[Cpt], pixels.Color(255,128,0));
        pixels.show(); }
      //Rouge si supérieur à 150ms
        if (Resultat[Cpt] >= 150) {
        pixels.setPixelColor(NumPixel[Cpt], pixels.Color(255,0,0));
        pixels.show(); } 
      //Rouge si résultat négatif matériel défectueux ou non pingable  
        if (Resultat[Cpt] < 0) {
        pixels.setPixelColor(NumPixel[Cpt], pixels.Color(255,0,0));
        pixels.show(); }

      Cpt = Cpt + 1;
  }
Cpt = 0;
 
   
}

jketter:
Ca y est, mon programme est terminé et fonctionne parfaitement ! Reste plus qu'a l'optimiser et harmoniser les pixels.

OK
Alors tant mieux :grin:

Bonjour,

j’ai un autre challenge, je ne sais pas faire clignoter ma led sans interrompre le programme quand Resultat[Cpt] est inférieur à 0 (négatif) ou supérieur à 500 ?

 //Rouge si supérieur à 500ms
      if (Resultat[Cpt] >= 500) {
        pixels.setPixelColor(NumPixel[Cpt], pixels.Color(255,0,0));
        pixels.show(); } 
      //Rouge si résultat négatif matériel défectueux ou non pingable  
      if (Resultat[Cpt] < 0) {
        pixels.setPixelColor(NumPixel[Cpt], pixels.Color(255,0,0));
        pixels.show(); }

Et le code complet mis à jour :

/*
  Ping Example
 
 This example sends an ICMP pings every 500 milliseconds, sends the human-readable
 result over the serial port. 

 Circuit:
 * Ethernet shield attached to pins 10, 11, 12, 13
 
 created 30 Sep 2010
 by Blake Foster
 
 */
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h>
#endif
#include <SPI.h>         
#include <Ethernet.h>
#include <ICMPPing.h>

// Which pin on the Arduino is connected to the NeoPixels?
// On a Trinket or Gemma we suggest changing this to 1
#define PIN            6

// How many NeoPixels are attached to the Arduino?
#define NUMPIXELS      60

// When we setup the NeoPixel library, we tell it how many pixels, and which pin to use to send signals.
// Note that for older NeoPixel strips you might need to change the third parameter--see the strandtest
// example for more information on possible values.
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

int finip[] = {140, 139, 130, 150, 131, 132, 133, 141, 138, 137, 134, 135, 142, 136,}; //Liste de fin des IP du matériel à pinger
int Resultat[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; //Indiquer autant de "1" que de matériel a pinger certainement optimisable
int NumPixel[] = {8, 11, 14, 17, 20, 23, 29, 32, 56, 53, 47, 44, 38, 35,}; //Emplacement des pixels sur la bande le zero compte (ici un anneau de 60)
int Cpt = 0;
byte mac[] = {0xBA, 0xBA, 0xBE, 0xBE, 0xB0, 0xB0}; // Adresse mac a renseigner ici
byte ip[] = {172,22,20,177}; // adresse ip de l'arduino
IPAddress pingAddr(172,22,20,finip[Cpt]); // zone d'adresses a pinger ici classe C
SOCKET pingSocket = 0;

char buffer [256];
char erreur [256];
ICMPPing ping(pingSocket, (uint16_t)random(0, 255));

void setup() 
{
  pixels.setBrightness(100); //Luminosité des pixels
  // Démarrage du shield ethernet de l'arduino
  Ethernet.begin(mac, ip);
  Serial.begin(19200);
  // Validation des paramètres des Neopixels
  #if defined (__AVR_ATtiny85__)
  if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
#endif


  pixels.begin(); // Activation de la librairie des NeoPixels
}

void loop()
{
  while (Cpt <= 13) { //Boucle correspondant au nombre de matériels à Pinger + 1 Le Zero compte
      IPAddress pingAddr(172,22,20,finip[Cpt]); // Adresse à Pinger
      ICMPEchoReply echoReply = ping(pingAddr, 4);
      sprintf(buffer,"%ldms",millis() - echoReply.data.time); // Création du résultat
      Serial.println(finip[Cpt]); // Affichage de la fin de l'adresse IP
      Serial.println(buffer); // Affichage du résultat en ms
      Resultat[Cpt] = millis() - echoReply.data.time; //Variable résultat en ms exploitable pour les conditions
      Serial.println(Resultat[Cpt]); //Affiche la variable Resultat pour s'assurer du bon fonctionnement
      delay(500); //Délai entre 2 pings
      Ethernet.begin(mac, ip); //Rappel pour éviter un bug lors de la fin de boucle à tester si possible à supprimer
  
        //Conditions d'affichage et couleurs correspondantes des NeoPixels
      //Verte foncé entre 0 et 10ms
      if ((Resultat[Cpt] > 0) && (Resultat[Cpt] < 10)) {
        pixels.setPixelColor(NumPixel[Cpt], pixels.Color(0,196,0));
        pixels.show(); } 
      //vert clair entre 10 et 30ms  
      if ((Resultat[Cpt] >= 10) && (Resultat[Cpt] < 20)) {
        pixels.setPixelColor(NumPixel[Cpt], pixels.Color(0,128,64));
        pixels.show(); }
      //jaune entre 30 et 50ms  
      if ((Resultat[Cpt] >= 20) && (Resultat[Cpt] < 40)) {
        pixels.setPixelColor(NumPixel[Cpt], pixels.Color(255,255,0));
        pixels.show(); }
      //jaune foncé entre 50 et 100ms  
      if ((Resultat[Cpt] >= 40) && (Resultat[Cpt] < 100)) {
        pixels.setPixelColor(NumPixel[Cpt], pixels.Color(255,128,0));
        pixels.show(); }
      //Orange entre 100 et 500ms  
      if ((Resultat[Cpt] >= 100) && (Resultat[Cpt] < 500)) {
        pixels.setPixelColor(NumPixel[Cpt], pixels.Color(128,64,0));
        pixels.show(); }
      //Rouge si supérieur à 500ms
      if (Resultat[Cpt] >= 500) {
        pixels.setPixelColor(NumPixel[Cpt], pixels.Color(255,0,0));
        pixels.show(); } 
      //Rouge si résultat négatif matériel défectueux ou non pingable  
      if (Resultat[Cpt] < 0) {
        pixels.setPixelColor(NumPixel[Cpt], pixels.Color(255,0,0));
        pixels.show(); }
  
      Cpt = Cpt + 1;
  }
Cpt = 0;
 
   
}

Par avance, Merci