根据IP获取MAC地址工具类

注意:使用cmd命令的方式根据ip获取mac地址,限制:只能获取局域网内的mac地址


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Properties;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 获取mact地址
 */
public class GetMacAddressUtil {

    public GetMacAddressUtil() {

    }

    public static void main(String[] args) {
        System.out.println(getLocalIpAddress());
    }

    /**
     * 获取本机对应的ip地址
     * 
     * @return ip
     */
    public static String getLocalIpAddress() {
        InetAddress ia = null;
        String localIp = "";
        try {
            ia = InetAddress.getLocalHost();
            localIp = ia.getHostAddress();
            System.out.println("本机的ip是 :" + localIp);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return localIp;
    }

    /**
     * 获取本机对应的mac地址
     * 
     * @return mac
     */
    public static String getLocalMacAddress() {
        String macAddress = "";
        InetAddress inetAddress = null;
        try {
            inetAddress = InetAddress.getLocalHost();
            byte[] mac = NetworkInterface.getByInetAddress(inetAddress).getHardwareAddress();
            // 把mac地址拼装成String
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < mac.length; i++) {
                if (i != 0) {
                    sb.append("-");
                }
                // mac[i] & 0xFF 是为了把byte转化为正整数
                String s = Integer.toHexString(mac[i] & 0xFF);
                sb.append(s.length() == 1 ? 0 + s : s);
            }
            // 把字符串所有小写字母改为大写成为正规的mac地址并返回
            macAddress = sb.toString().trim().toUpperCase();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (SocketException e) {
            e.printStackTrace();
        }
        return macAddress;
    }

    /**
     * 根据ip获取mac地址
     * 
     * @param ip
     *            IP地址
     * @return
     * 
     */
    public static String getMacAddress(String ip) {
        String macAddress = "";
        if (isOSLinux()) {
            macAddress = getMacInLinux(ip).trim();
        } else {
            macAddress = getMacInWindows(ip).trim();
        }
        return macAddress;
    }

    /**
     * 获取linux系统下的mac地址
     * 
     * @param ip
     *            IP地址
     * @return
     * 
     */
    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;
    }

    /**
     * 执行cmd命令
     * 
     * @param cmd
     *            cmd命令
     * @return
     * 
     */
    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;

    }

    /**
     * 执行cmd命令
     * 
     * @param cmd
     *            第一个命令
     * @param another
     *            第二个命令
     * @return
     * 
     */
    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;

    }

    /**
     * 判断是否是linux操作系统
     *
     * @return  boolean
     */
    public static boolean isOSLinux() {
        Properties prop = System.getProperties();

        String os = prop.getProperty("os.name");
        if (os != null && os.toLowerCase().indexOf("linux") > -1) {
            return true;
        } else {
            return false;
        }
    }

}

猜你喜欢

转载自blog.csdn.net/Xuchunyan234/article/details/82116637