您的位置:首页 > 编程语言 > Java开发

Java获得CPU序列号和网卡Mac地址

2009-07-15 10:16 435 查看
package cn.com.MAC;
/**
* 利用Runtime call操作系统的命令,具体的命令取决于不同的操作系统,注意不要调用Runtime.getRuntime().exec(String)接口,要用 Runtime.getRuntime().exec(String[])这个接口,不然复杂命令的执行会有问题。例子如下(拿cpu个数,其他类似):
* 定义命令:
* WindowsCmd ="cmd.exe /c echo %NUMBER_OF_PROCESSORS%";//windows的特殊
* SolarisCmd = {"/bin/sh", "-c", "/usr/sbin/psrinfo | wc -l"};
* AIXCmd = {"/bin/sh", "-c", "/usr/sbin/lsdev -Cc processor | wc -l"};
* HPUXCmd = {"/bin/sh", "-c", "echo /"map/" | /usr/sbin/cstm | grep CPU | wc -l "};
* LinuxCmd = {"/bin/sh", "-c", "cat /proc/cpuinfo | grep ^process | wc -l"};
*
* 然后判断系统:
* os = System.getProperty("os.name").toLowerCase();
* 根据不同的操作系统call不同的命令。
*/
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
public class GetMACAddress {
public String getMACAddress(String ipAddress) {
String str = "", strMAC = "", macAddress = "";
try {
Process pp = Runtime.getRuntime().exec("nbtstat -a " + ipAddress);
InputStreamReader ir = new InputStreamReader(pp.getInputStream());
LineNumberReader input = new LineNumberReader(ir);
for (int i = 1; i < 100; i++) {
str = input.readLine();
if (str != null) {
if (str.indexOf("MAC Address") > 1) {
strMAC = str.substring(str.indexOf("MAC Address") + 14,
str.length());
break;
}
}
}
} catch (IOException ex) {
return "Can't Get MAC Address!";
}
//
if (strMAC.length() < 17) {
return "Error!";
}
macAddress = strMAC.substring(0, 2) + ":" + strMAC.substring(3, 5)
+ ":" + strMAC.substring(6, 8) + ":" + strMAC.substring(9, 11)
+ ":" + strMAC.substring(12, 14) + ":"
+ strMAC.substring(15, 17);
//
return macAddress;
}
public static void main(String[] args) {
GetMACAddress getMACAddress = new GetMACAddress();
//System.out.println(getMACAddress.getMACAddress("172.18.8.225"));//00-50-56-C0-00-08
System.out.println("MAC地址:"+getMACAddress.getMACAddress("192.168.0.101"));
try {
java.lang.Process proc = Runtime.getRuntime().exec("ipconfig /all");
InputStream istr = proc.getInputStream();
byte[] data = new byte[1024];
istr.read(data);
String netdata = new String(data);
System.out.println("Your Mac Address=" + procAll(netdata));
} catch (IOException e) {
System.out.println("error=" + e);
}
}
public static String procAll(String str) {
return procStringEnd(procFirstMac(procAddress(str)));
}
public static String procAddress(String str) {
int indexof = str.indexOf("Physical Address");
if (indexof > 0) {
return str.substring(indexof, str.length());
}
return str;
}
public static String procFirstMac(String str) {
int indexof = str.indexOf(":");
if (indexof > 0) {
return str.substring(indexof + 1, str.length()).trim();
}
return str;
}
public static String procStringEnd(String str) {
int indexof = str.indexOf("/r");
if (indexof > 0) {
return str.substring(0, indexof).trim();
}
return str;
}
}


 

按照这个方法可以获取本地MAC地址,不管你是否安装虚拟机都可以获取“真正的”MAC地址,方法:

System.out.println("MAC地址:"+getMACAddress.getMACAddress("192.168.0.101"));

 

还有如下一种方法:

package cn.com.e52.util;
import java.io.*;
import java.util.*;
import java.util.regex.*;
public class HardwareID {
String IPCONFIG_COMMAND_WIN = "ipconfig   /all";
boolean realMac = true;
String unique = "";
public static String getMacAddress() {
HardwareID hwid = new HardwareID();
String aa[]=hwid.getUnique().trim().split("#");
return aa[2];
//return hwid.getUnique().trim();
}
private String getUnique() {
String os = System.getProperty("os.name");
if (os.startsWith("Windows")) {
return getUniqueWindows();
} else {
return "";
}
}
private String getUniqueWindows() {
// 运行控制台命令,返回结果字符串
String ipConfigResponse = null;
try {
ipConfigResponse = runConsoleCommand(IPCONFIG_COMMAND_WIN);
} catch (IOException e) {
e.printStackTrace();
}
// 按行分割结果字符串,并循环判断每个字符串直道找出 Mac 地址
StringTokenizer tokenizer = new StringTokenizer(ipConfigResponse, "/n");
while (tokenizer.hasMoreTokens()) {
String line = tokenizer.nextToken().trim();
// 获取每行 ":" 后的字符串
int macAddressPosition = line.indexOf(":");
if (macAddressPosition <= 0) {
continue;
}
String macAddressCandidate = line.substring(macAddressPosition + 1)
.trim();
// 检查 macAddressCandidate 中内容是否为真实网卡 Mac 地址,根据 Mac 地址计算出唯一标识。
if (isMacAddWin(macAddressCandidate)) {
if (realMac == true) {
generateUnique(macAddressCandidate);
} else {
realMac = true;
}
}
}
return unique;
}
/**
* 运行控制台命令,返回结果字符串
*
* @param command
*            String
* @return String
* @throws IOException
*/
private String runConsoleCommand(String command) throws IOException {
Process p = Runtime.getRuntime().exec(command);
InputStream stdoutStream = new BufferedInputStream(p.getInputStream());
StringBuffer buffer = new StringBuffer();
while (true) {
int c = stdoutStream.read();
if (c == -1) {
break;
}
buffer.append((char) c);
}
String outputText = buffer.toString();
stdoutStream.close();
return outputText;
}
/**
* 对输入参数进行检查,符合正则表达式的为 windows 平台下有效 Mac 地址
*
* @param macAddressCandidate
*            String
* @return boolean
*/
private boolean isMacAddWin(String macAddressCandidate) {
Pattern macPattern = Pattern
.compile("[0-9a-fA-F]{2}-[0-9a-fA-F]{2}-[0-9a-fA-F]{2}-[0-9a-fA-F]{2}-[0-9a-fA-F]{2}-[0-9a-fA-F]{2}");
Matcher m = macPattern.matcher(macAddressCandidate);
return m.matches();
}
//	/**
//	 * 对输入参数进行检查,符合长度的为 MAC OS X 下有效网卡 Mac 地址
//	 *
//	 * @param macAddressCandidate
//	 *            String
//	 * @return boolean
//	 */
//	private boolean isMacAddOSX(String macAddressCandidate) {
//		if (macAddressCandidate.length() != 17) {
//			return false;
//		} else {
//			return true;
//		}
//	}
/**
* 产生 Unique
*
* @param macAddress
*            String
*/
private void generateUnique(String macAddress) {
if (unique == "") {
unique += macAddress;
} else {
unique += "#";
unique += macAddress;
}
}
public static void main(String[] args) {
System.out.println(HardwareID.getMacAddress()); //这里做了一次处理,主要是我这里安装了虚拟机,有多个MAC地址。
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息