Java не предоставляет прямого способа запрашивать MAC-адрес хоста в вашей сети, поскольку он абстрагируется библиотеками сокетов Java.
В некотором смысле это имеет смысл, потому что MAC-адрес хоста на самом деле говорит очень мало. Не существует такого понятия, как «адрес» MAC хоста.
- Многие хосты будут иметь несколько сетевых карт, каждый с отдельным MAC-адресом, с помощью которого они могут подключаться к сети. Компьютер, на котором я сейчас работаю, имеет проводной адаптер Ethernet, адаптер WiFi и адаптер Firewire, и все они имеют свой собственный MAC-адрес. Это означает, что для хоста нет определенного MAC-адреса.
- Если хост находится в другой подсети, ARP фактически даст вам MAC-адрес последнего маршрутизатора, через который прошел ваш пакет, вместо MAC-адреса сканируемого хоста.
Поместите обе эти проблемы вместе, и это означает, что один хост может иметь много разных MAC-адресов (если у него более одного сетевого адаптера), и один MAC-адрес может представлять много разных хостов (если трафик проходит через маршрутизатор).
Предполагая, что вы знаете все это, и вам все еще нужно получить MAC-адрес хоста, единственный способ сделать это в Java - "перейти к нативному":
- Родной для клиента, который запускает вашу программу:
- Вы можете запустить инструмент командной строки ARP и проанализировать его вывод.
- Вы можете использовать какой-то вызов JNI. Я не слишком знаком с JNI, поэтому не могу помочь вам с этим.
- Напишите отдельное маленькое нативное приложение, к которому вы можете получить доступ из Java через Telnet или другой подобный протокол и которое запустит команду ARP.
- Родной для хоста, который вы хотите сканировать:
- Вы можете использовать SNMP, как предлагают другие ответы в этой теме. Я полагаюсь на эти ответы для того, чтобы сделать это для вас. SNMP - отличный протокол, но имейте в виду, что OID SNMP могут зависеть как от платформы, так и от поставщика. OID, которые работают для Windows, не всегда работают для Linux и наоборот.
- Если вы знаете, что ваш хост работает под управлением Windows, вы можете использовать WMI . Класс Win32_NetworkAdapter содержит необходимую информацию, но имейте в виду, что она возвращает всех сетевых адаптеров хостов, даже тех, которые Windows создает. Кроме того, требуются учетные данные администратора для сканируемого хоста. Google расскажет вам, как подключиться к WMI из Java.
- Если вы знаете, что на вашем хосте работает OS X, вы можете подключиться к компьютеру по SSH и проанализировать вывод команды
system_profile
.
- Для Linux, вероятно, существует инструмент, аналогичный OS X
system_profile
.