martedì 24 agosto 2010

Mac address in Java

Con Java 6 è possibile ottenere anche il mac address di una scheda di rete (valore non ottenibile con Java 5 e precedenti).

Il codice è molto semplice:
con il metodo
java.net.NetworkInterface.getNetworkInterfaces();
si ottiene una Enumeration di tutte le interfacce di rete del sistema, la classe NetworkInterface presenta un metodo getHardwareAddress() che restituisce un array di byte corrispondente ad un generico indirizzo fisico della scheda (che corrisponde al mac address nel caso di schede ethernet).
Tale array può:
  • essere a null nel caso di interfacce di rete particolari come quella di loop (individuabile anche tramite il metodo isLoopback() ) o altre fittizie
  • avere esattamente 6 byte per le schede di rete
  • avere lunghezza diversa da 6 byte per altre interfacce non ethernet (es. Firewire ha 8 byte).

Il metodo byte2String trasforma l'array in una stringa nella tipica notazione esadecimale con i ":".

Post correlati:
Mac address in Java: codice d'esempio

Mac address in Java: codice d'esempio


import java.net.NetworkInterface;
import java.util.Enumeration;

public class SimpleMacAddress{

/** Lunghezza della stringa contente il mac address (6 * 2)numeri esadecimali + 5 separatori */
public final static int MAC_ADDRESS_STRING_LEN = 17;
/** Lunghezza dell'array di byte */
public final static int MAC_ADDRESS_BYTE_LEN = 6;
/** Base dei numeri per la stringa */
public final static int MAC_ADDRESS_RADIX = 16;

public static void main(String[] args)
{
try{
//Elenco di tutte le interfacce di rete
Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces();
while(e.hasMoreElements())
{
NetworkInterface ni = e.nextElement();
System.out.println("Name = " + ni.getName());
byte[] b = ni.getHardwareAddress();
System.out.println("hw = " + (b == null ? "null" : byte2String(b)));
System.out.println();
System.out.println("------------");
}

}catch(Exception e)
{
e.printStackTrace();
}
}

public static String byte2String(byte[] vByte)
{
if(vByte.length != MAC_ADDRESS_BYTE_LEN)
return "Mac address con lunghezza " + vByte.length;
StringBuilder sb = new StringBuilder();
int len = vByte.length;
for(int i = 0; i < len; i++)
{
//Utilizzo un int per evitare di avere numeri negativi
int a = vByte[i];
if(a < 0)
a = a + 256;
String s = Integer.toHexString(a/MAC_ADDRESS_RADIX) + "" + Integer.toHexString(a%MAC_ADDRESS_RADIX);
sb.append(s);
//tutte le coppie tranne l'ultima
if(i != len - 1)
sb.append(":");
}
return sb.toString();
}
}

Post correlati:
Mac address in Java