【转】java:多网卡环境下获取MAC地址
http://blog.csdn.net/10km/article/details/78569962
JDK6以后 java.net.NetworkInterface提供了完整的方法用于获取网络设备信息。
调用 NetworkInterface.getNetworkInterfaces()可以返回所有网络设备
调用NetworkInterface.getHardwareAddress()就可以获取指定网卡的MAC.
下面的完整代码基于NetworkInterface提供了getNICs方法用于获取指定类型设备,通过指定不同的过滤器(Filter.UP,Filter.ALL…)的组合实现过滤条件订制。
提供getMacAddress方法用于获取指定设备的MAC地址
NetworkUtil.java
package net.gdface.facelog.device; import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Iterator;
import java.util.List;
import java.util.Set; import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterators; import com.google.common.base.Predicates; import com.google.common.base.Joiner;
import com.google.common.base.Predicate;
import com.google.common.collect.Lists;
import com.google.common.primitives.Bytes; import com.google.common.base.Function; /**
* @author guyadong
*
*/
public class NetworkUtil {
public static enum Radix{
/** 二进制 */BIN(2),
/** 十进制 */DEC(10),
/** 十六进制 */HEX(16);
final int value;
Radix(int radix){
this.value = radix;
}
}
public static enum Filter implements Predicate<NetworkInterface>{
/** 过滤器: 所有网卡 */ALL,
/** 过滤器: 在线设备,see also {@link NetworkInterface#isUp()} */UP,
/** 过滤器: 虚拟接口,see also {@link NetworkInterface#isVirtual()} */VIRTUAL,
/** 过滤器:LOOPBACK, see also {@link NetworkInterface#isLoopback()} */LOOPBACK,
/** 过滤器:物理网卡 */PHYICAL_ONLY; @Override
public boolean apply(NetworkInterface input) {
if(null == input ){
return false;
}
try{
byte[] hardwareAddress;
switch(this){
case UP:
return input.isUp();
case VIRTUAL:
return input.isVirtual();
case LOOPBACK:
return input.isLoopback();
case PHYICAL_ONLY :
hardwareAddress = input.getHardwareAddress();
return null != hardwareAddress
&& hardwareAddress.length > 0
&& !input.isVirtual()
&& !isVMMac(hardwareAddress);
case ALL:
default :
return true;
}
} catch (SocketException e) {
throw new RuntimeException(e);
}
}
}
/**
* 根据过滤器{@code filters}指定的条件(AND)返回网卡设备对象
* @param filters
* @return
*/
@SafeVarargs
@SuppressWarnings("unchecked")
public static Set<NetworkInterface> getNICs(Predicate<NetworkInterface> ...filters) {
if(null == filters){
filters = new Predicate[]{Filter.ALL};
}
try {
Iterator<NetworkInterface> filtered = Iterators.filter(
Iterators.forEnumeration(NetworkInterface.getNetworkInterfaces()),
Predicates.and(filters));
return ImmutableSet.copyOf(filtered);
} catch (SocketException e) {
throw new RuntimeException(e);
}
}
/**
* 返回所有物理网卡
* @return
*/
public static Set<NetworkInterface> getPhysicalNICs() {
return getNICs(Filter.PHYICAL_ONLY,Filter.UP);
}
/**
* 将{@code byte[]} 转换为{@code radix}指定格式的字符串
*
* @param source
* @param separator 分隔符
* @param radix 进制基数
* @return {@code source}为{@code null}时返回空字符串
*/
public static final String format(byte[] source,String separator, final Radix radix) {
if (null == source){
return "";
}
if(null == separator){
separator = "";
}
List<String> hex = Lists.transform(Bytes.asList(source),new Function<Byte,String>(){
@Override
public String apply(Byte input) {
return String.copyValueOf(new char[]{
Character.forDigit((input & 240) >> 4, radix.value),
Character.forDigit(input & 15, radix.value)
});
}});
return Joiner.on(separator).join(hex);
}
/**
* MAC地址格式(16进制)格式化{@code source}指定的字节数组
* @see #format(byte[], String, int)
*/
public static final String formatMac(byte[] source,String separator) {
return format(source,separator,Radix.HEX);
}
/**
* 以IP地址格式(点分位)格式化{@code source}指定的字节数组<br>
* @see #format(byte[], String, int)
*/
public static final String formatIp(byte[] source) {
return format(source,".",Radix.DEC);
}
/**
* 返回指定{@code address}绑定的网卡的物理地址(MAC)
* @param address
* @return 指定的{@code address}没有绑定在任何网卡上返回{@code null}
* @see {@link NetworkInterface#getByInetAddress(InetAddress)}
* @see {@link NetworkInterface#getHardwareAddress()}
*/
public static byte[] getMacAddress(InetAddress address) {
try {
NetworkInterface nic = NetworkInterface.getByInetAddress(address);
return null == nic ? null : nic.getHardwareAddress();
} catch (SocketException e) {
throw new RuntimeException(e);
}
}
/**
* @param nic 网卡对象
* @param separator 格式化分隔符
* @return 表示MAC地址的字符串
*/
public static String getMacAddress(NetworkInterface nic,String separator) {
try {
return format(nic.getHardwareAddress(),separator, Radix.HEX);
} catch (SocketException e) {
throw new RuntimeException(e);
}
}
/**
* 参见 {@link #getMacAddress(InetAddress)}
* @param address
* @param separator 格式化分隔符
* @return 表示MAC地址的字符串
*/
public static String getMacAddress(InetAddress address,String separator) {
return format(getMacAddress(address),separator, Radix.HEX);
}
private static 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
};
private static boolean isVMMac(byte[] mac) {
if(null == mac) {
return false;
} for (byte[] invalid: invalidMacs){
if (invalid[0] == mac[0] && invalid[1] == mac[1] && invalid[2] == mac[2]) {
return true;
}
} return false;
} }
【转】java:多网卡环境下获取MAC地址的更多相关文章
- Java根据ip地址获取Mac地址,Java获取Mac地址
Java根据ip地址获取Mac地址,Java获取Mac地址 >>>>>>>>>>>>>>>>>&g ...
- Java -- 获取MAC地址
啦啦啦 package com.xindatai.common.util; import java.io.InputStream; import java.util.regex.Matcher; im ...
- CDN 环境下获取用户IP方法
CDN 环境下获取用户IP方法 1 cdn 自定义header头的X-Real-IP,在后端使用$http_x_real_ip获得 proxy_set_header X-Real-IP $remote ...
- windows下获取IP地址的两种方法
windows下获取IP地址的两种方法: 一种可以获取IPv4和IPv6,但是需要WSAStartup: 一种只能取到IPv4,但是不需要WSAStartup: 如下: 方法一:(可以获取IPv4和I ...
- c# 获取mac地址的2种方法
和大家分享下,互相学习一下吧.第一个获取方法好像获取不到mac地址,我用了第二种方法可以获取到.希望知道的可以说下为什么. 1,首先要添加引用:using System.Management; 2,代 ...
- android获取Mac地址和IP地址
获取Mac地址实际项目中测试了如下几种方法:(1)设备开通Wifi连接,获取到网卡的MAC地址(但是不开通wifi,这种方法获取不到Mac地址,这种方法也是网络上使用的最多的方法) //根据Wifi信 ...
- C++获得本机所有网卡的IP和MAC地址信息
一台机器上可能不只有一个网卡,但每一个网卡只有一个MAC地址,而每一个网卡可能配置有多个IP地址:如平常的笔记本电脑中,就会有无线网卡和有线网卡(网线接口)两种:因此,如果要获得本机所有网卡的IP和M ...
- 【转载】获取MAC地址方法大全
From:http://blog.csdn.net/han2814675/article/details/6223617 Windows平台下用C++代码取得机器的MAC地址并不是一件简单直接的事情. ...
- 【转载】VC获取MAC地址的4种方法
From:http://blog.csdn.net/pdfmaker/article/details/465748 有需求才有创造,有了问题才会想着去解决,那么我这里的获取MAC地址的第4种方法也是在 ...
随机推荐
- 移动web前端开发小结
注意:Chrome模拟手机的显示的界面是有误差的,强烈建议一定要在真机测试自己的移动端页面(以移动端页面为准). 1.页面高度渲染错误,页面的高度是否包含了导航,(华为手机就是偏偏有底部菜单) 设置窗 ...
- Hadoop架构的初略总结(1)
Hadoop架构的初略总结(1) Hadoop是一个开源的分布式系统基础架构,此架构可以帮助用户可以在不了解分布式底层细节的情况下开发分布式程序. 首先我们要理清楚几个问题. 1.我们为什么需要Had ...
- 用日志记录Linux用户执行的每一条命令(history)
工作中,需要把用户执行的每一个命令都记录下来,并发送到日志服务器的需求,为此我做了一个简单的解决方案.这个方案会在每个用户退出登录 时把用户所执行的每一个命令都发送给日志守护进程rsyslogd,你也 ...
- 洛谷9月月赛round2
洛谷9月月赛2 t1 题意:懒得说了 分析:模拟 代码: program flag; var a:..,..]of char; n,i,m,j,x,y,ans,k:longint; begin ass ...
- 【bzoj1041】[HAOI2008]圆上的整点 数论
题目描述 求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数. 输入 只有一个正整数n,n<=2000 000 000 输出 整点个数 样例输入 4 样例输出 4 题解 数 ...
- BZOJ 4827 [Hnoi2017]礼物 ——FFT
题目上要求一个循环卷积的最小值,直接破环成链然后FFT就可以了. 然后考虑计算的式子,可以分成两个部分分开计算. 前半部分FFT,后半部分扫一遍. #include <map> #incl ...
- BZOJ3998 [TJOI2015]弦论 【后缀自动机】
题目 对于一个给定长度为N的字符串,求它的第K小子串是什么. 输入格式 第一行是一个仅由小写英文字母构成的字符串S 第二行为两个整数T和K,T为0则表示不同位置的相同子串算作一个.T=1则表示不同位置 ...
- 3973: seq
3973: seq 题目描述 小y 的男朋友送给小y 一个数列{ai}{ai},并且刁难小y 要她维护这个序列. 具体而言,小y 的男朋友要求小y 完成两个操作: 1. 修改数列中的一个数 2. 设p ...
- source ~/.bashrc 什么意思
source:使当前shell读入路径为filepath的shell文件并依次执行文件中的所有语句,通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录 https://www.cn ...
- 解决IIS无法访问远程映射目录
由于影像系统(PACS)需要存储大量影像文件动辄几十T,所以经常会用到远程影像的独立文件盘, 挂载了远程映射盘后,本机可以直接访问 IIS中就直接报错了 . A机器:IIS WEB服务器 B机器:文件 ...