Pegando o Mac Address antes e depois do Mustang (Java 6)

Escrito por paulovittor23, 1 de Fevereiro de 2008 21:35

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.

8 Comentários “Pegando o Mac Address antes e depois do Mustang (Java 6)”

  1. Olá Paulo, muito boa a comparação, mostra que o Java vem evoluido. Parabens.

  2. Henrique S diz:

    Muito bom mesmo!
    Parabéns!

  3. Felipe Jaekel diz:

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

    }

  4. Ernani diz:

    No windows vista retorna null enquanto nos demais SO retorna o valor de mac. alguma solução para esse caso?

  5. Juliano diz:

    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.

  6. Leandro Ferreira diz:

    coloca este codigo num applet e faz algumas funções javascript para chamar o applet.

  7. Diego diz:

    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!

  8. Concordo com o Diego… não consegui encontrar em nenhum lugar uma classe que retornasse o mac do cliente. apenas o mac do servidor em que a app está hospedada.

    Se puder me dar uma solução para este problema…

    abraço!

Deixe o seu comentário!

Panorama Theme by Themocracy