Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Shield Ethernet : détecter réponse au ping ?


Sujet :

Arduino

  1. #1
    Membre actif
    Shield Ethernet : détecter réponse au ping ?
    Bonjour,

    Je suis toujours sur mon projet d'Arduino Uno client Ethernet avec shield Ethernet et écran TFT tactile

    Je n'ai pas voulu utiliser websocket car cela implique de maintenir la connexion entre client et serveur ce qui est inadapté à mon projet (notamment parce que mon serveur Arduino Mega ne pourrait pas maintenir 8 connections en même temps avec 8 clients).

    Websocket aurait été approprié si je n'avais qu'un nombre très limité de clients.

    J'ai découvert que mon Arduino client répondait au ping. Je pense que c'est la puce du Shield Ethernet qui gère ça toute seule.

    Je me demande si ça serait possible de détecter dans mon programme le ping, tout en conservant un fonctionnement en client Ethernet.

    Le but vous l'avez deviné, c'est que le serveur puisse puisse forcer le client à lui envoyer une requête.

    J'ai un peu le sentiment que le Shield Ethernet peut faire beaucoup de choses et que les limites viennent surtout de la librairie associée.

    Je vais finir par mettre mon nez dans la librairie pour peut être la modifier...

    Il y a aussi le protocole UDP que je n'ai pas testé... Ca serait pertinent (code probablement plus léger, bi directionnel) car dans mon projet j'ai ajouté un contrôle du contenu des requêtes et des réponses (longueur + CRC)

    Après le soucis si je bascule en UDP, c'est que mon Arduino Mega utilisé en "unité centrale" devra en même temps se comporter en serveur web pour interagir avec le navigateur web d'un ordinateur ou d'un smartphone du réseau local...

    C'est un autre aspect un peut bloquant : je me trompe peut-être mais je crois que le shield Ethernet ne peut être utilisé que d'une seule façon (client TCP, serveur TCP, UDP) même sur un Arduino "puissant".

    A bientôt

  2. #2
    Membre éprouvé
    le W5500 du Arduino Ethernet Shield 2 répond en effet au ping. il y a un registre (Mode Register) dont la bit 4 permet d'activer ou non la réponse au ping.



    (cf le chapitre 4.1 de la doc)

    Blake Foster a une bibliothèque ICMP Ping qui a été modifiée pour supporter les W5500. Elle dépend de la bibliothèque Ethernet 2 d'Adafruit qui a été arrêtée et remplacée par celle standard dans l'IDE.

    ==> peut-être une piste à explorer

  3. #3
    Membre actif
    Bonjour,

    Merci pour cette réponse détaillée

    Je viens de jeter un œil à la bibliothèque https://github.com/BlakeFoster/Ardui...ster/icmp_ping

    Il y a pas mal de code pour que l'Arduino et son Shield Ethernet répondent au ping

    Mais le Shield Ethernet répond de lui-même au ping sans tout ce code. C'est ce que dit la datasheet, ça doit être codé dans le W5500

    J'aurais juste aimé trouvé une combine pour lire simplement un registre ou un sémaphore disant que le shield a reçu un ping, sans devoir ajouter une grosse "tartine" de code à mon projet Arduino.

    A bientôt

  4. #4
    Membre éprouvé
    je n'ai pas lu la doc en détail mais en première lecture je n'ai pas vu de registre qui justement dirait "je viens de répondre à un ping de xxx.xxx.xxx.xxx"

    si le coeur vous en dit il faudrait plonger dans ces docs là mais quand vous allez vois les PDF c'est littéralement du chinois



    j'avoue que comme je n'ai jamais eu le besoin, je n'ai pas creusé ce côté là.

  5. #5
    Membre actif
    Bonjour,

    Merci, la documentation est fort instructive...

    Je me pose une question : la datasheet précise que le W5500 ne supporte pas l'IP fragmentation

    Si j'utilise le W5500 en client TCP, et que je fait une requête au serveur (HTTP GET), et qu'ensuite le serveur m'envoie sa réponse mais découpée en plusieurs paquets, que se passe-t-il ?

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
      if (client.connect(serverIP, 80)) {
        client.print(Buffer_Requette); // Envoit de la requête
     
        //Attente de la réponse du serveur
        debut = millis();
        nb=0;
        while(nb==0){ 
          nb = client.available();
          if (millis()-debut>NetworkTimeout) {break;}
        }
     
        //Lecture de la réponse du serveur :
        if (nb==0) {
          return 1; // ERREUR : Le serveur met trop de temps à répondre
        } else {
     
    	    for (i=0;i<nb;i++) {
              c=client.read();
              Buffer_Reponse[i]=c; 
            }
    	}
          return 0; // OK
     
      } else {
          return 2; // ERREUR : Le client n'arrive pas à se connecter
     
      }


    Vais-je quand même recevoir la réponse du serveur en entier ou bien juste la première partie tronquée correspondant au 1ier paquet ?

    Pour moi ce n'est pas clair du tout...

    A bientôt

  6. #6
    Membre éprouvé
    Bonsoir

    La fragmentation c’est le découpage d’un packet (donc déjà un bout du message) en plus petits paquets si le MTU du réseau suivant est trop petit. Ça N’arrivera pas au sein de votre réseau de la maison et généralement ce sont les routeurs en bords de ces réseaux qui font le boulot dans un sens puis dans l’autre.

    Le découpage Initial en paquets n’est pas un soucis, vous recevrez tout

###raw>template_hook.ano_emploi###