Java - Получение MAC-адреса системы Linux - PullRequest
3 голосов
/ 06 июля 2011

Я пытаюсь получить MAC-адрес системы Linux с этим кодом:

try {
  ip = InetAddress.getLocalHost();
  NetworkInterface network = NetworkInterface.getByInetAddress(ip);
  byte[] mac = network.getHardwareAddress();
  // System.out.print("Current MAC address: ");
  for (int i = 0; i < mac.length; i++) {
    is = is + Integer.parseInt(
      String.format("%02X%s", mac[i], (i < mac.length - 1) ? "" : ""),16);
  }
} catch (UnknownHostException e) {
  e.printStackTrace();
} catch (SocketException e) {
  e.printStackTrace();
}

Но он просто падает ... кто-нибудь знает почему?

Ответы [ 3 ]

6 голосов
/ 09 апреля 2012

Возможно, у вас более одного сетевого интерфейса, и я не буду рассчитывать на имя интерфейса. Я предлагаю вам пройтись по всем интерфейсам и найти тот, который имеет MAC-адрес. Вы можете использовать этот пример в качестве базовой линии:

try {

        Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
        while(networkInterfaces.hasMoreElements())
        {
            NetworkInterface network = networkInterfaces.nextElement();
            System.out.println("network : " + network);
            byte[] mac = network.getHardwareAddress();
            if(mac == null)
            {
                System.out.println("null mac");             
            }
            else
            {
                System.out.print("MAC address : ");

                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < mac.length; i++)
                {
                    sb.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : ""));        
                }
                System.out.println(sb.toString());  
                break;
            }
        }
    } catch (SocketException e){

        e.printStackTrace();

    }
3 голосов
/ 06 июля 2011

Из ваших комментариев ясно, что network равно null, что означает, что getByInetAddress() не может найти интерфейс с этим IP-адресом (см. JavaDocs: http://download.oracle.com/javase/1.5.0/docs/api/java/net/NetworkInterface.html#getByInetAddress(java.net.InetAddress)).

2 голосов
/ 14 мая 2014

Просто небольшая модификация кода Гая:

public String searchForMac() throws SocketException {
    String firstInterface = null;        
    Map<String, String> addressByNetwork = new HashMap<>();
    Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();

    while(networkInterfaces.hasMoreElements()){
        NetworkInterface network = networkInterfaces.nextElement();

        byte[] bmac = network.getHardwareAddress();
        if(bmac != null){
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < bmac.length; i++){
                sb.append(String.format("%02X%s", bmac[i], (i < bmac.length - 1) ? "-" : ""));        
            }

            if(sb.toString().isEmpty()==false){
                addressByNetwork.put(network.getName(), sb.toString());
                System.out.println("Address = "+sb.toString()+" @ ["+network.getName()+"] "+network.getDisplayName());
            }

            if(sb.toString().isEmpty()==false && firstInterface == null){
                firstInterface = network.getName();
            }
        }
    }

    if(firstInterface != null){
        return addressByNetwork.get(firstInterface);
    }

    return null;
}

Этот код был успешно протестирован на Windows, Linux (Ubuntu) и Mac OS X.

Поскольку сетьможет быть нулевым, я игнорирую все нулевые случаи, а также игнорирую пустые адреса.Я думаю, что если мы этого не сделаем, мы увидим крах.Я выбираю первый найденный адрес, и он работает, но он может быть неправильным, поэтому просто проверьте его.

...