使用Java获取本地计算机的MAC地址

发布于 2024-11-10 06:47:25 字数 194 浏览 0 评论 0 原文

我可以用来

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

获取mac地址,但是如果我在离线机器上使用这个代码,它就不起作用了。

那么,如何获取 Mac 地址?

I can use

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

to obtain the mac address, but if I use this code in an offline machine it doesn't work.

So, How can I get the Mac address?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

素食主义者 2024-11-17 06:47:26

另一种方法是通过本机代码执行使用操作系统命令“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());

Another way is to use an OS command 'getmac' through native code execution.

    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());
天暗了我发光 2024-11-17 06:47:26

中型访问控制地址(MAC 地址

设备的 MAC 地址是分配给设备的唯一标识符网络接口控制器 (NIC)。对于网段内的通信,它用作大多数 IEEE 802 网络技术(包括以太网、Wi-Fi 和蓝牙)的网络地址。在开放系统互连 (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|查找“物理地址”>>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 数据链路层 分为两个独立的子层:

  • 逻辑链路控制 (LLC):向上过渡到网络层
  • MAC:向下过渡到物理层 图片参考

getmac

返回媒体访问控制(MAC ) 地址以及与每台计算机中所有网卡的每个地址关联的网络协议列表(本地或跨网络)。

D:\>getmac /fo csv /nh

NET START命令

D:\>netsh interface ipv4 show addresses

Medium access control address (MAC address)

MAC address of a device is a unique identifier assigned to a network interface controller (NIC). For communications within a network segment, it is used as a network address for most IEEE 802 network technologies, including Ethernet, Wi-Fi, and Bluetooth. Within the Open Systems Interconnection (OSI) model, MAC addresses are used in the medium access control protocol sublayer of the data link layer.

MAC addresses are most often assigned by the manufacturer of network interface cards. Each is stored in hardware, such as the card's read-only memory or by a firmware mechanism.

Use the following function getPhysicalAddress() to get list of MAC address:

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

The above function works as 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

The IEEE divides the OSI data link layer into two separate sublayers:

  • Logical link control (LLC): Transitions up to the network layer
  • MAC: Transitions down to the physical layer Image ref

getmac

Returns the media access control (MAC) address and list of network protocols associated with each address for all network cards in each computer, either locally or across a network.

D:\>getmac /fo csv /nh

NET START command

D:\>netsh interface ipv4 show addresses
孤君无依 2024-11-17 06:47:26

科特林:

NetworkInterface.getNetworkInterfaces()
    .asSequence()
    .mapNotNull { ni ->
        ni.hardwareAddress?.joinToString(separator = "-") {
            "%02X".format(it)
        }
    }.toList()

Kotlin:

NetworkInterface.getNetworkInterfaces()
    .asSequence()
    .mapNotNull { ni ->
        ni.hardwareAddress?.joinToString(separator = "-") {
            "%02X".format(it)
        }
    }.toList()
风铃鹿 2024-11-17 06:47:26
public static void main(String[] args){

        InetAddress ip;
        try {

            ip = InetAddress.getLocalHost();
            System.out.println("Current IP address : " + ip.getHostAddress());

            NetworkInterface network = NetworkInterface.getByInetAddress(ip);

            byte[] mac = network.getHardwareAddress();

            System.out.print("Current 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());

        } catch (Exception e) {

            e.printStackTrace();

        }

       }

输出:

Current IP address : 192.168.21.60
Current MAC address : 70-5A-0F-3C-84-F2
public static void main(String[] args){

        InetAddress ip;
        try {

            ip = InetAddress.getLocalHost();
            System.out.println("Current IP address : " + ip.getHostAddress());

            NetworkInterface network = NetworkInterface.getByInetAddress(ip);

            byte[] mac = network.getHardwareAddress();

            System.out.print("Current 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());

        } catch (Exception e) {

            e.printStackTrace();

        }

       }

output:

Current IP address : 192.168.21.60
Current MAC address : 70-5A-0F-3C-84-F2
柒七 2024-11-17 06:47:25

对于 Java 6+,您可以使用 <代码>NetworkInterface.getHardwareAddress

请记住,计算机可以没有网卡,尤其是嵌入式或虚拟计算机。它也可以有多个。您可以使用 NetworkInterface.getNetworkInterfaces()

With Java 6+, you can use NetworkInterface.getHardwareAddress.

Bear in mind that a computer can have no network cards, especially if it's embedded or virtual. It can also have more than one. You can get a list of all network cards with NetworkInterface.getNetworkInterfaces().

柳絮泡泡 2024-11-17 06:47:25

有了我在这里找到的所有可能的解决方案和其他回复,然后我将贡献我的解决方案。您需要使用包含“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;
    }

}

更新于 02/05/2017: 感谢 @mateuscb 在帖子 如何用 Java 确定 Internet 网络接口不幸的是,之前该帖子没有得到任何赞成票,但他对此更新做出了贡献。

改进方法可以跳过虚拟机网卡(最流行的VM软件)

With all the possible solutions that i've found here and another replies, then i will contribute with my solution. You need to specify a parameter with a String containing "ip" or "mac" depending on what you need to check. If the computer has no interface, then it will return an String containing null, otherwise will return a String containing what you asked for (the ip address or the mac).

How to use it:

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

Result (if the computer has a network card):

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

Result (if the computer doesn't have a network card):

Ip: null
Mac: null

Here's the code:

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

}

UPDATED 02/05/2017: Thanks to @mateuscb on the post How to Determine Internet Network Interface in Java that unfortunately didn't get any upvote on that post before, but he contributed to this update.

The method has been improved to skip virtual machine network cards (most popular VM software)

君勿笑 2024-11-17 06:47:25

至于离线的计算机,通常没有分配IP,因为DHCP被广泛使用......

而对于标题中的问题:
NetworkInterface.getHardwareAddress( )

As for the computer being offline, it usually doesn't have an IP assigned, because DHCP is widely used...

And for the question in the title:
NetworkInterface.getHardwareAddress()

放我走吧 2024-11-17 06:47:25

试试这个:

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

Try this:

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());
相思故 2024-11-17 06:47:25

此处清理代码:

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

Cleaned up code from 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();
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文