enc28J60 e Arduino (4)

by luca
19 comments

In questo articolo, vedremo come accendere un PC tramite la funzionalità di Wake on Lan e il nostro Arduino.
Tutte le schede di rete recenti supportano una funzionalità detta Wake on Lan, ovvero la possibilità di “risvegliare” il PC inviando un particolare comando via rete.

Requisiti

Vi sono due requisiti per poter utilizzare questa funzionalità:

  • se la scheda di rete non è integrata nella scheda madre, deve essere collegata a quest’ultima tramite un cavetto:

  • il supporto al WOL deve essere abilitato nel BIOS:

Un limite classico all’utilizzo del WOL è che la scheda di rete non è in grado di eseguire il risveglio se il PC si è spento per mancanza di corrente. In realtà molte schede madri recenti supportano anche questa eventualità con una apposita voce nella configurazione del BIOS:

Magic Packet

Il comando di wake viene impartito inviando sulla rete un particolare pacchetto, detto Magic Packet. Questo pacchetto viene ricevuto da tutti i dispositivi nella rete locale perché ha come MAC address di destinazione quello di broadcast (FF:FF:FF:FF:FF:FF). Al suo interno presenta sei bytes con valore FF, seguiti dal MAC address del PC da risvegliare ripetuto 16 volte.

Sebbene non siano importanti i protocolli superiori, per convenzione tale pacchetto viene inviato con protocollo UDP e porta di destinazione 7 o 9.

Arduino

[highlight color=”yellow”]NB: la libreria EtherCard presentava un bug nella gestione del Wake on LAN. Ho risolto il problema e la mia modifica è stata accettata nel repository ufficiale: assicuratevi quindi di scaricare l’ultima versione della libreria[/highlight]

Per inviare il comando di wake abbiamo a disposizione il metodo sendWol(), che richiede come parametro il MAC address del PC a cui il comando è destinato:

static byte targetmac[] = {0x00,0x1A,0x4B,0x38,0x0F,0x5C};
...
ether.sendWol(targetmac);

Come sempre, potete trovare un esempio completo nel repository GitHub dedicato a questo tutorial.

Utilizzando uno strumento di analisi del traffico in rete quale Wireshark, possiamo vedere che il pacchetto viene correttamente generato:

  • in rosso il MAC address broadcast di destinazione
  • in verde l’utilizzo dei protocolli IP e UDP
  • in azzurro il MAC address del PC di destinazione ripetuto 16 volte

Related Posts

19 comments

Arup 28 febbraio 2012 - 10:28

Nice work. Next would be interfacing an GPRS shield with the same Arduino so that remote wakeup can be achieved. Of course after PC powers on, we can use it and access files remotely using remote desktop software.

Reply
luca 28 febbraio 2012 - 10:38

Thanks Arup! It’s a good idea, a GSM shield has just been shipped to my home 😉 Stay tuned for a new blog post about it!

Reply
Gonzalo 7 marzo 2012 - 22:56

Great Job Luca , will work with wiz5100 ethernet shield?

Reply
luca 7 marzo 2012 - 23:06

Thanks Gonzalo,

no, it won’t work because W5100 chip is very different from ENC28J60… as it is the chip chosen for the “official” ethernet shield, you can find a lot of documentation on Playground.

Reply
Christian Leicht Jørgensen 11 aprile 2012 - 21:04

Thank you for this nice piece of code.
It’s a shame it doesn’t work on the W5100 chip.
Have some of you found a way to get it to work on the W5100 chip?

Reply
luca 12 aprile 2012 - 10:34

Hi Christian,

it seems WZ5100 does not supporto WOL functionality…
I found an article from Wiznet official blog about W5200 that adds WOL:

http://blog.wiznet.co.kr/w5200-arduino-ethernet-library

Reply
Tiry 2 ottobre 2012 - 21:15

thank you very much for correcting the library. I tried to fix it also, it is more useful now! Work fine with ENC2860 connected to Arduino. WOL ok for me. Thank’s again !

Reply
luca 2 ottobre 2012 - 22:04

Thanks!

Reply
lucadentella.it – Il blog in cinese ;) 10 ottobre 2012 - 13:43

[…] all’utente zcbzjx, il mio tutorial su come inviare pacchetti di Wake on Lan usando Arduino+enc28j60 è disponibile in lingua […]

Reply
gl 5 maggio 2013 - 17:17

when i try to upload i get a ethernet not declared message.. and nu upload to the arduino uno

i have the library in the correct folder?

using IDE 1.0.4

Reply
luca 7 maggio 2013 - 08:22

Hi! Did you follow this tutorial about how to install the library?

Reply
Francesco 21 maggio 2013 - 10:09

ciao,
interessante articolo.
io ho una scheda (non shield) con enc 28j60.
volevo fare un wake-on-lan però in modo che ricevendo un magic su porta 9 ad esempio dal router, mi spedisca un magic packet come nell’esempio contenente il MAC del pc che voglio accendere. Quindi su ricezione del pacchetto e non su pressione del tasto ‘w’
Inoltre non ho DHCP quindi dovrei impostare
IP, Subnet mask e Gateway. Come faccio?
Ma un elenco completo (con descrizione) delle primitive dentro a EtherCard dove lo trovo?
Grazie, ciao

Reply
luca 22 maggio 2013 - 09:37

Ciao Francesco

non ho capito bene la tua necessità: vuoi comandare il wake-on-lan da remoto? Ad es. pubblicando una pagina web da Arduino che puoi raggiungere via Internet con un pulsante “wake” che fa inviare il magic packet? In questo caso puoi combinare i miei due tutorial (wake on lan e accensione led da pagina web)

Reply
Clubbby 3 ottobre 2013 - 18:38

Thanks for this. I just had it in my head to make my media PC turn on over WOL along with an IR receiver waiting for a “Power” signal from our remote.

I already have several ENC28J60’s and thanks to you I know that I can use one for just this task (assuming the media PC supports WOL, will check when I get home).

Reply
Clubbby 7 ottobre 2013 - 23:58

I built this out yesterday and it works like a charm! Again, thanks.

Reply
enrico 29 aprile 2014 - 23:36

si puo ank fare via usb?

Reply
Landy 8 giugno 2014 - 12:53

I’m having trouble running this, even after downloading the library it reports errors. Could you help out?

Reply
luca 8 giugno 2014 - 20:06

Hi, which errors?

Reply
Angelo 26 febbraio 2017 - 11:24

Ciao Luca, ti scrivo perchè ho un problema che non riesco a risolvere e tu sicuramente avrai una soluzione.
Vorrei realizzare un progettino che oltre a pilotare dei relè connessi con Arduino Mega, mi faccia uno scan degli indirizzi IP fissi della mia rete LAN e mi torni come informazione tutti quelli che sono attivi e connessi.
Tutta la parte dei relè e delle informazioni l’ho risolta. Il problema è che quando cerco di utilizzare il PING per vedere cosa è connesso in LAN tutto il resto del programma non funziona più.
E’ come se vi fosse incompatibilià tra l’utilizzo di UDP e l’utilizzo di .
Dopo avere fatto ping ai vari indirizzi fissi, come facci a fare tornare la w5100 in posizione di ascolto?

grazie anticipatamente
Angelo

Reply

Leave a Comment

quattro − due =