通过IP获取局域网内手机的NetworkInterface时总返回null
现在通过路由器已知手机的ip是192.168.1.100,用这个IP通过下面的代码获得的NetworkInterface总为null。
但是,局域网内运行此代码的台式机的IP为192.168.1.110,用这个IP通过下面的代码获得的NetworkInterface就正常,也能获得对应的MAC地址。请问这是怎么回事?
public static void main(String[] args) throws Exception
{
String ip123 = "192.168.1.";
boolean found = false;
for (int ip4 = 100; ip4 < 200; ++ip4)
{
String curIp = ip123 + ip4;
NetworkInterface ni;
try
{
InetAddress ia = InetAddress.getByName(curIp);
ni = NetworkInterface.getByInetAddress(ia);
}
catch (Exception e)
{
System.out.println("IP地址:" + curIp + "非法。");
continue;
}
if (null == ni)
{
continue;
}
else
{
String macStr = "";
byte[] mac = ni.getHardwareAddress();
for (int i = 0; i < mac.length; ++i)
{
if (i != 0)
{
macStr += "-";
}
//mac[i] & 0xFF 是为了把byte转化为正整数
String curMacSection = Integer.toHexString(mac[i] & 0xFF);
macStr += curMacSection;
}
String targetMac = "5C-E8-EB-BA-F3-D8";
if (0 == macStr.compareToIgnoreCase(targetMac))
{
//在Windows资源管理器中打开ftp地址。
String cmd = "explorer ftp://" + curIp + ":2121";
Runtime.getRuntime().exec(cmd);
found = true;
break;
}
}
}
if (!found)
{
System.out.println("没有找到目标客户端。");
}
}
package com;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
public Test() {
}
public static void main(String[] args) {
System.out.println(getMacAddress("192.168.1.100"));
}
public static String getMacAddress(String ip) {
String macAddress = "";
macAddress = getMacInWindows(ip).trim();
if (macAddress == null
[解决办法]
"".equals(macAddress)) {
macAddress = getMacInLinux(ip).trim();
}
return macAddress;
}
public static String getMacInLinux(final String ip) {
String result = "";
String[] cmd = { "/bin/sh", "-c", "ping " + ip + " -c 2 && arp -a" };
String cmdResult = callCmd(cmd);
result = filterMacAddress(ip, cmdResult, ":");
return result;
}
public static String callCmd(String[] cmd) {
String result = "";
String line = "";
try {
Process proc = Runtime.getRuntime().exec(cmd);
InputStreamReader is = new InputStreamReader(proc.getInputStream());
BufferedReader br = new BufferedReader(is);
while ((line = br.readLine()) != null) {
result += line;
}
}
catch (Exception e) {
e.printStackTrace();
}
return result;
}
public static String callCmd(String[] cmd, String[] another) {
String result = "";
String line = "";
try {
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec(cmd);
proc.waitFor(); // 已经执行完第一个命令,准备执行第二个命令
proc = rt.exec(another);
InputStreamReader is = new InputStreamReader(proc.getInputStream());
BufferedReader br = new BufferedReader(is);
while ((line = br.readLine()) != null) {
result += line;
}
}
catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
*
*
*
* @param ip
* 目标ip,一般在局域网内
*
* @param sourceString
* 命令处理的结果字符串
*
* @param macSeparator
* mac分隔符号
*
* @return mac地址,用上面的分隔符号表示
*/
public static String filterMacAddress(final String ip,
final String sourceString, final String macSeparator) {
String result = "";
String regExp = "((([0-9,A-F,a-f]{1,2}" + macSeparator
+ "){1,5})[0-9,A-F,a-f]{1,2})";
Pattern pattern = Pattern.compile(regExp);
Matcher matcher = pattern.matcher(sourceString);
while (matcher.find()) {
result = matcher.group(1);
if (sourceString.indexOf(ip) <= sourceString.lastIndexOf(matcher
.group(1))) {
break; // 如果有多个IP,只匹配本IP对应的Mac.
}
}
return result;
}
/**
*
*
*
* @param ip
* 目标ip
*
* @return Mac Address
*
*
*/
public static String getMacInWindows(final String ip) {
String result = "";
String[] cmd = {
"cmd",
"/c",
"ping " + ip
};
String[] another = {
"cmd",
"/c",
"arp -a"
};
String cmdResult = callCmd(cmd, another);
result = filterMacAddress(ip, cmdResult, "-");
return result;
}
}