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個
という仕様みたいです。
現状ではとりあえず、EeePCにTomcatを入れて、特定のURLにアクセスすると上記クラスを呼び出し
WOLを行うようにしています。
本当は、VPN経由でWOLできるバッファローのWZR-HP-G300NHでもよかったんですが、
やっぱり携帯から手軽にWOLしてmobile2pcって流れを実現したいし、WZR-HP-G300NHはファームが怪しいらしいしってことで、
今回はこのような処置でしのいでいます。
セキュリティ面は近いうちに強化していきます。