Java获取本机Mac地址

REF:
https://blog.youkuaiyun.com/weixin_43760864/article/details/111293912

获取本机Mac地址

优先级1:有线接口(排除虚拟接口)
优先级2:无线接口(排除虚拟接口)
优先级3:虚拟接口


import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Arrays;
import java.util.Collections;
import java.util.Enumeration;
import java.util.List;

public class PrioritizedMacAddress {

    public static void main(String[] args) {
        String macAddress = getMACAddress();
        System.out.println("本机MAC地址:" + macAddress);
    }

    public static String getMACAddress() {
        // 优先级1:有线接口(排除虚拟接口)
        String mac = findMacAddress(
            Arrays.asList("eth", "en", "本地连接"),  // 有线接口常见名称
            Arrays.asList("vm", "vbox", "virtual", "wsl") // 虚拟接口排除列表
        );

        // 优先级2:无线接口(排除虚拟接口)
        //if (mac == null) {
        if (mac == null) {
            mac = findMacAddress(
                Arrays.asList("wlan", "wi-fi", "wl"),    // 无线接口常见名称
                Arrays.asList("vm", "vbox", "virtual", "wsl")
            );
        }

        // 优先级3:虚拟接口
        if (mac == null) {
            mac = findMacAddress(
                Arrays.asList("vm", "vbox", "virtual", "wsl"), // 虚拟接口标识
                Collections.emptyList() // 不排除任何接口
            );
        }

        return mac != null ? mac : "未找到有效MAC地址";
    }

    /**
     * 根据接口名称特征查找MAC地址
     * @param includeKeywords 接口名称包含的关键字(OR逻辑)
     * @param excludeKeywords 接口名称排除的关键字(OR逻辑)
     */
    private static String findMacAddress(List<String> includeKeywords, List<String> excludeKeywords) {
        try {
            Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
            while (interfaces.hasMoreElements()) {
                NetworkInterface networkInterface = interfaces.nextElement();

                // 基础过滤:回环接口、未启用接口、无效MAC
                if (networkInterface.isLoopback() ||
                    !networkInterface.isUp() ||
                    networkInterface.getHardwareAddress() == null) {
                    continue;
                }

                // MAC地址有效性检查
                byte[] macBytes = networkInterface.getHardwareAddress();
                if (macBytes.length != 6) continue;

                // 接口名称处理
                String interfaceName = networkInterface.getName().toLowerCase();

                // 包含关键字检查
                boolean containsInclude = includeKeywords.stream()
                    .anyMatch(keyword -> interfaceName.contains(keyword.toLowerCase()));

                // 排除关键字检查
                boolean containsExclude = excludeKeywords.stream()
                    .anyMatch(keyword -> interfaceName.contains(keyword.toLowerCase()));

                if (containsInclude && !containsExclude) {
                    // 格式转换:字节转十六进制
                    StringBuilder sb = new StringBuilder();
                    for (int i = 0; i < macBytes.length; i++) {
                        sb.append(String.format("%02X%s",
                            macBytes[i] & 0xFF,
                            (i < macBytes.length - 1) ? ":" : "")
                        );
                    }
                    return sb.toString();
                }
            }
        } catch (SocketException e) {
            e.printStackTrace();
        }
        return null;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值