V tomto článku si lehce nastíníme, co to Wake on Lan je a napíšeme si v Javě třídu, díky které budeme moci Wake on Lan používat. Ukážeme si jednotlivé kroky, jak magický paket vytvořit, odelsat pomocí protokolu UDP a na konci si budete moci stáhnout celý ukázkový vypracovaný program.
Co to tedy Wake on Lan je? Jak již z názvu vyplývá, jedná se o technologii, která nám umožňuje zapínat vypnutý počítač pomocí počítačové sítě. První návrh Wake on Lan technologie vytvořila firma IBM v roce 1997. Wake on Lan se poté začal poměrně rozšiřovat, ale zpočátku bylo potřeba, aby základní deska na sobě měla 3-pinový WAKEON-LINK konektor, který se propojoval se síťovou kartou (do PCI 2.2). V dnešní době (již několik zpět) mají téměř všechny základní desky integrované síťové karty, které mají podporu Wake on Lan již integrovanou. Jedinou nustností je mít probouzení po síti zapnuté v SETUPu.

Pokud tedy máme na cílovém počítači povolený Wake on Lan v SETUPu BIOSu, můžeme se pustit do damotné implementace do jazyka Java.
Jen ještě zmíním, že pokud chceme PC vzdáleně spustit, musíme na něj poslat tzv. magický paket. Tento magický paket má snadné složení. Začíná 6x se opakujícími (hex) FF bajty a následuje 16x MAC adresa cílového počítače.
Implementace Wake on Lan do Javy
Předem upozorním, že budu popisovat jen základní postup, jak magický paket vytvořit a poslat. Budou tedy chybět definice některých proměnných a tak podobně. Proto bude vhodné řídit se především této hotové třídě Jwol.java. Tato třída má zapsaný konstruktor tak, že když vytváříme její objekt, musíme mu předat 2 řetězce - první musí obsahovat broadcast IP adresu dané sítě a druhý MAC adresu počítače, který chceme spustit.
Nejprve budeme muset z řetězce, v kterém máme MAC adresu získat pole jednotlivých bajtů. Dejme tomu, že řetězec, v kterém máme MAC adresu má název s (String s = "00:0F:DF:D1:B1:0F";).
String[] pole = s.toUpperCase().split(":");
for(int i = 0;i < 6;i++) {
mac[i] = (byte) Integer.parseInt(pole[i], 16);
}
Tak, nyní máme pole bajtů mac, kde máme jednotlivé bajty MAC adresy.
Nyní budeme muset nadefinovat proměnnou s polem bajtů, v které bude již celý datový obsah paketu.
byte[] byty = new byte[6 + 16 * mac.length];
Proč právě tato velikost? To je snadné. Magický paket má takový obsah. Začíná šesti FF bajty a poté se 16x opakuje MAC adresa cílového počítače.
Nyní budeme muset sestavit celý obsah paketu.
for(int i = 0; i < 6;i++) {
byty[i] = (byte) 0xff;
}
for (int i = 6; i < byty.length; i += mac.length) {
System.arraycopy(mac, 0, byty, i, mac.length);
}
Jak jsme si již řekli před chvílí. První cyklus naplní prvních šest "plných" bajtů a druhý cyklus 16x nakopíruje bajty naší MAC adresy.
Teď musíme vytvořit datový rámec (datagram), který následně budeme odesílat.
DatagramPacket packet = new DatagramPacket(byty, byty.length, ip, port);
Při vytváření instance třídy DatagramPacket musíme podle konstruktoru této třídy předat pole bajtů, velikost tohoto pole, IP adresu (u nás broadcast, budeme posílat data na něj) a cílový port.
V tuto chvíli schází jen paket odeslat.
DatagramSocket soket = new DatagramSocket();
soket.send(packet);
soket.close();
Jen vytvoříme objekt třídy DatagramSocket, pomocí metody send paket odešleme a socketové spojení ukončíme.
Zde ještě můžete stáhnout celou třídu - Jwol.java.
Zde můžete stahnout funkční konzolovou aplikaci v Javě k spuštění počítače - wol.jar
Použití programu wol.jar -> java -jar wol.jar [broadcast IP] [MAC adresa]
