« タブレット | Main | InternetExplorer7が起動しない? »

2007.01.05

JavaでWakeOnLAN

 WakeOnLANを利用してネットワーク内の端末を起動する場合は、マジックパケットを送りつける(実際にはネットワーク内のどこにいるか分からないのでブロードキャストすることになりますが)のですが、そのマジックパケットの正体は以下の通り。

0xff×6回+MACアドレス(6バイト)×16回の計102バイト

 それさえ分かればJavaででも簡単に実装できそう・・・ってなことで、作ってみました(笑)。なお、Java6を使うと、ブロードキャスト用のIPアドレスなんてのも簡単に取得できるようになったようです(InterfaceAddressクラスのgetBroadcast()メソッドでInetAddressオブジェクトを取得可能)。

 ソースは以下のような感じ。なお、package宣言やimport宣言は省略しています。また、コメントや例外処理もいい加減です(^^;;

public class WakeOnLan {
 private static final int DEFAULT_PORT_NUMBER = 1234;
 public static void main(String[] args) throws Exception {
  new WakeOnLan().wake(args[0], DEFAULT_PORT_NUMBER);
 }
 public void wake(String macaddress, int portnumber) throws IOException {
  byte[] data = createMagicPacketData(macaddress);
  List<InetAddress> bcaddress = getBroadcastAddress();
  for (int i=0; i<bcaddress.size(); i++) {
  new DatagramSocket().send(new DatagramPacket(data, data.length, bcaddress.get(i), portnumber));
  }
 }
 private byte[] createMagicPacketData(String macaddress) {
  byte[] data = new byte[102];
  for (int i=0; i<6; i++) { data[i] = (byte)0xff; }
  String[] m = macaddress.split("-");
  byte[] b = new byte[6];
  for (int i=0; i<6; i++) {
   b[i] = (byte)(Integer.parseInt(m[i], 16) & 0xff);
  }
  for (int i=6; i<102; i=i+6) {
   data[i ] = b[0];
   data[i+1] = b[1];
   data[i+2] = b[2];
   data[i+3] = b[3];
   data[i+4] = b[4];
   data[i+5] = b[5];
  }
  return data;
 }
 private List<InetAddress> getBroadcastAddress() throws SocketException {
  List<InetAddress> bcaddress = new ArrayList<InetAddress>();
  Enumeration<NetworkInterface> nis = NetworkInterface.getNetworkInterfaces();
  while (nis.hasMoreElements()) {
   NetworkInterface ni = nis.nextElement();
   List<InterfaceAddress> inas = ni.getInterfaceAddresses();
   for (int i=0; i<inas.size(); i++) {
    bcaddress.add(inas.get(i).getBroadcast());
   }
  }
  return bcaddress;
 }
}

wol.jarというファイルにエクスポートしていると仮定して、java -cp wol.jar WakeOnLan 11-22-33-44-55-66のような感じで実行すれば、指定したマシンが起動する・・・はずです。

|

« タブレット | Main | InternetExplorer7が起動しない? »

Java」カテゴリの記事

Comments

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/3959/13322811

Listed below are links to weblogs that reference JavaでWakeOnLAN:

« タブレット | Main | InternetExplorer7が起動しない? »