Перейти к основному содержимому

Получение MAC-адресов в Java

· 2 мин. чтения

1. Введение

В этом руководстве мы будем использовать Java для получения MAC-адресов локальной машины.

MAC-адрес — это уникальный идентификатор физической сетевой карты.

Мы рассмотрим только MAC-адреса, но более общий обзор сетевых интерфейсов см. в разделе Работа с сетевыми интерфейсами в Java .

2. Примеры

В приведенных ниже примерах мы будем использовать API java.net.NetworkInterface и java.net.InetAddress .

2.1. Локальный хост машины

Во-первых, давайте получим 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#format .

После этого мы можем соединить все отформатированные элементы знаком «-» (тире).

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 .