web-dev-qa-db-fra.com

Obtenir l'adresse MAC sur une machine locale avec Java

Je peux utiliser 

ip = InetAddress.getLocalHost();
NetworkInterface.getByInetAddress(ip);

pour obtenir l'adresse mac, mais si j'utilise ce code sur une machine hors ligne, cela ne fonctionne pas.

Alors, Comment puis-je obtenir l'adresse Mac?

23
Jevivre xavie

Avec Java 6+, vous pouvez utiliser NetworkInterface.getHardwareAddress .

N'oubliez pas qu'un ordinateur ne peut pas avoir de carte réseau, surtout s'il est intégré ou virtuel. Il peut aussi en avoir plusieurs. Vous pouvez obtenir une liste de toutes les cartes réseau avec NetworkInterface.getNetworkInterfaces() .

29
phihag

Avec toutes les solutions possibles que j'ai trouvées ici et une autre réponse, je contribuerai avec ma solution. Vous devez spécifier un paramètre avec une chaîne contenant "ip" ou "mac" en fonction de ce que vous devez vérifier. Si l'ordinateur n'a pas d'interface, il retournera une chaîne contenant null, sinon il retournera une chaîne contenant ce que vous avez demandé (l'adresse ip ou le mac).

Comment l'utiliser:

System.out.println("Ip: " + GetNetworkAddress.GetAddress("ip"));
System.out.println("Mac: " + GetNetworkAddress.GetAddress("mac"));

Résultat (si l'ordinateur dispose d'une carte réseau):

Ip: 192.168.0.10 
Mac: 0D-73-ED-0A-27-44

Résultat (si l'ordinateur ne possède pas de carte réseau):

Ip: null
Mac: null

Voici le code:

import Java.net.Inet4Address;
import Java.net.InetAddress;
import Java.net.NetworkInterface;
import Java.net.SocketException;
import Java.net.UnknownHostException;
import Java.util.Enumeration;

public class GetNetworkAddress {

    public static String GetAddress(String addressType) {
        String address = "";
        InetAddress lanIp = null;
        try {

            String ipAddress = null;
            Enumeration<NetworkInterface> net = null;
            net = NetworkInterface.getNetworkInterfaces();

            while (net.hasMoreElements()) {
                NetworkInterface element = net.nextElement();
                Enumeration<InetAddress> addresses = element.getInetAddresses();

                while (addresses.hasMoreElements() && element.getHardwareAddress().length > 0 && !isVMMac(element.getHardwareAddress())) {
                    InetAddress ip = addresses.nextElement();
                    if (ip instanceof Inet4Address) {

                        if (ip.isSiteLocalAddress()) {
                            ipAddress = ip.getHostAddress();
                            lanIp = InetAddress.getByName(ipAddress);
                        }

                    }

                }
            }

            if (lanIp == null)
                return null;

            if (addressType.equals("ip")) {

                address = lanIp.toString().replaceAll("^/+", "");

            } else if (addressType.equals("mac")) {

                address = getMacAddress(lanIp);

            } else {

                throw new Exception("Specify \"ip\" or \"mac\"");

            }

        } catch (UnknownHostException ex) {

            ex.printStackTrace();

        } catch (SocketException ex) {

            ex.printStackTrace();

        } catch (Exception ex) {

            ex.printStackTrace();

        }

        return address;

    }

    private static String getMacAddress(InetAddress ip) {
        String address = null;
        try {

            NetworkInterface network = NetworkInterface.getByInetAddress(ip);
            byte[] mac = network.getHardwareAddress();

            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < mac.length; i++) {
                sb.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : ""));
            }
            address = sb.toString();

        } catch (SocketException ex) {

            ex.printStackTrace();

        }

        return address;
    }

    private static boolean isVMMac(byte[] mac) {
        if(null == mac) return false;
        byte invalidMacs[][] = {
                {0x00, 0x05, 0x69},             //VMWare
                {0x00, 0x1C, 0x14},             //VMWare
                {0x00, 0x0C, 0x29},             //VMWare
                {0x00, 0x50, 0x56},             //VMWare
                {0x08, 0x00, 0x27},             //Virtualbox
                {0x0A, 0x00, 0x27},             //Virtualbox
                {0x00, 0x03, (byte)0xFF},       //Virtual-PC
                {0x00, 0x15, 0x5D}              //Hyper-V
        };

        for (byte[] invalid: invalidMacs){
            if (invalid[0] == mac[0] && invalid[1] == mac[1] && invalid[2] == mac[2]) return true;
        }

        return false;
    }

}

MISE À JOUR 02/05/2017: Merci à @mateuscb pour le poste Comment déterminer l'interface de réseau Internet en Java qui, malheureusement, n'a pas eu de vote positif pour ce poste auparavant, mais il a contribué à cette mise à jour.

La méthode a été améliorée pour ignorer les cartes réseau de machines virtuelles (logiciel le plus populaire VM)

20
Jesus Flores

En ce qui concerne l'ordinateur hors ligne, aucune adresse IP ne lui est attribuée, car DHCP est largement utilisé ...

Et pour la question dans le titre: NetworkInterface.getHardwareAddress()

5
Uku Loskit

Essaye ça:

final NetworkInterface netInf = NetworkInterface.getNetworkInterfaces().nextElement();
final byte[] mac = netInf.getHardwareAddress();
final StringBuilder sb = new StringBuilder();
for (int i = 0; i < mac.length; i++) {
        sb.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : ""));        
}
log.info("Mac addr: {}", sb.toString());
1
Rudi Wijaya

Une autre méthode consiste à utiliser une commande de système d'exploitation "getmac" via l'exécution de code natif.

    Process p = Runtime.getRuntime().exec("getmac /fo csv /nh");
    Java.io.BufferedReader in = new Java.io.BufferedReader(new  Java.io.InputStreamReader(p.getInputStream()));
    String line;
    line = in.readLine();        
    String[] result = line.split(",");

    System.out.println(result[0].replace('"', ' ').trim());
1
Olantobi

Code nettoyé de ici :

import Java.net.InetAddress;
import Java.net.NetworkInterface;
import Java.net.SocketException;
import Java.net.UnknownHostException;

public class HardwareAddress
{
    public static String getMacAddress() throws UnknownHostException,
            SocketException
    {
        InetAddress ipAddress = InetAddress.getLocalHost();
        NetworkInterface networkInterface = NetworkInterface
                .getByInetAddress(ipAddress);
        byte[] macAddressBytes = networkInterface.getHardwareAddress();
        StringBuilder macAddressBuilder = new StringBuilder();

        for (int macAddressByteIndex = 0; macAddressByteIndex < macAddressBytes.length; macAddressByteIndex++)
        {
            String macAddressHexByte = String.format("%02X",
                    macAddressBytes[macAddressByteIndex]);
            macAddressBuilder.append(macAddressHexByte);

            if (macAddressByteIndex != macAddressBytes.length - 1)
            {
                macAddressBuilder.append(":");
            }
        }

        return macAddressBuilder.toString();
    }
}
0
BullyWiiPlaza

@ Jésus Flores, ne fonctionne toujours pas pour moi, ce code: 

element.getHardwareAddress().length > 0 

lance une exception. Nous devons vérifier pour null. La solution finale dans votre cas qui fonctionne pour moi:

            while (addresses.hasMoreElements()
                    && element.getHardwareAddress() != null
                    && element.getHardwareAddress().length > 0
                    && !isVMMac(element.getHardwareAddress())) {
                final InetAddress ip = addresses.nextElement();
                if (ip instanceof Inet4Address) {
                    // || ip instanceof Inet6Address
                    if (ip.isSiteLocalAddress()) {
                        ipAddress = ip.getHostAddress();
                        lanIp = InetAddress.getByName(ipAddress);
                    }
                }
            }

Je travaille toujours sur le wi-fi.

0
vdizdarevic