«1. Введение
В этом руководстве мы будем использовать Java для получения MAC-адресов локальной машины.
MAC-адрес — это уникальный идентификатор физической сетевой карты.
Мы рассмотрим только MAC-адреса, но для более общего обзора сетевых интерфейсов обратитесь к работе с сетевыми интерфейсами в Java.
2. Примеры
В приведенных ниже примерах мы будем использовать API java.net.NetworkInterface и java.net.InetAddress.
2.1. Machine Localhost
Во-первых, давайте получим MAC-адрес локального хоста нашей машины:
InetAddress localHost = InetAddress.getLocalHost();
NetworkInterface ni = NetworkInterface.getByInetAddress(localHost);
byte[] hardwareAddress = ni.getHardwareAddress();
Так как NetworkInterface#getHardwareAddress возвращает массив байтов, мы можем отформатировать результат:
String[] hexadecimal = new String[hardwareAddress.length];
for (int i = 0; i < hardwareAddress.length; i++) {
hexadecimal[i] = String.format("%02X", hardwareAddress[i]);
}
String macAddress = String.join("-", hexadecimal);
Обратите внимание, как мы форматируем каждый байт в массиве в шестнадцатеричное число, используя формат String#.
После этого мы можем соединить все отформатированные элементы знаком «-» (тире).
2.2. Локальный IP
Во-вторых, давайте получим MAC-адрес для данного локального IP-адреса:
InetAddress localIP = InetAddress.getByName("192.168.1.108");
NetworkInterface ni = NetworkInterface.getByInetAddress(localIP);
byte[] macAddress = ni.getHardwareAddress();
Опять же, обратите внимание, как мы получаем массив байтов для MAC-адреса.
2.3. Все сетевые интерфейсы
Наконец, давайте получим MAC-адреса для всех сетевых интерфейсов на нашей машине:
Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
while (networkInterfaces.hasMoreElements()) {
NetworkInterface ni = networkInterfaces.nextElement();
byte[] hardwareAddress = ni.getHardwareAddress();
if (hardwareAddress != null) {
String[] hexadecimalFormat = new String[hardwareAddress.length];
for (int i = 0; i < hardwareAddress.length; i++) {
hexadecimalFormat[i] = String.format("%02X", hardwareAddress[i]);
}
System.out.println(String.join("-", hexadecimalFormat));
}
}
Поскольку getNetworkInterfaces возвращает как физические, так и виртуальные интерфейсы, нам нужно отфильтровать виртуальные.
Мы можем сделать это, например, выполнив нулевую проверку для getHardwareAddress.
3. Заключение
В этом кратком руководстве мы рассмотрели различные способы получения MAC-адресов для локальной машины.
Как обычно, весь исходный код с примерами из этого руководства можно найти на GitHub.