2013-05-08 15 views
9

Potrzebuję uzyskać adres MAC systemu, na którym działa program. Ale nie jestem w stanie tego zrobić.Uzyskaj adres MAC systemu w Javie

piszę następujący kod:

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(); 

     } 

     } 

    } 

i otrzymuję następujące wyniki:

Current IP address : 14.96.192.202 
Current MAC address : 

ja nie otrzymuję Adres MAC to jest puste.

Widziałem ten przykład z here

+0

Wyświetla NULL na wyjściu ..! –

+0

Windows lub Linux? Może trzeba się upewnić, że program działa jako administrator? –

+0

Używam Windows –

Odpowiedz

35

Jeśli uwzględnić wiele interfejsów, a niektóre zerowe adresy MAC (Biegnę Java 7 na Windows 7 z zainstalowanym VMWare (tak, mam kilka kart sieciowych wirtualny)), a następnie Kod ten wydaje się działać:

public static void main(String[] args) { 
    try { 
    InetAddress ip = InetAddress.getLocalHost(); 
    System.out.println("Current IP address : " + ip.getHostAddress()); 

    Enumeration<NetworkInterface> 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(); 
    } 
} 

Oto (a odkażane wersji), co widzę na moim komputerze po uruchomieniu go:

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 

A oto wyjście działa 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 

wyzwanie w uzyskaniu „tylko jedną wartość z tego bałaganu” pochodzi z relacji między InetAddress.getLocalHost().getHostAddress() i samych interfejsów sieciowych. Rozważmy taką lekką wersję rozszerzoną początkowej programu (przy użyciu tego naprawdę fajne klasę IterableEnumeration użytkową):

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()); 
     } 
    } 
    } 
} 

przypadku uruchomienia tego komputera wyświetlony zostanie bieżący adres IP koreluje do jednego adaptera ale że adres MAC interfejs sprzętowy widzi siebie jako inny adres IP. Może odfiltrować adresy wirtualne lub po prostu znaleźć sposób na wykorzystanie wszystkich dostępnych adresów.

+0

zwraca zestaw wartości. ale potrzebuję tylko jednej wartości dla mojego programu. W takim razie, w jaki sposób wziąć jedną wartość. i to zbyt odpowiednie. –

+0

Wziąłem ukłucie przy dodawaniu do mojej odpowiedzi. –