2011-07-06 21 views
3

のMACアドレスを取得する:誰もがなぜ知っているん...Javaの - 私はこのコードをLinuxシステムの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アドレス]、16)です。コードは正常に動作します – y0u

+0

どの行133ですか? –

答えて

3

は、はっきりnetworkは(http://download.oracle.com/javase/1.5.0/docs/api/java/net/NetworkInterface.html#getByInetAddress(java.net.InetAddress Javadocを参照してください)getByInetAddress()は、そのIPアドレスとのインタフェースを見つけることができなかったことを意味し、nullです。

+2

- facepalm、NetworkInterface network = NetworkInterface.getByName( "eth0");それはすぐに働いた。 Thanks heaps: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。

ネットワークはヌルになる可能性があるため、すべてのヌルケースを無視し、空のアドレスも無視します。私たちがこれをしなければ、私たちはクラッシュを見ると思います。私は最初に見つかったアドレスを選択して動作しますが、間違っている可能性がありますので、ただテストしてください。

関連する問題