2012-06-09 30 views
7

estaba teniendo un problema para obtener la dirección MAC de una máquina, que se resolvió en this question utilizando el código de seguimiento:Obtener dirección MAC en Java utilizando getHardwareAddress no determinista

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

Sin embargo, me gustaría saber por qué este código no está funcionando. Cada vez que lee la dirección MAC, devuelve un valor diferente. Primero pensé que era porque getHash, tal vez usando una marca de tiempo, no lo sé ... Pero incluso eliminándolo, el resultado cambia.

Código

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

Ejemplo de salida (estoy imprimir directamente desde el conjunto de bytes, pero es lo suficientemente diferente de ver que creo)

[[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] 

Gracias de antemano

+1

que está imprimiendo el valor por defecto 'toString' de una matriz de bytes. –

Respuesta

9

[email protected] realidad es el resultado del método toString() de las matrices byte[].

Le sugiero que imprima el valor usando new String(mac) en su lugar.

byte[].toString() se implementa como:

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

Desde predeterminado Object.hashCode() se implementa como dirección en la memoria, por lo que no es consistente ya que está creando nueva Object cada vez.

Editar:

Desde el byte devuelto está en hexadecimal, por lo que debe convertirlo en cadena decimal. El código se puede ver a partir here

+0

@Wee: extraño, no imprime nada con el nuevo String (mac). Dubbuging en este momento ... –

+0

@PedroDusso Ver mi respuesta actualizada. –

5

Aquí se muestra un ejemplo de Mkyong.com sitio web sobre cómo obtener la dirección MAC en Java:

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

La respuesta del español no funciona si la máquina no está conectado y le dará diferentes valores dependiendo de la red a la que está conectado.

éste no depende de ninguna dirección IP:

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; 
} 
Cuestiones relacionadas