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 .