Wake On LAN
Saat melihat tulisan di Codeproject tentang Wake On LAN (WOL) jadi teringat sewaktu jaman dulu saat sering bermain-main dengan jaringan. Ngerjain temen kantor saat akan pulang. Komputer sudah dimatikan terus hidup lagi dengan sendirinya... Bingung deh jadinya.. @@@ Hehehe... iseng banget kali yah :))
Dari tulisan tersebut aku jadi pengen nyoba sendiri bagaimana membuat program berbasis .NET untuk mengirimkan paket data ajaib yang dapat menghidupkan komputer dari jarak jauh. Prinsip dasar dari Wake On LAN sebenarnya sederhana. Bagaimana dan apa saja yang diperlukan untuk dapat menjalankan Wake On LAN akan dijelaskan sebagai berikut.
Kebutuhan Sistem
- Dibutuhkan papan induk (motherboard) yang mendukung WOL.
- WOL harus diaktifkan pada bagian Power Management BIOS.
- Bus PCI dan kartu jaringan dalam kondisi standby (papan induk yang menduung WOL saat dimatikan akan mencadangkan catu daya untuk bus PCI dan kartu jaringan untuk keperluan ini. Dengan catatan sumber listrik masih mencatu PSU [Power Suply Unit] komputer).
Bagaimana WOL dapat Bekerja
Pada waktu kompuetr tujian mati, kartu jatingan akan mendengarkan paket-paket yang melintasi jaringan. Bila menemukan paket khusus yang dinamakan Paket Ajaib (Magic Packet) maka akan diperiksa kebenaran paket tersebut. Jika paket tersebut valid dan MAC address yang disertakan cocok dengan MAC address pada kartu jaringan maka mothreboard akan mengirimkan sinyak power on kepada PSU untuk menghidupkan sistem.
Paket Ajaib
Paket Ajaib adalah frame yang dipancarkan melalui port 7 atau 9. Paket ini dapat dikirimkan melalui berbagai macam protokol (UDP, IPX) namun pada prakteknya banyak digunakan UDP. Data mengandung paket ajaib yang didefinisikan sebagai bilangan heksadesimal: FF FF FF FF FF FF diikuti enam belas perulangan MAC address komputer tujuan dan diikuti oleh empat atau enam byte kata sandi.
Class WOL
Kode dari class ini diambil dari Codeproject
using System;
using System.Collections;
using System.ComponentModel;
using System.Text.RegularExpressions;
using System.Net;
using System.Net.Sockets;
/* (c)2003 M.Kruppa */
namespace NetTools
{
public class MagicPacket
{
private const int HEADER = 6;
private const int BYTELENGHT = 6;
private const int MAGICPACKETLENGTH = 16;
private System.Net.IPAddress wolIPAddr = System.Net.IPAddress.Broadcast;
private int wolPortAddr = 7;
private IPEndPoint wolEndPoint;
private byte[] wolMacAddr;
private byte[] magicPacketPayload;
public MagicPacket(string macAddress)
{
wolMacAddr = Mac2Byte(macAddress);
magicPacketPayload = CreatePayload(wolMacAddr);
wolEndPoint = new System.Net.IPEndPoint(wolIPAddr, wolPortAddr);
}
public MagicPacket(string macAddress, string strPortAddress)
{
wolMacAddr = Mac2Byte(macAddress);
magicPacketPayload = CreatePayload(wolMacAddr);
wolPortAddr = Convert.ToInt16(strPortAddress, 10);
wolEndPoint = new System.Net.IPEndPoint(wolIPAddr, wolPortAddr);
}
public string macAddress
{
get
{
string strMacAdress = "";
for (int i=0; i<wolMacAddr.Length; i++)
{
strMacAdress += wolMacAddr[ i ].ToString("X2");
}
return strMacAdress;
}
}
protected static byte[] Mac2Byte(string strMacAddress)
{
string macAddr;
byte[] macBytes = new byte[BYTELENGHT];
//remove all non 0-9, A-F, a-f characters
macAddr = Regex.Replace(strMacAddress, @"[^0-9A-Fa-f]", "");
//check if it is now a valid mac adress
if (!(macAddr.Length == BYTELENGHT*2))
throw new ArgumentException("Mac Adress must be "+ (BYTELENGHT*2).ToString() +" digits of 0-9, A-F, a-f characters in length.");
string hex;
for (int i=0; i<macBytes.Length;i++)
{
hex = new String(new Char[] {macAddr[i*2], macAddr[i*2+1]});
macBytes[(i)] = byte.Parse(hex, System.Globalization.NumberStyles.HexNumber);
}
return macBytes;
}
protected static byte[] CreatePayload(byte[] macAddress)
{
byte[] payloadData = new byte[HEADER+MAGICPACKETLENGTH*BYTELENGHT];
for (int i=0; i<HEADER; i++)
{
payloadData[ i ] = byte.Parse("FF", System.Globalization.NumberStyles.HexNumber);
}
for(int i=0; i<MAGICPACKETLENGTH; i++)
{
for(int j=0;j<BYTELENGHT;j++)
{
payloadData[((i*BYTELENGHT)+j)+HEADER] = macAddress[j];
}
}
return payloadData;
}
public int WakeUp() {
return SendUDP(magicPacketPayload, wolEndPoint);
}
protected static int SendUDP(byte[] Payload, IPEndPoint EndPoint)
{
int byteSend;
//create a new client socket...
Socket socketClient = new Socket(EndPoint.AddressFamily, SocketType.Dgram, ProtocolType.Udp);
try
{
//open connection...
socketClient.Connect(EndPoint);
//send MagicPacket(TM)...
byteSend = socketClient.Send (Payload, 0, Payload.Length, SocketFlags.None);
}
catch (SocketException ex)
{
throw ex;
}
finally
{
socketClient.Close();
}
return byteSend;
}
}
}
Class tersebut digunakan untuk membangkitkan paket ajaib yang akan dikirimkan sebagai perintah WOL. Berikut contoh penggunaan class MagicPacket untuk menghidupkan komputer dengan MAC address 00-0C-F1-C7-41-79
NetTools.MagicPacket wol = new NetTools.MagicPacket(00-0C-F1-C7-41-79);
wol.WakeUp();
Mudah bukan?? Dengan menggunakan class ini dapat dibuat tool WOL berbasis command line atau ASP.NET.
Semoga tool ini membantu pekerjaan pemeliharaan sistem dan bukan untuk mengerjai teman yang tidak tahu teknologi.