当前位置: 首页 > news >正文

Java获取本机Mac地址

REF:
https://blog.csdn.net/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;
    }
}

相关文章:

  • C++string类
  • Pandas使用教程 - Pandas 与 Web API 交互
  • 从零开始的kafka学习 (一)| 概念,Java API
  • 【QT线程】子线程阻塞主线程的一次网络api请求案例
  • 机试准备第六天
  • [MySQL] MySQL复合查询(多表查询、子查询)
  • 各种传参形式
  • C++/C 编程宝典:掌握指针数组与数组指针的关键区别
  • PHP学习
  • SFP+(Enhanced Small Form-factor Pluggable)详解
  • 在Pycharm中将ui文件修改为py文件
  • Code Review 是一场不断完善自己修行
  • 晋升系列3:面评技巧
  • 【爬虫基础】第二部分 爬虫基础理论 P3/3
  • EA SPORTS FC 25 2000+ 大型MOD整合包
  • 数据库操作与数据管理——Rust 与 SQLite 的集成
  • Python 数据结构 4.单向链表
  • 测试人员如何驱动开发?
  • 【踩坑随笔】`npm list axios echarts`查看npm依赖包报错
  • ZYNQ-PL实践课堂(三)IP核之MMCM/PLL
  • 网站做备案/关键词网站推广
  • 标识设计公司网站/识别关键词软件
  • 做一元夺宝网站需要什么条件/谷歌seo排名优化
  • 徐州网站制作需要多少钱/怎样淘宝seo排名优化
  • 今日新开网站/百度统计app下载
  • 陕西做网站公司哪家好/无锡百度竞价公司