Ethernet linkStatus e/o ICMP ping?

Sto provando a completare un progetto composto da un Arduino UNO R3, Ethernet shield W5100 e 4 relay shield. Il mio problema è riuscire a verificare se il cavo Ethernet è connesso e possibilmente anche se si riesce a fare ping al gateway di rete.
Il primo problema è la funzione linkStatus(), la quale, come da documentazione, non è utilizzabile con W5100 ma solo con W5200 o W5500. Dato che per ora escludo di poter cambiare shield (tra l'altro non ho trovato shield con W5200 o W5500 ma sono tutte con W5100) o di usare una Ethernet W5500 "stand-alone" (per ora, per problemi di cablaggio diciamo), ho pensato di fare semplicemente ping al gateway per cui ho cercato come farlo con Arduino.
L'unica libreria che pare esistente per fare ping è la "ICMPPing" o "icmp_ping" di tal Blake Foster. Tutto contento, la scarico, la installo nella cartella "libraries", apro uno dei due esempi... Errore! Non compila. :frowning:

\libraries\icmp_ping\ICMPPing.cpp: In member function 'Status ICMPPing::sendEchoRequest(const IPAddress&, const ICMPEcho&)':
c:\Users\Alex\Documents\Arduino\libraries\icmp_ping\ICMPPing.cpp:184:11: error: 'class W5100Class' has no member named 'send_data_processing'
     W5100.send_data_processing(_socket, serialized, sizeof(ICMPEcho));
           ^~~~~~~~~~~~~~~~~~~~
c:\Users\Alex\Documents\Arduino\libraries\icmp_ping\ICMPPing.cpp: In member function 'void ICMPPing::receiveEchoReply(const ICMPEcho&, const IPAddress&, ICMPEchoReply&)':
c:\Users\Alex\Documents\Arduino\libraries\icmp_ping\ICMPPing.cpp:207:19: error: 'class W5100Class' has no member named 'getRXReceivedSize'
         if (W5100.getRXReceivedSize(_socket) < 1)
                   ^~~~~~~~~~~~~~~~~
c:\Users\Alex\Documents\Arduino\libraries\icmp_ping\ICMPPing.cpp:219:9: error: 'class W5100Class' has no member named 'read_data'
   W5100.read_data(_socket, (uint16_t) buffer, ipHeader, sizeof(ipHeader));
         ^~~~~~~~~
c:\Users\Alex\Documents\Arduino\libraries\icmp_ping\ICMPPing.cpp:229:9: error: 'class W5100Class' has no member named 'read_data'
   W5100.read_data(_socket, (uint16_t) buffer, serialized, dataLen);
         ^~~~~~~~~
Più di una libreria trovata per "Ethernet.h"
  Usata: C:\Users\Alex\Documents\Arduino\libraries\Ethernet
  Non usata: C:\Users\Alex\AppData\Local\Arduino15\libraries\Ethernet
exit status 1

Compilation error: exit status 1

Investigando, pare che il problema sia che la libreria è vecchia (15 anni fa!) e qualcosa nella libreria Ethernet nel frattempo è cambiata, quindi non trova più i simboli che deve usare.
Morale dalla favola, e che diventa la domanda: possibile che non esista una libreria (decente e funzionante) per Arduino per fare un semplice ping???

In alternativa, quale altro metodo si potrebbe usare per determinare la presenza del link Ethernet? A me non viene in mente altro, ma magari c'è qualche "hack" della Ethernet per consentire di avere questa semplice risposta booleana se il link è presente o meno...

EDIT: esiste QUESTA che mi sembra integrare anche la MCU quindi di fatto è l'insieme di Arduino UNO + Ethernet shield W5500, giusto? Ma leggo che utilizza la libreria Ethernet55.h nella quale però non vedo la funzione "linkStatus()", qualcuno che ce l'ha e magari l'ha provata mi sa confermare se consente di leggere lo stato del link?

Di solito i router hanno qualche porta aperta che potresti sfruttare per stabilire lo stato della connessione.

Ad esempio potrebbe esserci la porta 80 (interfaccia web) o la porta 53 (dns) oppure la porta 22 (ssh) etcetc.

Provi a fare una connessione e se hai risposta di qualsiasi tipo (errori compresi), allora va tutto bene.
Se invece vai in timeout, c'è qualcosa che non va.

Certo, più che una soluzione è una pezza.. :confounded_face:

Ti ringrazio, ma non posso sapere a priori quale porta potrebbero avere aperta perché questo circuitino dovrei poterlo installare in reti delle quali non ho controllo né so come sia la topologia.

Per ora ho fatto una "porcata" ancora peggiore: ho provato a collegare ad un pin (in questo caso A0) il piedino che accende il led verde ("Link") del connettore Ethernet.
Non so se possa risultare utile a qualcuno, comunque questi sono i due pin che ho collegato con un filo:

In questo modo posso leggere lo stato con una semplice digitalRead(A0), comunque per ora sto facendo un po' di test, spero che non ci siano problemi (ci vedete controindicazioni?).

PS: Non insultatemi, lo so che è una "porcata" ma è temporanea, spero, perché a breve vedrò se togliere del tutto la shield (peraltro la SD neanche mi serve) per usare una semplice board con solo W5500. Il problema è nelle connessioni da dover fare con 6 cavetti, più lo spazio a disposizione: la scatola che conterrà questo aggeggio dovrebbe essere più piccola possibile. Altrimenti quella board di Keyestudio, che mi "risparmierebbe" anche uno "strato" di shield visto che integra Arduino UNO ed Ethernet.
Vedremo.

Perché non usare un piccolo Arduino della serie MKR con l'apposita shield Ethernet?

L'ingombro è minimo ed utilizza il W5500 :wink:

Oppure, ancora più compatto, un ESP32 con il modulino Ethernet :slight_smile:

O tutto su un unica board :wink:

Guglielmo

Beh se devo usare un modulino W5500 ce ne sono tanti già per la UNO, senza cambiare piattaforma (tra l'altro non posso usare il wifi, quindi ESP32 sarebbe "sprecato", perché devo usarlo su una rete cablata, di fatto devo ricevere segnalazioni di movimento da una telecamera e con questi attivare un allarme tramite relè).

Questa è invece interessante (anche senza usare il Wifi), grazie.
Ma a quel punto sarebbe equivalente a QUESTA di Keyestudio, ad un costo (confronto quello italiano, non direttamente da AliExpress chem, come sai, non apprezzo...) molto simile ma che contiene tutto quello che servirebbe.

Ma nel frattempo la "porcata" :wink: ossia quel filo verso il pin A0, sembra per ora funzionare: qualcuno ci vede controindicazioni di qualunque tipo?

Piuttosto è l'Arduino Uno che per molti compiti è tagliato fuori!

Ad esempio, non so se sia questo il caso, ma se devi usare la tua board per accedere a qualche servizio online, l'impossibilità per una Uno di instaurare una connessione HTTPS ti preclude l'accesso a molte risorse.

Francamente, se ad oggi dovessi mettere in piedi un progetto che prevede un qualche tipo di connettività, con tutte le alternative che ci sono, la piattaforma AVR@8 bit è l'ultimissima che prenderei in considerazione.

Lo so, e concordo, ma no, per questo progettino non serve fare accesso a nessun servizio online perché lavorerà in locale (come dicevo, serve solo per fare da "ponte" tra una telecamera IP, che manda un POST http, ed un impianto di allarme, allarmando una zona tramite relè).

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.