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