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

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

Posted by paulovittor23 at 1 Fevereiro 2008

Category: Java

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.

12 Comentários

  1. Keps Moreira says

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

  2. Henrique S says

    Muito bom mesmo!
    Parabéns!

  3. Felipe Jaekel says

    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 says

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

  5. Juliano says

    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 says

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

  7. Diego says

    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. Aurélio Lima says

    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!

  9. Zell says

    Show de bola esse post. Ta sendo uma mão na roda pra uma aplicação que estou desenvolvendo aqui.

    E que tenha longa viva essas pessoas que postam esse tipo de material!! huahuahua

    Abraço! o/

  10. Guilherme says

    Funfa belezinha, valeus!!!

    Fica somente a dica para quem tiver problemas, o Applet deve ser assinado!!!

  11. Rafael says

    Parabéns. Funcionou certim. vlw

  12. iesus says

    cara, eu tenho o amac adress e queria usalo para pegar ips de outros pcs, mas quando eu procuro por ips, ele so mostra o meu ip, como eu configuro o amac para pegar ips de outros pcs? vlew at+

Deixar uma resposta

Deixar uma resposta
  • (obrigatório)
  • (obrigatório) (will not be published)
  • *