JAVAからマジックパケット送信(Wake on lan)

Wake On Lan(WOL)非対応のコレガ(Corega)のルーターで無理矢理WOL - 半端な日記
この記事で使ってたルーター無線LANの調子が最近悪くなってきたので、
新しくルーターを買い換えました。
買ったのは、またしてもコレガのCG-WLRGNXB。
近所のヤマダ電機で4980でした。

またコレガにしたのは、上記リンクの記事と同様のやり方で無理やりWOLできるかもと淡い期待を抱いたからなのですが・・・。
しかし、CG-WLRGNXBの設定画面では、JavaScriptをOFFにすることでブロードキャストアドレスの設定まではできましたが、
いざパケットを送信してみると届いていないようです。。。

仕方がないので、あまっているEeePC901を常時稼動し、踏み台にすることで外部からのWOL環境を構築することにしました。
まず、マジックパケット送信用の以下のクラスを作成

package wol;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;

public class WakeOnLan {
	public static void main(String[] args){
		//個々の環境のMACアドレスとIPアドレスを指定
		new WakeOnLan("AA-AA-AA-AA-AA-AA", "192.168.1.255");
	}
	
	
	public WakeOnLan(String macAddress, String ipAddress){
		sendMagickPacket(macAddress, ipAddress);
	}
	
	private void sendMagickPacket(String macAddress, String ipAddress){
		try{
			InetSocketAddress isAddress = new InetSocketAddress(ipAddress, 9);
			byte[] packetByte = getMagickPacket(macAddress);
			DatagramPacket dPacket = new DatagramPacket(packetByte, packetByte.length, isAddress);
			new DatagramSocket().send( dPacket );
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	
	private byte[] getMagickPacket(String macAddress){
		byte[] packet = new byte[102];
		int index = 0;
		for(int i = 0; i < 6; i++){
			packet[index++] = (byte)0xff;
		}
		
		byte[] macAddressByte = getMacAddressByte(macAddress);
		
		for(int i = 0; i < 16; i++){
			packet[index++] = macAddressByte[0];
			packet[index++] = macAddressByte[1];
			packet[index++] = macAddressByte[2];
			packet[index++] = macAddressByte[3];
			packet[index++] = macAddressByte[4];
			packet[index++] = macAddressByte[5];
		}
		
		return packet;
	}
	
	private byte[] getMacAddressByte(String macAddress){
		String[] macArray = macAddress.split("-");
		if(macArray.length != 6){
			throw new RuntimeException("MACアドレスが不正");
		}
		
		byte[] macAddressByte = new byte[6];
		for(int i = 0; i < macArray.length; i++){
			macAddressByte[i] = (byte)Integer.parseInt(macArray[i], 16);
		}
		
		return macAddressByte;
	}
}

内容は、引数で指定したIP(ブロードキャストアドレス)に対してマジックパケットUDP送信しているだけです。
マジックパケットの仕様は以下からダウンロードできます。
http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/20213.pdf
要は、
・最初にFFを6個
・次に、起動させたいマシンのMACアドレスを16個
という仕様みたいです。

現状ではとりあえず、EeePCTomcatを入れて、特定のURLにアクセスすると上記クラスを呼び出し
WOLを行うようにしています。

本当は、VPN経由でWOLできるバッファローのWZR-HP-G300NHでもよかったんですが、
やっぱり携帯から手軽にWOLしてmobile2pcって流れを実現したいし、WZR-HP-G300NHはファームが怪しいらしいしってことで、
今回はこのような処置でしのいでいます。
セキュリティ面は近いうちに強化していきます。