Como Ler Endereco MAC da Placa de Rede Com o Cabo de Rede Desconectado

Boa Tarde a todos, estou desenvolvendo uma aplicação comercial e, preciso ler o endereço MAC da placa de rede, eu ja consegui fazer isso … só que quando eu desconecto o cabo de rede, não consigo fazer essa leitura, não tenho nem idéia como fazer isso e, no caso de haver varias placas de rede … gostaria de sempre fazer a leitura da interface 0 … mesmo que não seja ela que a rede esteja utilizando no momento … o código que eu tenho é esse aki … desde ja agradeço a todos …

package maxctrl.componentes;

import java.net.InetAddress;
import java.net.NetworkInterface;

public class CarregarEnderecoMac {

    public static String LerEnderecoMac() {
        String enderecoMac = "";
        try {   
            String ip = InetAddress.getLocalHost().getHostAddress();   
            String loopBack = ip.substring(0, 3);   
            
            if (loopBack.equals("127")) {   
                ip = getFirstIP();   
            }   
            
            InetAddress localHost = InetAddress.getByName(ip);     
            
            byte[] mac = new byte[0];
            try {
                NetworkInterface networkInterface = NetworkInterface.getByInetAddress(localHost);     
                mac = networkInterface.getHardwareAddress();
            } catch (Exception e) {
                
            }
  
            try {
                for (int i = 0; i < mac.length; i++) {
                    if (enderecoMac.isEmpty() == false) {
                        enderecoMac = enderecoMac + "-";
                    }
                    enderecoMac = enderecoMac + String.format("%02X", mac[i]);
                }
            } catch (Exception e) {
                
            }
           
        } catch (Exception e) {
            
        }
        if (enderecoMac.isEmpty()) {
            enderecoMac = "00-00-00-00-00-00";
        }
        return enderecoMac;
    }
    
    private static String getFirstIP() {   
        java.util.Enumeration<java.net.NetworkInterface> ifaces = null;   
        try {   
            ifaces = java.net.NetworkInterface.getNetworkInterfaces();   
        } catch (java.net.SocketException e) { }   
        for (; ifaces.hasMoreElements();) {   
            java.util.Enumeration<java.net.InetAddress> addrs = ifaces.nextElement().getInetAddresses();   
            for (; addrs.hasMoreElements(); ) {   
                java.net.InetAddress addr = addrs.nextElement();   
                if (!addr.isLoopbackAddress() && !(addr instanceof java.net.Inet6Address))   
                    return addr.getHostName();   
            }   
        }   
        return "127.0.0.1";   
    }   
}

Pergunta - quando o cabo está desconectado, existe algum utilitário do sistema operacional que permita obter essa mesma informação? Se existir, chame-o (ordinariamente via Runtime.exec) e interprete a sua saída.

no windows tem um comandinho “getmac” (obviamente sem as aspas), ao menos no windows xp e no windows 7 sei que funciona. No linux talvez você possa dar um lspci por exemplo, de repente com um grep ou pesquisar você mesmo algum comando que retorne ja os dados só da interface de rede

Tenta o “arp -a” … e vê se te atende !

Amigos … valew pelas dicas … mas eu estou procurando uma solução em JAVA … tipo … alguma classe que possa fazer isso … pois eu utilizo terminais em windows e linux … e existem varias versoes … desde xp até windows 8 … e linux … varias dist … por isso gostaria de algo sem gamb … mas valew a dica …

Bom, para suportar certas coisas, é necessário chamar esses comandos mesmo - se você não achar na documentação do JDK, é porque não tem mesmo :frowning: :frowning: :(.

Você vai ter de criar uma classe que encapsule todas essas chateações que são diferentes para cada sistema operacional e para cada versão dele.

Isso não é “gambs” - é uma forma de fazer algo que não é diretamente implementado pelo JDK :slight_smile:

Bom dia, obrigado pela dica entanglement, não sou nenhum expert em java … a um tempo atraz… eu vi uma classe que fazia exatamente isso … mas sem executar comando do sistema operacional … diretamente em C nativo … que posso utilizar em java … o problema é que não consegui mais encontrar esses exemplos … parte desse exemplo é essa classe que passei … na época … isso era suficiente para minha amplicação … mas hoje … preciso desse complemento … Se Alguem Puder Ajudar … Fico Muito grato !!!

Ou seja, você está acrescentando uma dependência para o sistema operacional. Normalmente isso costuma ser bem chato de resolver, já que no mínimo você tem de recompilar esse código em C nativo para:
Windows - 32 bits
Windows - 64 bits
Linux - 32 bits
Linux - 64 bits
– isso supondo que o código em C nativo suporte Linux (ou Windows, é claro: ) - o código é diferente para cada sistema operacional
e testar também :slight_smile: - e o agravante: se tiver algum bugzinho nesse código, em vez de você simplesmente ficar sem a resposta, você acaba tendo um problema gigante - o programa Java simplesmente cai, e você nem sabe o que ocorreu.