ゆーたんのつぶやき

株式会社ノークリサーチにてIT関連のシニアアナリストとして活動しています。

MustangでMacアドレス取得



JavaSE6(Mustang)ではNetworkInterfaceクラスが機能強化されて
Macアドレスも簡単に取得できるようになったのをご存知の方も
多いかと思います。
これまではipconfigで何とかしていたケースが多いと思いますが
先日IPアドレス関連のコードを書く機会があったので、ついでに
MustangのNetworkInterfaceクラスをあらためて試してみました。


走り書きのコードですが、getHardwareAddress()の呼び出し一発で
従来よりもずっと楽にMacアドレスが取得できるようになってます。
それだけでなく、新たにInterfaceAddressクラスが追加されました。
こちらを使うと、下記コードのようにブロードキャストアドレスや
サブネットマスクも簡単に取得できます。
実行結果はこんな感じ


Macアドレス: null
IPアドレス: /127.0.0.1
ブロードキャストアドレス: /127.255.255.255
サブネットマスク長: 8

Macアドレス: 00-A0-B0-60-CE-85
IPアドレス: /192.168.129.149
ブロードキャストアドレス: /127.168.129.255
サブネットマスク長: 24

ループバックアドレスが邪魔な場合には、isLoopback()
でチェックしてはねてしまっても良いかと思います。


MacアドレスIPアドレスの取得はライセンス管理やセキュリティ上
必要なクライアントPCの識別などといった地味な場面で使うことが
意外と多いですが、地味なのに少々手間が掛かるのが悩みでした。


Mustangでは他にもConsoleクラス、Desktopクラス、TrayIconクラス
といったOSのネイティブな機能にアクセスするための便利なクラス
が追加されています。これまでRuntimeによるexe起動やJNIで苦労を
していた方(ボクもその一人^^)にとってはMustangのこうした機能は
一通りチェックしてみる価値があるのではないかと思います。

import java.io.*;
import java.net.*;
import java.util.*;

public class NICTest{

private static final char[] hexchar =
{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
private static final Console console = System.console();

private String getMacAddrString(byte[] macaddr){

if(macaddr == null){
return null;
}

StringBuilder result = new StringBuilder();
for(byte octet : macaddr){
int ioctet = (octet < 0) ? (octet+256) : octet;
int upper = ioctet/16;
int lower = ioctet%16;
result.append(hexchar[upper]);
result.append(hexchar[lower]);
result.append('-');
}
return result.toString().substring(0, result.length()-1);
}

public void displayNICInfo() throws SocketException{

Enumeration enuNics = NetworkInterface.getNetworkInterfaces();
for(NetworkInterface nic : Collections.list(enuNics)){

console.printf("Macアドレス: %s%n", getMacAddrString(nic.getHardwareAddress()));

List lstAddrs = nic.getInterfaceAddresses();
for(InterfaceAddress addr : lstAddrs) {
console.printf("IPアドレス: %s%n", addr.getAddress());
console.printf("ブロードキャストアドレス: %s%n", addr.getBroadcast());
console.printf("サブネットマスク長: %d%n", addr.getNetworkPrefixLength());
console.printf("%n");
}
}
}

public static void main(String args[]){

NICTest test = new NICTest();
try{
test.displayNICInfo();
}
catch(SocketException ex){
ex.printStackTrace();
}
}
}