address - Obtener la dirección MAC en la máquina local con Java
get mac address with kotlin (8)
@Jesus Flores, todavía no funciona para mí, este código:
element.getHardwareAddress().length > 0
está arrojando una excepción. Tenemos que verificar si es nulo. Solución final en su caso que funciona para mí:
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);
}
}
}
Estoy trabajando siempre a través de wi-fi.
Puedo usar
ip = InetAddress.getLocalHost();
NetworkInterface.getByInetAddress(ip);
para obtener la dirección MAC, pero si uso este código en una máquina fuera de línea no funciona.
Entonces, ¿cómo puedo obtener la dirección Mac?
Código limpiado desde here :
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();
}
}
Con Java 6+, puede usar NetworkInterface.getHardwareAddress
.
Tenga en cuenta que una computadora no puede tener tarjetas de red, especialmente si está integrada o es virtual. También puede tener más de uno. Puede obtener una lista de todas las tarjetas de red con NetworkInterface.getNetworkInterfaces()
.
Con todas las posibles soluciones que he encontrado aquí y otras respuestas, contribuiré con mi solución. Debe especificar un parámetro con una cadena que contenga "ip" o "mac" dependiendo de lo que necesite verificar. Si la computadora no tiene interfaz, devolverá una Cadena que contenga nulo; de lo contrario, devolverá una Cadena que contenga lo que solicitó (la dirección IP o el mac).
Cómo usarlo:
System.out.println("Ip: " + GetNetworkAddress.GetAddress("ip"));
System.out.println("Mac: " + GetNetworkAddress.GetAddress("mac"));
Resultado (si la computadora tiene una tarjeta de red):
Ip: 192.168.0.10
Mac: 0D-73-ED-0A-27-44
Resultado (si la computadora no tiene una tarjeta de red):
Ip: null
Mac: null
Aquí está el código:
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;
}
}
ACTUALIZADO 05/05/2017: Gracias a @mateuscb en la publicación Cómo determinar la interfaz de red de Internet en Java que, lamentablemente, no recibió ningún comentario previo sobre esa publicación, pero contribuyó a esta actualización.
El método se ha mejorado para omitir las tarjetas de red de la máquina virtual (el software de VM más popular)
En cuanto a la computadora que está fuera de línea, por lo general no tiene una IP asignada, porque DHCP es ampliamente utilizado ...
Y para la pregunta en el título: NetworkInterface.getHardwareAddress()
Otra forma es usar un comando del sistema operativo ''getmac'' a través de la ejecución de código nativo.
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());
Prueba esto:
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());
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();
}
}
salida:
Current IP address : 192.168.21.60
Current MAC address : 70-5A-0F-3C-84-F2