web-dev-qa-db-ja.com

JavaでローカルマシンのMACアドレスを取得する

使うことができます

ip = InetAddress.getLocalHost();
NetworkInterface.getByInetAddress(ip);

macアドレスを取得しますが、このコードをオフラインマシンで使用すると動作しません。

したがって、Macアドレスを取得するにはどうすればよいですか?

24
Jevivre xavie

Java 6+では、 _NetworkInterface.getHardwareAddress_ を使用できます。

特に組み込みまたは仮想の場合、コンピューターにはネットワークカードを搭載できないことに注意してください。複数持つこともできます。 NetworkInterface.getNetworkInterfaces() を使用すると、すべてのネットワークカードのリストを取得できます。

29
phihag

ここで見つけたすべての可能な解決策と別の返信で、私は自分の解決策に貢献します。確認する必要があるものに応じて、「ip」または「mac」を含む文字列でパラメータを指定する必要があります。コンピューターにインターフェイスがない場合は、nullを含む文字列が返されます。それ以外の場合は、要求(ipアドレスまたはmac)を含む文字列が返されます。

どうやって使うのですか:

System.out.println("Ip: " + GetNetworkAddress.GetAddress("ip"));
System.out.println("Mac: " + GetNetworkAddress.GetAddress("mac"));

結果(コンピューターにネットワークカードがある場合):

Ip: 192.168.0.10 
Mac: 0D-73-ED-0A-27-44

結果(コンピューターにネットワークカードがない場合):

Ip: null
Mac: null

コードは次のとおりです。

import Java.net.Inet4Address;
import Java.net.InetAddress;
import Java.net.NetworkInterface;
import Java.net.SocketException;
import Java.net.UnknownHostException;
import Java.util.Enumeration;

public class GetNetworkAddress {

    public static String GetAddress(String addressType) {
        String address = "";
        InetAddress lanIp = null;
        try {

            String ipAddress = null;
            Enumeration<NetworkInterface> net = null;
            net = NetworkInterface.getNetworkInterfaces();

            while (net.hasMoreElements()) {
                NetworkInterface element = net.nextElement();
                Enumeration<InetAddress> addresses = element.getInetAddresses();

                while (addresses.hasMoreElements() && element.getHardwareAddress().length > 0 && !isVMMac(element.getHardwareAddress())) {
                    InetAddress ip = addresses.nextElement();
                    if (ip instanceof Inet4Address) {

                        if (ip.isSiteLocalAddress()) {
                            ipAddress = ip.getHostAddress();
                            lanIp = InetAddress.getByName(ipAddress);
                        }

                    }

                }
            }

            if (lanIp == null)
                return null;

            if (addressType.equals("ip")) {

                address = lanIp.toString().replaceAll("^/+", "");

            } else if (addressType.equals("mac")) {

                address = getMacAddress(lanIp);

            } else {

                throw new Exception("Specify \"ip\" or \"mac\"");

            }

        } catch (UnknownHostException ex) {

            ex.printStackTrace();

        } catch (SocketException ex) {

            ex.printStackTrace();

        } catch (Exception ex) {

            ex.printStackTrace();

        }

        return address;

    }

    private static String getMacAddress(InetAddress ip) {
        String address = null;
        try {

            NetworkInterface network = NetworkInterface.getByInetAddress(ip);
            byte[] mac = network.getHardwareAddress();

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

        } catch (SocketException ex) {

            ex.printStackTrace();

        }

        return address;
    }

    private static boolean isVMMac(byte[] mac) {
        if(null == mac) return false;
        byte invalidMacs[][] = {
                {0x00, 0x05, 0x69},             //VMWare
                {0x00, 0x1C, 0x14},             //VMWare
                {0x00, 0x0C, 0x29},             //VMWare
                {0x00, 0x50, 0x56},             //VMWare
                {0x08, 0x00, 0x27},             //Virtualbox
                {0x0A, 0x00, 0x27},             //Virtualbox
                {0x00, 0x03, (byte)0xFF},       //Virtual-PC
                {0x00, 0x15, 0x5D}              //Hyper-V
        };

        for (byte[] invalid: invalidMacs){
            if (invalid[0] == mac[0] && invalid[1] == mac[1] && invalid[2] == mac[2]) return true;
        }

        return false;
    }

}

2017年2月5日に更新:投稿の@mateuscbに感謝します Javaでインターネットネットワークインターフェイスを決定する方法 残念ながら以前は投稿に賛成票を投じていませんでしたが、彼はこの更新に貢献しました。

この方法は、仮想マシンのネットワークカードをスキップするように改善されました(最も一般的なVMソフトウェア)

22
Jesus Flores

DHCPが広く使用されているため、オフラインになっているコンピューターに関しては、通常IPが割り当てられていません...

そしてタイトルの質問: NetworkInterface.getHardwareAddress()

5
Uku Loskit

これを試して:

final NetworkInterface netInf = NetworkInterface.getNetworkInterfaces().nextElement();
final byte[] mac = netInf.getHardwareAddress();
final StringBuilder sb = new StringBuilder();
for (int i = 0; i < mac.length; i++) {
        sb.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : ""));        
}
log.info("Mac addr: {}", sb.toString());
1
Rudi Wijaya

別の方法は、ネイティブコードの実行を通じてOSコマンド「getmac」を使用することです。

    Process p = Runtime.getRuntime().exec("getmac /fo csv /nh");
    Java.io.BufferedReader in = new Java.io.BufferedReader(new  Java.io.InputStreamReader(p.getInputStream()));
    String line;
    line = in.readLine();        
    String[] result = line.split(",");

    System.out.println(result[0].replace('"', ' ').trim());
1
Olantobi

中アクセス制御アドレス( MACアドレス

デバイスのMACアドレスは、ネットワークインターフェイスコントローラー(NIC)に割り当てられた一意の識別子です。ネットワークセグメント内の通信では、イーサネット、Wi-Fi、Bluetoothなど、ほとんどのIEEE 802ネットワークテクノロジーのネットワークアドレスとして使用されます。 Open Systems Interconnection( [〜#〜] osi [〜#〜] )モデル内では、データリンク層のメディアアクセス制御プロトコルサブレイヤーでMACアドレスが使用されます。

MACアドレスは、ほとんどの場合、ネットワークインターフェイスカードの製造元によって割り当てられます。それぞれは、カードの読み取り専用メモリなどのハードウェアまたはファームウェアメカニズムによって格納されます。

次の関数getPhysicalAddress()を使用して、MACアドレスのリストを取得します。

static String format = "%02X"; // To get 2 char output.
private static String[] getPhysicalAddress() throws Exception{
    try {
        // DHCP Enabled - InterfaceMetric
        Set<String> macs = new LinkedHashSet<String>();

        Enumeration<NetworkInterface> nis = NetworkInterface.getNetworkInterfaces();
        while( nis.hasMoreElements() ) {
            NetworkInterface ni = nis.nextElement();
            byte mac [] = ni.getHardwareAddress(); // Physical Address (MAC - Medium Access Control)
            if( mac != null ) {
                final StringBuilder macAddress = new StringBuilder();
                for (int i = 0; i < mac.length; i++) {
                    macAddress.append(String.format("%s"+format, (i == 0) ? "" : ":", mac[i]) );
                    //macAddress.append(String.format(format+"%s", mac[i], (i < mac.length - 1) ? ":" : ""));
                }
                System.out.println(macAddress.toString());
                macs.add( macAddress.toString() );
            }
        }
        return macs.toArray( new String[0] );
    } catch( Exception ex ) {
        System.err.println( "Exception:: " + ex.getMessage() );
        ex.printStackTrace();
    }
    return new String[0];
}
public static void main(String[] args) throws Exception {
    InetAddress localHost = InetAddress.getLocalHost();
    System.out.println("Host/System Name : "+ localHost.getHostName());
    System.out.println("Host IP Address  : "+ localHost.getHostAddress());

    String macs2 [] = getPhysicalAddress();
    for( String mac : macs2 )
        System.err.println( "MacAddresses = " + mac );
}

上記の関数は ipconfig/all|find "Physical Address" >>MV-mac.txt

D:\>ipconfig /all|find "Physical Address"
   Physical Address. . . . . . . . . : 94-57-A6-00-0C-BB
   Physical Address. . . . . . . . . : 01-FF-60-93-0B-88
   Physical Address. . . . . . . . . : 62-B8-9A-2B-F3-87
   Physical Address. . . . . . . . . : 60-B8-9A-2B-F3-87
   Physical Address. . . . . . . . . : 60-B8-9A-2B-F3-87

IEEEはOSIデータリンク層を分割します は、2つの別々のサブ層に分割します。

  • 論理リンク制御(LLC):ネットワーク層までの移行
  • MAC:物理層への移行 画像参照

getmac

ローカルまたはネットワークを介して、各コンピューターのすべてのネットワークカードのメディアアクセス制御(MAC)アドレスと各アドレスに関連付けられたネットワークプロトコルのリストを返します。

D:\>getmac /fo csv /nh

NET START コマンド

D:\>netsh interface ipv4 show addresses
0
Yash

here のコードをクリーンアップしました:

import Java.net.InetAddress;
import Java.net.NetworkInterface;
import Java.net.SocketException;
import Java.net.UnknownHostException;

public class HardwareAddress
{
    public static String getMacAddress() throws UnknownHostException,
            SocketException
    {
        InetAddress ipAddress = InetAddress.getLocalHost();
        NetworkInterface networkInterface = NetworkInterface
                .getByInetAddress(ipAddress);
        byte[] macAddressBytes = networkInterface.getHardwareAddress();
        StringBuilder macAddressBuilder = new StringBuilder();

        for (int macAddressByteIndex = 0; macAddressByteIndex < macAddressBytes.length; macAddressByteIndex++)
        {
            String macAddressHexByte = String.format("%02X",
                    macAddressBytes[macAddressByteIndex]);
            macAddressBuilder.append(macAddressHexByte);

            if (macAddressByteIndex != macAddressBytes.length - 1)
            {
                macAddressBuilder.append(":");
            }
        }

        return macAddressBuilder.toString();
    }
}
0
BullyWiiPlaza

@Jesus Flores、まだ私のために働いていない、このコード:

element.getHardwareAddress().length > 0 

例外をスローしています。 nullをチェックする必要があります。私のために働いているあなたの場合の最終的な解決策:

            while (addresses.hasMoreElements()
                    && element.getHardwareAddress() != null
                    && element.getHardwareAddress().length > 0
                    && !isVMMac(element.getHardwareAddress())) {
                final InetAddress ip = addresses.nextElement();
                if (ip instanceof Inet4Address) {
                    // || ip instanceof Inet6Address
                    if (ip.isSiteLocalAddress()) {
                        ipAddress = ip.getHostAddress();
                        lanIp = InetAddress.getByName(ipAddress);
                    }
                }
            }

私は常にwi-fiで作業しています。

0
vdizdarevic