with mac con address java sockets mac-address

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 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