PING pour reboot

bonjour
Comment faire un test de ping sur une adresse de routeur pour vérifier que la carte ethernet n'est pas plante et reset mega en cas contraire
merci

Si la carte est "plantée" comment voulez vous faire un ping ou tout autre commande?

Bonjour
je n ai pas été clair
c'est la carte ethernet qui plante d ou la necessite de faire un test ping toutes les x minutes si le test ok on retourne dans la boucle sinon reboot le mega.
Le mega fonctionne normalement mais pas toujour la carte ethernet donc plus de visu des resultat web
resultat sur affichage led mega ok

c'est un hack, l'idéal serait de trouver pourquoi la carte ethernet "plante"...

vous êtes en DHCP ou adresse IP fixe ? si vous êtes en DHCP il faut maintenir éventuellement de temps en temps votre "lease" (cf la doc de Ethernet.maintain())

sinon une façon simple de faire est d'appeler une page web "connue" qui retourne "OK" ou "Success". c'est ce que font de nombreux constructeurs

par exemple apple utilise Success pour voir si vous avez accès à internet dans le cadre d'un captive portal. Si l'appareil réussit à lire le texte "Success" en réponse c'est qu'il est bien connecté, si vous avez un timeout c'est que la requête n'est pas passée. (cliquez sur le lien, vous verrez Success dans votre navigateur)

(Amazon utilise Kindle Reachability Probe Page et android ou chrome clients3.google.com (qui retourne juste le header HTTP))

vous pourriez prendre une approche similaire

il s agit d une ip fixe et le routeur est quand a lui joingnable avec un dns
j ai bien compris ton systeme mais ne vois pas du tout comme proceder.
merci J-M-L

Regardez les code d’exemples (genre WebClient) pour faire une requête GET HTTP depuis votre carte ethernet, il suffit ensuite de lire le contenu de la réponse et le comparer à ce que vous attendez

Voici un exemple de code qui utilise le serveur google (utilisé dans android) pour tester la connectivité à internet

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


// the media access control (ethernet hardware) address for the shield:
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
//the IP address for the shield:
byte ip[] = { 192, 168, 1, 28 };


//===============================================
// TESTING IF ALIVE (leverage Android service)
//===============================================
EthernetClient client;
const unsigned long timeOut = 1000;

boolean attenteChaine(const char * endMarker, unsigned long duration)
{
  int localBufferSize = strlen(endMarker); // we won't need an \0 at the end
  char localBuffer[localBufferSize];
  int index = 0;
  boolean endMarkerFound = false;
  unsigned long currentTime;

  memset(localBuffer, '\0', localBufferSize); // clear buffer

  currentTime = millis();
  while (millis() - currentTime <= duration) {
    if (client.available() > 0) {
      if (index == localBufferSize) index = 0;
      localBuffer[index] = (uint8_t) client.read();
      endMarkerFound = true;
      for (int i = 0; i < localBufferSize; i++) {
        if (localBuffer[(index + 1 + i) % localBufferSize] != endMarker[i]) {
          endMarkerFound = false;
          break;
        }
      }
      index++;
    }
    if (endMarkerFound) break;
  }

  return endMarkerFound;
}


boolean internetAccessible()
{
  boolean r;

  // client.connect Returns an int (1,-1,-2,-3,-4) indicating connection status :
  // SUCCESS 1
  // TIMED_OUT -1
  // INVALID_SERVER -2
  // TRUNCATED -3
  // INVALID_RESPONSE -4

  client.setTimeout(timeOut);
  if (client.connect("clients3.google.com", 80) != 1) {
    return false;
  }

  // si on est connnecté on devriat recevoir une réponse HTTP/1.0 204 No Content
  client.println("GET /generate_204 HTTP/1.0\r\nHost: arduino.cc\r\nUser-Agent: Arduino\r\n");
  r = attenteChaine("204", timeOut); // on se donne au max  timeOut millisecondes pour recevoir la réponse
  client.stop();
  return r;
}


// --------------------------------------------------

void setup() {
  Serial.begin(115200);
  // start the Ethernet connection:
  Ethernet.begin(mac, ip);
}



//===============================================
//
//===============================================
void loop() {
  Serial.print(millis());
  if (internetAccessible()) {
    Serial.print("\t-\t");  Serial.print(millis());
    Serial.println("\t\tc'est bon!");
  } else {
    Serial.print("\t-\t");  Serial.print(millis());
    Serial.println("\t\tc'est pas bon!");
  }
}

vous le chargez dans votre carte UNO + shield ethernet connecté et ouvrez la console à 115200 bauds (ça va utiliser l’adresse IP fixe 192.168.1.28 à changer dans le code en fonction de ce que vous voulez)

voici ce que ça m’affiche (début en bleu) quand je débranche intempestivement le fil ethernet (partie en rouge) et puis que je le rebranche (partie en vert)

[color=blue]300	-	591		c'est bon!
592	-	888		c'est bon!
888	-	1183		c'est bon!
1183	-	1474		c'est bon!
1474	-	1770		c'est bon!
1770	-	2071		c'est bon!
2071[/color][color=red]	-	34246		c'est pas bon!
34246	-	36068		c'est pas bon!
36068	-	37890		c'est pas bon!
37890	-	39711		c'est pas bon!
39711	-	41533		c'est pas bon!
41533	-	43355		c'est pas bon![/color]
[color=green]43356	-	44456		c'est bon!
44457	-	44550		c'est bon!
44551	-	44644		c'est bon!
44644	-	44737		c'est bon!
[/color]

quand je le débranche intempestivement, en fonction de là où on est dans le code le timeout peut être plus ou moins grand la première fois (ici j’ai débranché vers 2071 et j’ai eu mon timeout à 34246 soit 32 secondes) mais ensuite vous pouvez voir que le timeOut du code est respecté.

il existe des librairies différentes avec des fonctions de gestion plus fine du timeOut (cf par exemple EthernetMod) qui a une méthode EthernetClient.setClientTimeout()

Merci J-M-L
il va falloir que j epure cela pour en faire une fonction qui reboot le mega si pas de reponse du fait du plantage de la carte ethernet
pense tu qu il est possible de faire un test sur l ip du routeur soit 192.168.1.1 ?

Oui c'est un peu le même principe - si vous faite un http://192.168.1.1 ça vous répond quelque chose ? (généralement c'est la page de config du routeur)

bonjour,
moi aussi je suis dans le même cas "presque" ou il faut que je teste le ping d'une adresse IP , (j'ai que l'adresse IP, j'ai pas le domaine exemple http:// etc ..... ) donc si je mis l'addresse IP à pinger ex ("192.168.1.10")au lieu de "clients3.google.com" est ce que ca va marcher ? Merci

Bonsoir Pascal17740

Pascal17740:
pense tu qu il est possible de faire un test sur l ip du routeur soit 192.168.1.1 ?

Si c'est juste pour tester la carte Ethernet, une adresse ip que l'on trouve partout est la localhost 127.0.0.1

Cordialement
jpbbricole