在Java中获取系统的MAC地址

我需要获取运行该程序的系统的mac地址。 但我无法做到这一点。

我正在编写以下代码:

public class App{ public static void main(String[] args){ InetAddress ip; try { ip = InetAddress.getLocalHost(); System.out.println("Current IP address : " + ip.getHostAddress()); NetworkInterface network = NetworkInterface.getByInetAddress(ip); byte[] mac = network.getHardwareAddress(); System.out.print("Current MAC address : "); StringBuilder sb = new StringBuilder(); for (int i = 0; i < mac.length; i++) { sb.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : "")); } System.out.println(sb.toString()); } catch (UnknownHostException e) { e.printStackTrace(); } catch (SocketException e){ e.printStackTrace(); } } } 

我得到以下结果:

  Current IP address : 14.96.192.202 Current MAC address : 

我没有得到MAC地址,它是空白的。

我从这里看到了这个例子

如果您考虑多个接口,并且有一些空MAC地址(我在安装了VMWare的Windows 7上运行Java 7(所以我有一些虚拟网络适配器)),那么这段代码似乎有效:

 public static void main(String[] args) { try { InetAddress ip = InetAddress.getLocalHost(); System.out.println("Current IP address : " + ip.getHostAddress()); Enumeration networks = NetworkInterface.getNetworkInterfaces(); while(networks.hasMoreElements()) { NetworkInterface network = networks.nextElement(); byte[] mac = network.getHardwareAddress(); if(mac != null) { System.out.print("Current MAC address : "); StringBuilder sb = new StringBuilder(); for (int i = 0; i < mac.length; i++) { sb.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : "")); } System.out.println(sb.toString()); } } } catch (UnknownHostException e) { e.printStackTrace(); } catch (SocketException e){ e.printStackTrace(); } } 

这是我运行它时在计算机上看到的(消毒版本):

 Current IP address : {I'm not telling :)} Current MAC address : Current MAC address : {actual hardware interface} Current MAC address : 00-00-00-00-00-00-00-E0 Current MAC address : 00-00-00-00-00-00-00-E0 Current MAC address : 00-00-00-00-00-00-00-E0 Current MAC address : 00-00-00-00-00-00-00-E0 Current MAC address : 00-00-00-00-00-00-00-E0 Current MAC address : 00-50-56-C0-00-01 Current MAC address : 00-50-56-C0-00-08 

这是运行ipconfig /all的输出

 C:\>ipconfig /all Windows IP Configuration (minus any actual interface because I don't like sharing that kind of information :) Ethernet adapter Local Area Connection 2: Media State . . . . . . . . . . . : Media disconnected Connection-specific DNS Suffix . : Description . . . . . . . . . . . : Gbridge Virtual Private Network Adapter Physical Address. . . . . . . . . : 02-50-F2-CE-82-01 DHCP Enabled. . . . . . . . . . . : Yes Autoconfiguration Enabled . . . . : Yes Ethernet adapter VMware Network Adapter VMnet1: Connection-specific DNS Suffix . : Description . . . . . . . . . . . : VMware Virtual Ethernet Adapter for VMnet1 Physical Address. . . . . . . . . : 00-50-56-C0-00-01 DHCP Enabled. . . . . . . . . . . : No Autoconfiguration Enabled . . . . : Yes Link-local IPv6 Address . . . . . : fe80::9c27:3d03:da2c:f14d%19(Preferred) Autoconfiguration IPv4 Address. . : {Hidden}(Preferred) Subnet Mask . . . . . . . . . . . : 255.255.0.0 Default Gateway . . . . . . . . . : DHCPv6 IAID . . . . . . . . . . . : 268456022 DHCPv6 Client DUID. . . . . . . . : 00-01-00-01-13-DB-D9-CB-B8-AC-6F-AF-9D-F2 DNS Servers . . . . . . . . . . . : fec0:0:0:ffff::1%1 fec0:0:0:ffff::2%1 fec0:0:0:ffff::3%1 NetBIOS over Tcpip. . . . . . . . : Enabled Ethernet adapter VMware Network Adapter VMnet8: Connection-specific DNS Suffix . : Description . . . . . . . . . . . : VMware Virtual Ethernet Adapter for VMnet8 Physical Address. . . . . . . . . : 00-50-56-C0-00-08 DHCP Enabled. . . . . . . . . . . : No Autoconfiguration Enabled . . . . : Yes Link-local IPv6 Address . . . . . : fe80::cdbb:434:7fd9:2574%20(Preferred) IPv4 Address. . . . . . . . . . . : 192.168.42.1(Preferred) Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . : DHCPv6 IAID . . . . . . . . . . . : 285233238 DHCPv6 Client DUID. . . . . . . . : 00-01-00-01-13-DB-D9-CB-B8-AC-6F-AF-9D-F2 DNS Servers . . . . . . . . . . . : fec0:0:0:ffff::1%1 fec0:0:0:ffff::2%1 fec0:0:0:ffff::3%1 NetBIOS over Tcpip. . . . . . . . : Enabled Tunnel adapter 6TO4 Adapter: Description . . . . . . . . . . . : Microsoft 6to4 Adapter Physical Address. . . . . . . . . : 00-00-00-00-00-00-00-E0 DHCP Enabled. . . . . . . . . . . : No Autoconfiguration Enabled . . . . : Yes IPv6 Address. . . . . . . . . . . : 2002:204c:1bc6::204c:1bc6(Preferred) Default Gateway . . . . . . . . . : NetBIOS over Tcpip. . . . . . . . : Disabled Tunnel adapter isatap.{3E45CB42-BC1E-4F89-9C16-25166C0EABA1}: Media State . . . . . . . . . . . : Media disconnected Connection-specific DNS Suffix . : Description . . . . . . . . . . . : Microsoft ISATAP Adapter Physical Address. . . . . . . . . : 00-00-00-00-00-00-00-E0 DHCP Enabled. . . . . . . . . . . : No Autoconfiguration Enabled . . . . : Yes Tunnel adapter isatap.{77F1FADC-02BA-44AF-9FDF-97E23F8B5FE7}: Media State . . . . . . . . . . . : Media disconnected Connection-specific DNS Suffix . : Description . . . . . . . . . . . : Microsoft ISATAP Adapter #3 Physical Address. . . . . . . . . : 00-00-00-00-00-00-00-E0 DHCP Enabled. . . . . . . . . . . : No Autoconfiguration Enabled . . . . : Yes Tunnel adapter isatap.{608257AC-C0F3-43A5-8595-898533C95D90}: Media State . . . . . . . . . . . : Media disconnected Connection-specific DNS Suffix . : Description . . . . . . . . . . . : Microsoft ISATAP Adapter #5 Physical Address. . . . . . . . . : 00-00-00-00-00-00-00-E0 DHCP Enabled. . . . . . . . . . . : No Autoconfiguration Enabled . . . . : Yes 

从这个混乱中获取“仅一个值”的挑战来自InetAddress.getLocalHost().getHostAddress()与网络接口本身之间的关系。 考虑一下这个初始程序的轻微扩展版本(使用这个非常酷的IterableEnumeration实用程序类):

 public static void main(String[] args) throws UnknownHostException, SocketException { System.out.println("Current IP address : " + InetAddress.getLocalHost().getHostAddress()); for(NetworkInterface network : IterableEnumeration.make(NetworkInterface.getNetworkInterfaces())) { byte[] mac = network.getHardwareAddress(); if(mac != null) { System.out.print("Current MAC address : "); StringBuilder sb = new StringBuilder(); for (int i = 0; i < mac.length; i++) { sb.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : "")); } System.out.println(sb.toString()); //Bound InetAddress for interface for(InetAddress address : IterableEnumeration.make(network.getInetAddresses())) { System.out.println("\tBound to:"+address.getHostAddress()); } } } } 

如果在计算机上运行此命令,您将看到当前的IP地址与一个适配器相关,但您的硬件接口的MAC地址将其视为另一个IP地址。 也许您可以过滤掉虚拟地址或只是找到一种方法来利用所有可用的地址。