Obtenir L'adresse MAC sur la machine locale avec Java

Je peux utiliser

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

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

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

23
demandé sur Matt Ball 2011-05-29 00:27:00

8 réponses

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

Gardez à l'esprit qu'un ordinateur ne peut avoir aucune carte réseau, surtout s'il est intégré ou virtuel. Il peut aussi avoir plus d'un. Vous pouvez obtenir une liste de toutes les cartes réseau NetworkInterface.getNetworkInterfaces().

29
répondu phihag 2011-05-28 20:30:20

Avec toutes les solutions possibles que j'ai trouvées ici et une autre réponse, alors je vais contribuer 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, alors il retournera une chaîne contenant null, sinon 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'un réseau carte):

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

Résultat (si l'ordinateur n'a 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 sur le post Comment déterminer L'Interface réseau Internet en Java qui n'a malheureusement pas eu de upvote sur ce post 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 VM le plus populaire)

18
répondu Jesus Flores 2017-09-29 19:35:16

Quant à L'ordinateur étant hors ligne, il n'a généralement pas d'adresse IP assignée, car DHCP est largement utilisé...

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

5
répondu Uku Loskit 2011-05-28 20:31:55

Une autre façon est d'utiliser une commande du 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
répondu Olantobi 2011-05-28 22:28:55

Essayez ceci:

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
répondu Rudi Wijaya 2014-10-31 04:10:54

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
répondu BullyWiiPlaza 2015-06-16 22:02:05

@Jesus Flores, ne travaille toujours pas pour moi, ce code:

element.getHardwareAddress().length > 0 

Lance une exception. Nous devons vérifier Pour null. 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
répondu vdizdarevic 2018-08-06 09:39:39
public static void main(String[] args){

        InetAddress ip;
        try {

            ip = InetAddress.getLocalHost();
            System.out.println("Current IP address : " + ip.getHostAddress());

            NetworkInterface network = NetworkInterface.getByInetAddress(ip);

            byte[] mac = network.getHardwareAddress();

            System.out.print("Current MAC address : ");

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

        } catch (Exception e) {

            e.printStackTrace();

        }

       }

Sortie:

Current IP address : 192.168.21.60
Current MAC address : 70-5A-0F-3C-84-F2
-1
répondu hari sadhu 2018-03-12 15:37:04