Java:WakeOnLanでPC起動

2010年11月24日 22時36分 Java • Tags: ,



同じネットワーク上の別のパソコンを起動する方法としてWake On LANという仕組みがあります。これはWake On LANに対応したコンピュータ(BIOS,LANカード)に対し、マジックパケットという一定の規則に則ったデータを送信することにより、停止したコンピュータを起動することができます。詳しいことは以下のサイトを参考にしてください。

本記事ではJavaのWakeOnLan実装を説明します。JavaはJava1.4.2準拠です。

■マジックパケットの作成

Wake On LANで起動したいコンピュータに対し送信するデータをマジックパケットといいます。マジックパケットはブロードキャストアドレス「FF:FF:FF:FF:FF:FF」+起動コンピュータのMACアドレス×16のデータのことです。たとえば起動するコンピュータにLANカードのMACアドレスが「12:34:56:78:90:AB」の場合は、マジックパケットのイメージは以下のようになります。

FF:FF:FF:FF:FF:FF 12:34:56:78:90:AB 12:34:56:78:90:AB 12:34:56:78:90:AB
12:34:56:78:90:AB 12:34:56:78:90:AB 12:34:56:78:90:AB 12:34:56:78:90:AB
12:34:56:78:90:AB 12:34:56:78:90:AB 12:34:56:78:90:AB 12:34:56:78:90:AB
12:34:56:78:90:AB 12:34:56:78:90:AB 12:34:56:78:90:AB 12:34:56:78:90:AB
12:34:56:78:90:AB

 
これをJavaにすると以下となります。

//MACアドレス
byte[] macAddress = new byte[]{(byte)0x12, (byte)0x34, (byte)0x56, (byte)0x78, (byte)0x90, (byte)0xAB};

//マジックパケットのバイト配列
//ブロードキャストアドレス(6バイト)+MACアドレス(6バイト)×16
byte[] magicPacket = new byte[6 + 6 * 16];

//ブロードキャストアドレス
for (int i = 0; i < 6; i++) {
    magicPacket[i] = (byte)0xFF;
}

//MACアドレス×16
for (int i = 1; i <= 16; i++) {
    //マジックパケットのバイト配列に6バイトずつMACアドレスをコピー
    System.arraycopy(macAddress, 0, magicPacket, i * 6, 6);
}

 

■マジックパケットの送信

マジックパケットはブロードキャストアドレスに対し送信します。この辺、私のネットワークの知識が少ないのであれですが、LANカードに給電されている状態で、ルータ配下に接続されていれば、ブロードキャストアドレスへの送信で、起動したいコンピュータはデータの受信が可能だと思います。ブロードキャストアドレスでなくとも、起動したいコンピュータにマジックパケットが届けば問題ありません。ポート番号は特に指定されておりません。

//ホスト
String host = "255:255:255:255";
//ポート番号
int port = 7010;
//マジックパケット
byte[] magicPacket = ...;

InetAddress inetAddress = null;
DatagramPacket packet = null;
DatagramSocket socket = null;
try {
    inetAddress = InetAddress.getByName(host);
    packet = new DatagramPacket(magicPacket, magicPacket.length, inetAddress, port);
    socket = new DatagramSocket();
    socket.send(packet);
} finally {
    if (socket != null && socket.isClosed() == false) {
        socket.close();                            
    }
}

 

■BIOSの設定

Wake On Lanでコンピュータを起動する場合、起動するコンピュータ(受信側)のBIOSで、Wake On Lanを有効にする必要があります。Wake On Lanの設定は各BIOSによって異なります。おそらくPOWERや電源と書かれているメニューで行うと思います。また家庭用のPCでは有効にできない場合もあるため注意してください。以下はASUSのM4A785TD-V EVOの設定画面です。


Power on From S5 By RingをEnabledに設定

■実装サンプル

Wake on Lanの実装サンプルのソースコードは以下からダウンロード可能です。

ご利用は自由です。コメントなどを削除して構いませんが、責任は負いません。また書いてる途中で力尽きたため、実行するためのサンプルは用意しておりませんが、APIとして利用できる形にしておりますので、ソースコード中のコメントを参考にしてください。



Leave a Reply

preload preload preload