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?
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()
.
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)
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()
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());
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());
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();
}
}
@ 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.