Wake On LAN e uPLibrary : accendi il PC da remoto

Molto spesso può essere utile riuscire ad accendere il nostro PC da remoto, sia che si tratti della rete locale di casa o aziendale sia che si tratti di utilizzare Internet per farlo. Sappiamo che è fondamentalmente semplice fare l’operazione inversa di spegnimento una volta che abbiamo il controllo del PC … ma come fare ad accenderlo ?

Per questo scopo, ci viene in aiuto una funzionalità di cui oggi sono dotati tutti i PC moderni sulla propria scheda di rete che è la Wake On LAN (nota come WOL). Abilitandola opportunamente nel BIOS ed attivandola anche nelle impostazioni della scheda di rete dal sistema operativo, si fa in modo che allo shutdown la scheda di rete rimanga alimentata (PC con alimentazione ATX) e quindi in ascolto del traffico che c’è sulla rete. Ovviamente, nell’ambito del modello ISO-OSI ci troviamo nel livello Data Link Layer (livello 2), quindi dobbiamo ragionare in termini di MAC address, in quanto lo stack TCP/IP è uno strato software che viene gestito dal sistema operativo, che ovviamente non abbiamo a disposizione a PC spento.

La “magia” che permette l’accensione del PC è proprio dovuta ad uno pacchetto di byte che va trasmesso in rete e che prende appunto il nome di “Magic Packet”.

6560.magicpacket_456100E4

Esso è caratterizzato da 102 bytes complessivi di cui, i primi 6 sono tutti 0xFF seguiti dal MAC address del PC che vogliamo far accendere e ripetuto 16 volte. Come mai così tante ripetizioni del MAC address ? Basti pensare che una scheda di rete è in ascolto di tutti i pacchetti che passano ma li scarta quando non è il destinatario. Se il MAC address fosse inserito una sola volta nel pacchetto, sicuramente avremmo la possibilità che un normale pacchetto di traffico (download di un file, email, …) abbia una sequenza di byte al suo interno molto simile ad essa ed a quel punto il PC lo interpreterebbe erroneamente come un “Magic Packet” e si avvierebbe. Ripetendo 16 volte il MAC address si riduce drasticamente (fondamentalmente a zero) questa possibilità.

La migliore modalità per trasferire il pacchetto è quella di utilizzare il protocollo UDP in broadcast, in quanto non abbiamo alcun bisogno dell’handshake del TCP e non potremmo nemmeno utilizzarlo correttamente considerando che il PC destinazione è spento. Nel momento in cui, il PC “ascolta” questa sequenza di 102 byte e riconosce al suo interno il suo MAC address ecco che … la magia si avvera … il PC si accende !

Prendendo spunto da questo articolo di Marco Lai, “Wake on Lan accendere il computer con Arduino ethernet”, non poteva ovviamente mancare la mia implementazione per il .Net Micro Framework all’interno della libreria uPLibrary (arrivata alla versione 1.7.0.0).

All’interno del namespace relativo al Networking, uPLibrary.Networking, ho aggiunto la classe statica Wol che espone l’unico metodo statico Wake(), il quale prevede come unico parametro un array di byte che rappresenta il MAC address della scheda di rete del PC da avviare.

Utilizzando una scheda Netduino, possiamo realizzare una semplice applicazione che avvia il PC alla pressione dello switch presente sulla board stessa.

public class Program
{
    private static InterruptPort sw;

    public static void Main()
    {
        // write your code here
        sw = new InterruptPort(Pins.ONBOARD_SW1, true,
                                Port.ResistorMode.Disabled,
                                Port.InterruptMode.InterruptEdgeHigh);
        sw.OnInterrupt += new NativeEventHandler(sw_OnInterrupt);

        Thread.Sleep(Timeout.Infinite);
    }

    static void sw_OnInterrupt(uint data1, uint data2, DateTime time)
    {
        Wol.Wake(new byte[] { 0x00, 0x26, 0x22, 0xA2, 0xF2, 0xD3 });
    }

}

Ovviamente, il tutto è disponibile su Codeplex ed è stato anche aggiornato nella Nuget Gallery!

Ricordo che per il corretto funzionamento, è necessario il supporto del Wake On LAN da parte della scheda di rete del vostro PC ed una relativa opportuna configurazione nel BIOS (in alcuni casi anche alcune impostazioni nel driver del sistema operativo).

Leave a comment