2012-06-09 5 views
7

mir ein Problem mit der MAC-Adresse einer Maschine zu bekommen, die in this question mit dem Folge Code gelöst wurde:in Java unter Verwendung von getHardwareAddress nicht-determinis

Process p = Runtime.getRuntime().exec("getmac /fo csv /nh"); 
java.io.BufferedReader in = new java.io.BufferedReader(new java.io.InputStreamReader(p.getInputStream())); 
String line; 
line = in.readLine();   
String[] result = line.split(","); 

System.out.println(result[0].replace('"', ' ').trim()); 

Allerdings würde Ich mag an wissen, warum dieser Code nicht funktioniert. Bei jedem Lesen der MAC-Adresse wird ein anderer Wert zurückgegeben. Zuerst dachte ich, es sei wegen getHash, vielleicht benutze ich einen Timestamp, den ich nicht kenne ... Aber selbst wenn man es entfernt, ändert sich das Ergebnis.

-Code

public static byte[] getMacAddress() { 
     try { 
      Enumeration<NetworkInterface> nwInterface = NetworkInterface.getNetworkInterfaces(); 
      while (nwInterface.hasMoreElements()) { 
       NetworkInterface nis = nwInterface.nextElement(); 
       if (nis != null) { 
        byte[] mac = nis.getHardwareAddress(); 
        if (mac != null) { 
         /* 
         * Extract each array of mac address and generate a 
         * hashCode for it 
         */ 
         return mac;//.hashCode(); 
        } else { 
         Logger.getLogger(Utils.class.getName()).log(Level.WARNING, "Address doesn't exist or is not accessible"); 
        } 
       } else { 
        Logger.getLogger(Utils.class.getName()).log(Level.WARNING, "Network Interface for the specified address is not found."); 
       } 
       return null; 
      } 
     } catch (SocketException ex) { 
      Logger.getLogger(Utils.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     return null; 
    } 
} 

Ausgabebeispiel (Ich bin das Drucken direkt von Byte-Array, aber es ist genug, dass anders zu sehen, ich denke)

[[email protected] 
[[email protected] 
[[email protected] 
[[email protected] 
[[email protected] 
[[email protected] 
[[email protected] 
[[email protected] 
[[email protected] 
[[email protected] 
[[email protected] 
[[email protected] 
[[email protected] 
[[email protected] 
[[email protected] 
[[email protected] 
[[email protected] 

Vielen Dank im Voraus

+1

Sie drucken den Standard 'toString' eines Byte-Array. –

Antwort

9

[email protected] tatsächlich ist das Ergebnis toString() Methode der byte[] Arrays.

Ich würde vorschlagen, dass Sie den Wert mit new String(mac) stattdessen drucken.

byte[].toString() implementiert als:

public String toString() { 
    return getClass().getName() + "@" + Integer.toHexString(hashCode()); 
} 

Da Standard-Object.hashCode() als Adresse im Speicher implementiert ist, damit es nicht konsistent ist, wie Sie neue Object jedes Mal zu schaffen sind.

Edit:

Da das zurückgegebene Byte in Hex ist, so sollten Sie es in Dezimal-String konvertieren. Der Code kann sehen, von here

+0

@Wee: seltsam, druckt nichts mit neuen String (Mac). Dubbuging jetzt ... –

+0

@PedroDusso Siehe meine aktualisierte Antwort. –

5

Hier ein Beispiel aus Mkyong.com Website auf, wie die MAC-Adresse in Java erhalten:

package com.mkyong; 

import java.net.InetAddress; 
import java.net.NetworkInterface; 
import java.net.SocketException; 
import java.net.UnknownHostException; 

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

    } 

    } 

} 
4

Die Antwort von spaniern funktioniert nicht, wenn das Gerät nicht angeschlossen ist und Es gibt verschiedene Werte, die von dem Netzwerk abhängen, mit dem Sie verbunden sind.

dieses ist nicht abhängig von jeder IP-Adresse:

public class MacAdress { 
    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) ? "-" : "")); 
        } 
       } 
      } 
     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
     } catch (SocketException e){ 
      e.printStackTrace(); 
     } 
    } 
} 
2
public static String getHardwareAddress() throws Exception { 
    InetAddress ip = InetAddress.getLocalHost(); 
    NetworkInterface ni = NetworkInterface.getByInetAddress(ip); 
    if (!ni.isVirtual() && !ni.isLoopback() && !ni.isPointToPoint() && ni.isUp()) { 
     final byte[] bb = ni.getHardwareAddress(); 
     return IntStream.generate(ByteBuffer.wrap(bb)::get).limit(bb.length) 
       .mapToObj(b -> String.format("%02X", (byte)b)) 
       .collect(Collectors.joining("-")); 
    } 
    return null; 
} 
Verwandte Themen