usare arduino per fare un ping in LAN, è possibile?

ciao a tutti,
con un qualsiasi modello di arduino e relativo Ethernet shield sarebbe possibile fare un ping ad un determinato indirizzo ip ??
se si, qualcuno conosce qualche programmino già fatto da utilizzare o da cui prendere spunto ?

grazie
Piero

Perche no, bisogna vedere però che precisione raggiungi adoperando un Arduino e un Ethernet shield.

Si è possibile, ma dato che hai scritto qualsiasi arduino, non ha senso copiarti il software, già sulla DUE non funzionerebbe.

comunque la lib più usata è ICMPPing.h
ciao

ciao ho scritto qualsiasi arduino, perchè dovendolo comprare comprerei quello che si presta meglio a fare il ping in LAN...immaginiamo che io voglia usare arduino UNO.
carico la lib ICMPPing.h e compro Ethernet shield che vada bene per il mio arduino e poi ci carico il programma, giusto?

il problema è il programma...
ho trovato in rete il seguente codice che immagino possa fare al caso mio! mi aiutate a capire cosa fa ed eventualmente a modificarlo??
L'indirizzo 74,125,26,147 presente nel codice di esempio è l'indirizzo da pingare? quindi dovrei sostituire questo ip copn quello che voglio pingare io!? e poi tutto il resto...cosa fa?

PS come è facile capire sono all'inizio.

grazie

codice:

/*
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>

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; // max address for ethernet shield
byte ip[] = {192,168,2,177}; // ip address for ethernet shield
IPAddress pingAddr(74,125,26,147); // 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()
{
 ICMPEchoReply echoReply = ping(pingAddr, 4);
 if (echoReply.status == SUCCESS)
 {
   sprintf(buffer,
           "Reply[%d] from: %d.%d.%d.%d: bytes=%d time=%ldms TTL=%d",
           echoReply.data.seq,
           echoReply.addr[0],
           echoReply.addr[1],
           echoReply.addr[2],
           echoReply.addr[3],
           REQ_DATASIZE,
           millis() - echoReply.data.time,
           echoReply.ttl);
 }
 else
 {
   sprintf(buffer, "Echo request failed; %d", echoReply.status);
 }
 Serial.println(buffer);
 delay(500);
}

Beh, quelle righe sono anche commentate, mi pare semplice capire cosa siano:

byte ip[] = {192,168,2,177}; // ip address for ethernet shield
IPAddress pingAddr(74,125,26,147); // ip address to ping

Il resto del codice semplicemente effettua il ping e stampa i risultati. Però se non sei in grado di capirlo credo sia meglio che ti soffermi un po' sullo studio del C e di Arduino.

ho scritto qualsiasi arduino, perchè dovendolo comprare comprerei quello che si presta meglio a fare il ping in LAN...immaginiamo che io voglia usare arduino UNO.

Una UNO va bene se devi fare solo il ping di un IP e basta, ti resta circa 10-12k di ram per fare altro, tenendo conto che quel ping impegna il programma per 1-2 secondi che dipende dal server.

piero54:
il problema è il programma...

Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare ( pulsante </> ).
Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.

grazie per le risposte!
lo so che sarebbe meglio studiarsi un po' ci C per fare e capire meglio, ma occorre tempo e in tutta onestà ne ho poco, e vorrei realizzare questo circuito che mi faccia un ping...poi con il tempo pian piano approfondirò!
Non è possibile avere un vostro aiuto per iniziare?

qst 3 righe di codice:

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; // max address for ethernet shield
byte ip[] = {192,168,2,177}; // ip address for ethernet shield
IPAddress pingAddr(74,125,26,147); // ip address to ping

pur non conoscendo il C credo di averle capite!

ma poi:

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);
}

cosa serve?credo che richiama comandi o altro dalla libreria... ma detto in parole semplici cosa avviene?

poi il ciclo if -else mi sembra di capire che stampa/mostra i risultati del ping (data..TTL..ecc) se è avvenuto con successo
ELSE
stampa i dati di "errore"

mi sono avvicinato???

quindi credo che se utilizzo qst codice modificando l'if-else, la cosa potrebbe andare!
io nell'if-else farei in modo che se il ping avviene con successo porta a livello logico alto una determinata uscita dell'arduino ELSE ne porta un'altra!
tutto qui!

forse chiedo troppo, non so.. ma spero in un vostro aiuto!

ciao e grazie comunque

io nell'if-else farei in modo che se il ping avviene con successo porta a livello logico alto una determinata uscita dell'arduino ELSE ne porta un'altra!

si, più che modificare serve aggiungere qualche istruzione dentro l'IF e dentro l'ELSE

Ethernet.begin(mac, ip); // inizializza la scheda ethernet con i parametri dichiarati sopra
Serial.begin(9600); // inizializza la seriale a 9600 baud
se intendi aggiungere uscite dovrai nel setup inizializzare anche i pin interessati

se vuoi sapere cosa fanno le altre linee di codice devi studiarti l'Header ICMP

Se devi pingare un IP locale, quel delay 500 può essere anche portato a 200-300, se devi pingare un server remoto quel 500 potrebbe darti un errore facendoti credere che il server remoto non è online, quando magari serve solo più tempo, pertanto va aumentato

ok grazie mille, inizio ad avere le idee piu' chiare...
studierò il contenuto del link sull'Header ICMP per capirne un po' di piu', e nel frattempo ti pongo un'altra(spero l'ultima) domanda....
il delay 500 che mi suggerisci di diminuire o aumentare in base all'ip che voglio pingare, è il tempo che arduino dopo aver fatto tutto attende per poi ripingare?? quindi aumentando o diminuendolo modifico il "clock" del ping??
mi sono spiegato?

grazie

Fa entrambe le cose.
Il programma come lo vedi lancia un pacchetto ma non esiste un tempo di attesa di risposta, esiste solo un tempo per ripingare

ES: io ho 10 persone davanti con ciascuno un suo nome, comincio col fare una domanda al primo e gli do mezzo secondo per rispondermi, poi chiamo il secondo dando sempre mezzo secondo e così via..... il primo è un tipo sveglio e ha la risposta pronta, il secondo c'è ma ci pensa un attimo prima di risponderti però è fuori tempo quindi per me non è presente

questo era un esempio di ping sulla rete locale lan per rintracciare gli IP connessi e i rispettivi MAC
http://forum.arduino.cc/index.php?topic=237747.0;nowap

se pingo i miei ip della rete locale con un delay di 50 non me ne trova nemmeno uno, se li pingo con un 200 qualcuno lo salta, se li pingo con 1000 li trova tutti ma ci sta 255 secondi a fare 192.168.2.0 to 192.168.2.255, nonstante ho notato che mi trova tutte le macchine connesse via cavo lan, ma quando pinga uno smartphone su wifi a volte 1000 non è sufficiente. Insomma dipende da cosa devi fare.

ciao

vorrei pingare 2 ip della mia lan, ed esattamente gli ip (fissi) assegnati ai miei telefonini, e se entrambi assenti un pieino va a livello logico alto eccitandomi un relè.
Se
almen o uno dei due ping è presente (almeno per ora) non deve fare nulla! poi dopo un tempo prestabilito o anche subito dopo deve ripetere il ping, e così via...
credo che con il codice che ho trovato si possa fare, vero??
Nell'if inserisco il codice necessario per portare l'uscita voluta a livello logico alto e imposto un tempo di delay alto (1000)
o sto sbagliando?

Gli argomenti vanno trattati con schede alla mano sul banco prove ... arduino e la ethernet li possiedi? quello che dovevi sapere l'hai saputo, non ti resta che applicarlo e vedere

ciao

Per "vedere" i tempi di risposta si può anche preventivamente fare dei test con gli appositi programmi per pc, tipo net scan della softperfect, lo uso ormai da tempo. Una delle informazioni è appunto il tempo di risposta dell'apparato in millisecondi.

No.. Arduino non è un PC, deve svolgere alcune funzioni che fa un processore da 2 Ghz. Purtroppo il w5100 ha una schedina sotto da 16 mhz che non è un processore ma un MCU

Io intendevo lato pc, ovvero netscan preventivo, verifica del "ping time" e conseguente modifica dello sketch per via sperimentale.

Forse per quel che vuoi fare tu è meglio un Raspberry Pi o simile. Lì hai un OS con il comando ping già pronto e dotato di tutte le funzionalità, e (ad esempio) Python per scriptare tutto quel che serve e comandare i pin GPIO.

grazie a tutti per il vostro intervento , credo che farò quello che dice Pablos:
attrezzatura alla mano, inizio a provare!!
mi manca la scheda ethernet che arriverà presto, ma ho già un piccolo problema con arduino.
HO preso arduino uno(SCHEDA ARDUINO R3 UNO OEM COMPATIBILE CLONE ATMEGA328P)
ho scaricato i drive forniti dal venditore ma quando provo a caricare un programma ho il segunete errore:

Arduino:1.6.5 (Windows 7), Scheda:"Arduino/Genuino Uno"

Lo sketch usa 1.030 byte (3%) dello spazio disponibile per i programmi. Il massimo è 32.256 byte.

Le variabili globali usano 9 byte (0%) di memoria dinamica, lasciando altri 2.039 byte liberi per le variabili locali. Il massimo è 2.048 byte.

avrdude: stk500_getparm(): (a) protocol error, expect=0x14, resp=0xff

avrdude: stk500_getparm(): (a) protocol error, expect=0x14, resp=0xff

avrdude: arduino_read_sig_bytes(): (a) protocol error, expect=0x10, resp=0xff

avrdude: error reading signature data for part "ATmega328P", rc=-3

avrdude: error reading signature data, rc=-1

Problema di caricamento sulla scheda. Guarda http://www.arduino.cc/en/Guide/Troubleshooting#upload per suggerimenti

Questo report potrebbe essere più ricco
di informazioni con
"Mostra un output dettagliato durante la compilazione"
abilitato in "File > Impostazioni"

suggerimenti? consigli su come poter fare? o dvo semplicemtne buttarlo e comprarne uno nuovo?

grazie

Probabilmente l'installazione dei driver è fallita. Hai "icone gialle" in gestione dispositivi?

no! sembra essere tt ok in gestione dispositivi... :frowning: :frowning: