2011-07-06 66 views
3

我想这个代码来获得一个Linux系统的MAC地址的获取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(); 
} 

,但它只是崩溃......没有人知道为什么吗?

+0

当它崩溃时,你会得到什么错误信息? –

+0

http://pastebin.com/891wKcXz是的,我已检查过它是这部分。如果我只是把= is + Integer.parseInt([mac address here],16);代码工作正常 – y0u

+0

哪一行是133行? –

回答

3

从您的意见,明确networknull,这意味着getByInetAddress()找不到与IP地址的接口(参考JavaDoc:http://download.oracle.com/javase/1.5.0/docs/api/java/net/NetworkInterface.html#getByInetAddress(java.net.InetAddress))。

+2

-facepalm,NetworkInterface network = NetworkInterface.getByName(“eth0”);它立即起作用。谢谢堆:D – y0u

+0

FYI http://www.includehelp.com/java-programs/get-system-mac-address-of-windows-or-linux-machine.aspx – gihan

5

您可能有多个网络接口,我不会指望接口的名称。我建议你浏览所有的接口并寻找一个具有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(); 

    } 
2

盖伊的代码只是一个小改动:

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成功。

因为网络可以为空,所以我忽略了所有的空情况,我也忽略空地址。我认为,如果我们不这样做,我们认为这次崩溃。我选择了第一个发现的地址,它可以工作,但它可能是错误的,所以只需测试它。