Java 获取MAC地址,纯Java 的解决方案,在JDK1.7 上通过
其中,有这么几个问题:
1. 当没有联网的时候,ip显示为127.0.0.1,这时通过NetworkInterface.getByInetAddress是无法获取的。需要通过
NetworkInterface.getNetworkInterfaces()
来获取。
2. 对于笔记本,MAC地址分为以太网卡MAC和无线MAC。
public static String getMacAddress(String ipAddr) {
String macAddr = "";
if (ipAddr.equals("127.0.0.1") || ipAddr.equals("localhost")) {
macAddr = getMACAddressFromNIF();
} else {
macAddr = getMACFromIP(ipAddr);
}
return macAddr;
}
private static String getMACFromIP(String ipAddr) {
String macAddress = "";
try {
// InetAddress address = InetAddress.getLocalHost();
InetAddress address = InetAddress.getByName(ipAddr);
/*
* Get NetworkInterface for the current host and then read the
* hardware address.
*/
NetworkInterface ni = NetworkInterface.getByInetAddress(address);
if (ni != null) {
byte[] mac = ni.getHardwareAddress();
if (mac != null) {
macAddress = transformMACtoHex(mac);
} else {
logger.info("Address doesn't exist or is not "
+ "accessible.");
}
} else {
logger.info("Network Interface for the specified "
+ "address is not found.");
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (SocketException e) {
e.printStackTrace();
} finally {
logger.info("MAC address is:" + macAddress);
}
return macAddress;
}
/*
* Extract each array of mac address and convert it to hexa with the
* following format 08-00-27-DC-4A-9E.
*/
private static String transformMACtoHex(byte[] mac) {
String macAddr;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < mac.length; i++) {
String form = String.format("%02X%s", mac[i],
(i < mac.length - 1) ? "-" : "");
sb.append(form);
}
macAddr = verifyMAC(sb.toString());
return macAddr;
}
private static String verifyMAC(String mac) {
if (mac != null) {
if (mac.startsWith("00-00-00-00-00")) {
logger.info("Not valid MAC address!");
return null;
} else {
return mac;
}
}
return null;
}
/**
* java获取客户端网卡的MAC地址
*
* @param args
* @throws SocketException
*/
public static void main(String[] args) throws SocketException {
getMACAddressFromNIF();
}
private static String getMACAddressFromNIF() {
StringBuilder macAddress = new StringBuilder();
Enumeration<NetworkInterface> interfaces;
try {
interfaces = NetworkInterface.getNetworkInterfaces();
//itereate
while (interfaces.hasMoreElements()) {
NetworkInterface nif = interfaces.nextElement();
String displayName=nif.getDisplayName();
logger.info(displayName + "\t\t"
+ nif.getName());
byte[] lBytes = nif.getHardwareAddress();
if (lBytes != null) {
String str = transformMACtoHex(lBytes);
if(str!=null){
macAddress.append(str).append("\n");
}
}
}
} catch (SocketException e) {
e.printStackTrace();
}
return macAddress.toString();
}