Pegando o Mac Address antes e depois do Mustang (Java 6)
Pegando o Mac Address antes e depois do Mustang (Java 6)
Recentemente tive a necessidade de automatizar o preenchimento de um arquivo de configurações. Nesse arquivo, um dos valores que eram preenchidos era o Mac Address.
Logo me veio na cabeça a necessidade de executar o “ipconfig /all” (win) / “ifconfig” (linux) / “?” (mac)… capturar a saída, tratar o retorno, etc. Sem falar nas dificuldades de se fazer um parser independente do SO, do idioma do SO, ou seja, muitas variáveis que ao qualquer descuido fariam o parser falhar. =/
Bom, uma das novidades do Mustang é que a classe “java.net.NetworkInterface” traz um novo método para pegar o Mac Address de forma transparente. O método se chama “getHardwareAddress”. A seguir vou mostrar um exemplo de como pegar o Mac Address antes e depois do Java 6. Acredito que vá ficar claro a simplicidade e confiabilidade do novo método.
Antes do Java 6:
import java.io.*;
import java.util.regex.*;
/**
*
* @author Paulo Vitor Rendeiro
* @mail paulovittor23@gmail.com
* @site http://paulovittor23.org
*
* GetMacBeforeMustang.java
*
*/
public class GetMacBeforeMustang {
public static void main(String[] args) throws IOException {
String address = new GetMacBeforeMustang().getMacAddress();
System.out.println(address);
}
public String getMacAddress() throws IOException {
Process processo = Runtime.getRuntime().exec( "ipconfig /all" );
BufferedReader in = new BufferedReader(
new InputStreamReader( processo.getInputStream() )
);
String macAddress = null;
while (true) {
String linha = in.readLine();
if (linha == null)
break;
Pattern p = Pattern.compile( ".*Endereço físico.*: (.*)" );
Matcher m = p.matcher( linha );
if ( m.matches() ) {
macAddress = m.group( 1 );
break;
}
}
in.close();
return macAddress;
}
}
Depois do Java 6:
import java.io.IOException;
import java.net.*;
/**
*
* @author Paulo Vitor Rendeiro
* @mail paulovittor23@gmail.com
* @site http://paulovittor23.org
*
* GetMacAfterMustang.java
*
*/
public class GetMacAfterMustang {
public static void main(String[] args) throws IOException {
String address = new GetMacAfterMustang().getMacAddress();
System.out.println(address);
}
private String getMacAddress() throws SocketException, UnknownHostException{
InetAddress localHost = InetAddress.getLocalHost();
NetworkInterface netInter = NetworkInterface.getByInetAddress( localHost );
byte[] macAddressBytes = netInter.getHardwareAddress();
String macAddress = String.format ( "%1$02x-%2$02x-%3$02x-%4$02x-%5$02x-%6$02x",
macAddressBytes[0], macAddressBytes[1],
macAddressBytes[2], macAddressBytes[3],
macAddressBytes[4], macAddressBytes[5] ).toUpperCase();
return macAddress;
}
}
Percebe-se que da primeira forma, temos a dependência do idioma do SO no uso da expressão regular, e caso fossemos tratar isso o código aumentaria sensivelmente.
Já no segundo método eu não vi nenhum tipo de dependência de SO, nem exceções a serem tratadas, deixando o código muito mais confiável.
Olá Paulo, muito boa a comparação, mostra que o Java vem evoluido. Parabens.
Muito bom mesmo!
Parabéns!
Não sei se é padrão do Linux, mas testando no Ubuntu 8.04 o Loopback Local não tem endereço de hardware, portanto getHardwareAddress() retorna nulo.
Decidi persistir o ip ao invés do mac adrress no log do meu sistema pelos seguintes motivos:
- Se o PC tem mais de uma placa de rede, não consegui determinar qual delas está acessando a internet
- O mac address pode ser alterado
Fiz o seguinte para testar seu código:
public class GetMacAfterMustang {
public static void main(String[] args) throws IOException
{
GetMacAfterMustang getMacAfterMustang = new GetMacAfterMustang();
Enumeration networkInterfaceEnumeration = NetworkInterface.getNetworkInterfaces();
while(networkInterfaceEnumeration.hasMoreElements())
{
NetworkInterface networkInterface = networkInterfaceEnumeration.nextElement();
System.out.println(getMacAfterMustang.getMacAddress(networkInterface.getName()));
}
}
private String getMacAddress(String networkInterfaceName) throws SocketException, UnknownHostException
{
NetworkInterface netInter = NetworkInterface.getByName(networkInterfaceName);
if(netInter.getHardwareAddress() == null)
{
return null;
}
byte[] macAddressBytes = netInter.getHardwareAddress();
String macAddress = String.format ( “%1$02x-%2$02x-%3$02x-%4$02x-%5$02x-%6$02x”,
macAddressBytes[0], macAddressBytes[1],
macAddressBytes[2], macAddressBytes[3],
macAddressBytes[4], macAddressBytes[5] ).toUpperCase();
return macAddress;
}
}
No windows vista retorna null enquanto nos demais SO retorna o valor de mac. alguma solução para esse caso?
Paulo, estou iniciando no java ainda, executei seu código no DJ Java Decompiler e funciona perfeitamente, gera o arquivo .class.
Mas não sei cmo executar esse arquivo no arquivo HTML, poderia me ajudar nisso. Ficaria muito grato.
coloca este codigo num applet e faz algumas funções javascript para chamar o applet.
Amigo teria como vc colocar um ttutorial do passo a passo de coo fazer isso mais para pegar o MAC do usuario que esta vendo minha pagina JSP pois esse codigo ai so funciona para pergar o MAC do computador que esta com a apicação ,gostaria que podese me dar uma ajuda estou começando agora em java EE e queria sua ajuda a esse respeito agradeço desde de já sua atenção!