Spis treści
1 Wstęp
2 Odczyt adresu MAC
2.1 Interfejs i test
2.2 Implementacja
Odczyt adresu MAC
Wstęp
MAC Address jest to unikalny numer interfejsu sieciowego pozwalający na jego identyfikację w sieci. Często utożsamia się go z numerem seryjnym urządzenia, co nie jest do końca poprawne, ale stanowi niezłe przybliżenie. Adresy MAC są unikalne w skali światowej.Od wersji 1.4 można w javie odczytać adres MAC bez potrzeby pisania kodu w innym języku i użycia JNI.
Odczyt adresu MAC
Odczyt adresu MAC jest możliwy zarówno lokalnie jak i zdalnie.Interfejs i test
Poniżej definicja interfejsu, który pozwala na odczyt adresu MAC za pomocą obiektu klasy InetAddress:package pl.koziolekweb.programmers.macreader.MACReader; import java.net.InetAddress; public interface MACReader { byte[] getMacAddress(InetAddress inetAddress) throws SocketException; String getMacAddressAsString(InetAddress inetAddress) throws SocketException; }
Poniżej test JUnit4 sprawdzający czy klasa działa poprawnie. Uwaga test, będzie działał poprawnie jeżeli zmienisz IP, MAC i MAC_BYTE na te, które ma twój komputer.
package pl.koziolekweb.programmers.macreader.MACReader; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; import org.junit.Assert; import org.junit.Before; import org.junit.Test; public class MACReaderTest { private final String IP = "10.203.1.73"; private final String MAC = "00-21-70-B9-C1-5F"; private final byte[] MAC_BYTE = new byte[] { 0, 33, 112, -71, -63, 95 }; private MACReader reader; @Before public void before() { reader = new MACReaderImpl(); } @Test public void getMacAddressAsStringTest() throws UnknownHostException, SocketException { String mac = reader.getMacAddressAsString(InetAddress.getLocalHost()); Assert.assertEquals(MAC, mac); mac = reader.getMacAddressAsString(InetAddress.getByName(IP)); Assert.assertEquals(MAC, mac); } @Test public void getMacAddressTest() throws UnknownHostException, SocketException { byte[] mac = reader.getMacAddress(InetAddress.getLocalHost()); Assert.assertTrue(mac.length == 6); Assert.assertArrayEquals(MAC_BYTE, mac); mac = reader.getMacAddress(InetAddress.getByName(IP)); Assert.assertTrue(mac.length == 6); Assert.assertArrayEquals(MAC_BYTE, mac); } }
Implementacja
Na koniec klasa implementująca interfejs:package pl.koziolekweb.programmers.macreader.MACReader; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.util.Formatter; public final class MACReaderImpl implements MACReader { public byte[] getMacAddress(InetAddress inetAddress) throws SocketException { NetworkInterface ni = NetworkInterface.getByInetAddress(inetAddress); byte[] mac = null; if (ni != null) { mac = ni.getHardwareAddress(); } return mac; } public String getMacAddressAsString(InetAddress inetAddress) throws SocketException, NullPointerException { Formatter formatter = new Formatter(); byte[] mac = getMacAddress(inetAddress); if (mac != null) { for (int i = 0; i < mac.length; i++) { formatter.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : ""); } } else { throw new NullPointerException("Adres niedostępny!"); } return formatter.out().toString(); } }
Powyższy kod będzie działał od wersji 1.5 ze względu na użyty sposób formatowania wyników.
Kategoria: Java
Funkcja getHardwareAddress() w NetworkInterface została wprowadzona dopiero w wersji 1.6 Javy także wersja 1.5 będzie niewystarczająca do odpalenia tego kodu.. taki szczegół tylko;)