忽略MAC地址透传功能 获取扩展坞本身MAC地址的实现方案咨询
戴尔扩展坞原生MAC地址获取方案
问题根源:戴尔笔记本连接戴尔扩展坞默认启用MAC地址透传功能,系统网络接口对外暴露的是笔记本MAC,Java原生NetworkInterfaceAPI只能读取到当前生效的MAC,无法获取扩展坞网卡原生硬件地址
一、系统命令方案(Windows平台)
直接使用PowerShell命令查询网卡永久硬件地址:
Get-NetAdapter | Select-Object Name, PermanentAddress, MacAddress
输出字段说明:
Name:网卡名称,扩展坞网卡一般包含Docking、戴尔扩展坞、USB Ethernet等关键词PermanentAddress:网卡硬件原生MAC地址,即你需要的扩展坞本身MACMacAddress:当前生效的MAC,透传模式下为笔记本MAC
如果是Linux平台,可使用命令:
ethtool -P 网卡名称
二、Java实现方案
Java没有内置读取网卡永久MAC的API,可通过调用上述系统命令解析结果实现,Windows平台示例代码如下:
import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class DockingStationMacReader { // 匹配网卡名称的正则规则 private static final Pattern NAME_PATTERN = Pattern.compile("Name\\s+:\\s+(.*)"); // 匹配网卡永久MAC的正则规则 private static final Pattern PERM_MAC_PATTERN = Pattern.compile("PermanentAddress\\s+:\\s+([A-F0-9]+)"); public static List<String> getDockingNativeMacs() throws Exception { List<String> dockingMacList = new ArrayList<>(); // 构建PowerShell命令 ProcessBuilder processBuilder = new ProcessBuilder( "powershell.exe", "-Command", "Get-NetAdapter | Select-Object Name, PermanentAddress | Format-List" ); processBuilder.redirectErrorStream(true); Process process = processBuilder.start(); BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream(), "GBK")); String line; String currentNicName = null; String currentPermMac = null; while ((line = reader.readLine()) != null) { line = line.trim(); if (line.isEmpty()) { // 单条网卡信息读取完毕,判断是否为扩展坞网卡 if (currentNicName != null && currentPermMac != null && currentPermMac.length() == 12) { // 可根据实际网卡名称调整匹配关键词 if (currentNicName.contains("Docking") || currentNicName.contains("扩展坞") || currentNicName.contains("Dell")) { // 格式化为XX-XX-XX-XX-XX-XX样式 StringBuilder formattedMac = new StringBuilder(); for (int i = 0; i < 12; i += 2) { if (i != 0) formattedMac.append("-"); formattedMac.append(currentPermMac, i, i + 2); } dockingMacList.add(formattedMac.toString()); } } currentNicName = null; currentPermMac = null; continue; } // 匹配网卡名称 Matcher nameMatcher = NAME_PATTERN.matcher(line); if (nameMatcher.matches()) { currentNicName = nameMatcher.group(1); continue; } // 匹配永久MAC Matcher macMatcher = PERM_MAC_PATTERN.matcher(line); if (macMatcher.matches()) { currentPermMac = macMatcher.group(1); } } process.waitFor(); reader.close(); return dockingMacList; } public static void main(String[] args) throws Exception { List<String> macs = getDockingNativeMacs(); for (String mac : macs) { System.out.println("扩展坞原生MAC:" + mac); } } }
注:如果匹配不到对应扩展坞,可先手动执行PowerShell命令确认扩展坞网卡的实际名称,调整代码中的关键词匹配规则即可。
内容的提问来源于stack exchange,提问作者Thorsten
相关产品推荐
相关产品推荐

