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. ![]()
\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?
