使用 Java 获取本地计算机上的 MAC 地址
2022-09-01 15:05:23
我可以使用
ip = InetAddress.getLocalHost();
NetworkInterface.getByInetAddress(ip);
以获取mac地址,但是如果我在脱机计算机中使用此代码,则它不起作用。
那么,我该如何获取Mac地址?
我可以使用
ip = InetAddress.getLocalHost();
NetworkInterface.getByInetAddress(ip);
以获取mac地址,但是如果我在脱机计算机中使用此代码,则它不起作用。
那么,我该如何获取Mac地址?
使用Java 6+,您可以使用NetworkInterface.getHardwareAddress
。
请记住,计算机可以没有网卡,尤其是嵌入式或虚拟网卡。它也可以有多个。您可以使用NetworkInterface.getNetworkInterfaces()
获取所有网卡的列表。
有了我在这里找到的所有可能的解决方案和另一个回复,那么我将为我的解决方案做出贡献。您需要使用包含“ip”或“mac”的字符串指定参数,具体取决于您需要检查的内容。如果计算机没有接口,则它将返回包含 null 的字符串,否则将返回包含您请求的内容(IP 地址或 mac)的字符串。
如何使用它:
System.out.println("Ip: " + GetNetworkAddress.GetAddress("ip"));
System.out.println("Mac: " + GetNetworkAddress.GetAddress("mac"));
结果(如果计算机有网卡):
Ip: 192.168.0.10
Mac: 0D-73-ED-0A-27-44
结果(如果计算机没有网卡):
Ip: null
Mac: null
代码如下:
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Enumeration;
public class GetNetworkAddress {
public static String GetAddress(String addressType) {
String address = "";
InetAddress lanIp = null;
try {
String ipAddress = null;
Enumeration<NetworkInterface> net = null;
net = NetworkInterface.getNetworkInterfaces();
while (net.hasMoreElements()) {
NetworkInterface element = net.nextElement();
Enumeration<InetAddress> addresses = element.getInetAddresses();
while (addresses.hasMoreElements() && element.getHardwareAddress().length > 0 && !isVMMac(element.getHardwareAddress())) {
InetAddress ip = addresses.nextElement();
if (ip instanceof Inet4Address) {
if (ip.isSiteLocalAddress()) {
ipAddress = ip.getHostAddress();
lanIp = InetAddress.getByName(ipAddress);
}
}
}
}
if (lanIp == null)
return null;
if (addressType.equals("ip")) {
address = lanIp.toString().replaceAll("^/+", "");
} else if (addressType.equals("mac")) {
address = getMacAddress(lanIp);
} else {
throw new Exception("Specify \"ip\" or \"mac\"");
}
} catch (UnknownHostException ex) {
ex.printStackTrace();
} catch (SocketException ex) {
ex.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
}
return address;
}
private static String getMacAddress(InetAddress ip) {
String address = null;
try {
NetworkInterface network = NetworkInterface.getByInetAddress(ip);
byte[] mac = network.getHardwareAddress();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < mac.length; i++) {
sb.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : ""));
}
address = sb.toString();
} catch (SocketException ex) {
ex.printStackTrace();
}
return address;
}
private static boolean isVMMac(byte[] mac) {
if(null == mac) return false;
byte invalidMacs[][] = {
{0x00, 0x05, 0x69}, //VMWare
{0x00, 0x1C, 0x14}, //VMWare
{0x00, 0x0C, 0x29}, //VMWare
{0x00, 0x50, 0x56}, //VMWare
{0x08, 0x00, 0x27}, //Virtualbox
{0x0A, 0x00, 0x27}, //Virtualbox
{0x00, 0x03, (byte)0xFF}, //Virtual-PC
{0x00, 0x15, 0x5D} //Hyper-V
};
for (byte[] invalid: invalidMacs){
if (invalid[0] == mac[0] && invalid[1] == mac[1] && invalid[2] == mac[2]) return true;
}
return false;
}
}
更新 02/05/2017: 感谢 @mateuscb 在帖子上 如何确定 Java 中的 Internet 网络接口 不幸的是,之前没有对该帖子获得任何支持,但他为此更新做出了贡献。
该方法已改进为跳过虚拟机网卡(最常用的 VM 软件)