Java - 获取 Linux 系统的 MAC 地址

4
我正在尝试使用以下代码获取Linux系统的MAC地址:

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();
}

但它总是崩溃...有人知道为什么吗?

当它崩溃时,您会收到什么错误消息? - Oliver Charlesworth
http://pastebin.com/891wKcXz是的,我已经检查过它是这部分。如果我只是把is = is + Integer.parseInt([mac address here],16);放进去,代码就能正常工作。 - y0u
byte[] mac = network.getHardwareAddress(); byte[] mac = network.getHardwareAddress(); - y0u
“系统”没有MAC地址,网络接口有。一个系统可以有多个网卡,因此也有多个MAC地址。 - Randy Howard
3个回答

6

您可能有多个网络接口,我不会依赖于接口名称。建议您检查所有接口并查找具有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

这是对Guy代码的一个小修改:

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上成功测试。

由于网络可能为空,我忽略了所有的空值情况,也忽略了空地址。我认为如果我们不这样做,就会导致崩溃。我选择第一个找到的地址,它能够工作,但可能是错误的,因此需要进行测试。


3

2
-facepalm,我使用了NetworkInterface network = NetworkInterface.getByName("eth0"); 然后它立即工作了。非常感谢 :D - y0u
请注意:http://www.includehelp.com/java-programs/get-system-mac-address-of-windows-or-linux-machine.aspx - gihan-maduranga

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接