JAVA獲取本地,遠程macAddress – JAVA編程語言程序開發技術文章

獲取本地macAddress
Java代碼 
import java.io.InputStreamReader; 
import java.io.LineNumberReader; 
 
 
public class LocalMacAddr 

    public String getMACAddr() 
    { 
        String mac = ""; 
        try 
        { 
            Process process = Runtime.getRuntime().exec("ipconfig /all"); 
            InputStreamReader ir = new InputStreamReader(process.getInputStream()); 
            LineNumberReader input = new LineNumberReader(ir); 
            String line = null; 
            while ((line = input.readLine()) != null) 
            { 
                if (line.indexOf("Physical Address") > 0) 
                { 
                    mac = line.substring(line.indexOf("-") – 2); 
                } 
            } 
        } 
        catch (Exception e) 
        { 
            e.printStackTrace(); 
        } 
        return mac; 
    } 
     
    public static void main(String[] args) 
    { 
        LocalMacAddr ma = new LocalMacAddr(); 
        System.out.println(ma.getMACAddr()); 
    } 
 

 
獲取遠程macAddress
Java代碼 
import java.io.IOException; 
import java.net.DatagramPacket; 
import java.net.DatagramSocket; 
import java.net.InetAddress; 
 
public class RemoteMacAddr 

    private String sRemoteAddr; 
    private int iRemotePort = 137; 
    private byte[] buffer = new byte[1024]; 
    private DatagramSocket ds = null; 
 
    public RemoteMacAddr(String strAddr) throws Exception 
    { 
        this.sRemoteAddr = strAddr; 
        this.ds = new DatagramSocket(); 
    } 
 
    private DatagramPacket send(byte[] b) throws IOException 
    { 
        DatagramPacket dp = new DatagramPacket(b, b.length, InetAddress.getByName(sRemoteAddr), iRemotePort); 
        ds.send(dp); 
        return dp; 
    } 
 
    private DatagramPacket receive() throws Exception 
    { 
        DatagramPacket dp = new DatagramPacket(buffer, buffer.length); 
        ds.receive(dp); 
        return dp; 
    } 
 
    // 詢問包結構: 
    // Transaction ID 兩字節(16位) 0x00 0x00 
    // Flags 兩字節(16位) 0x00 0x10 
    // Questions 兩字節(16位) 0x00 0x01 
    // AnswerRRs 兩字節(16位) 0x00 0x00 
    // AuthorityRRs 兩字節(16位) 0x00 0x00 
    // AdditionalRRs 兩字節(16位) 0x00 0x00 
    // Name:array [1..34] 0x20 0x43 0x4B 0x41(30個) 0x00 ; 
    // Type:NBSTAT 兩字節 0x00 0x21 
    // Class:INET 兩字節(16位)0x00 0x01 
    private byte[] GetQueryCmd() throws Exception 
    { 
        byte[] t_ns = new byte[50]; 
        t_ns[0] = 0x00; 
        t_ns[1] = 0x00; 
        t_ns[2] = 0x00; 
        t_ns[3] = 0x10; 
        t_ns[4] = 0x00; 
        t_ns[5] = 0x01; 
        t_ns[6] = 0x00; 
        t_ns[7] = 0x00; 
        t_ns[8] = 0x00; 
        t_ns[9] = 0x00; 
        t_ns[10] = 0x00; 
        t_ns[11] = 0x00; 
        t_ns[12] = 0x20; 
        t_ns[13] = 0x43; 
        t_ns[14] = 0x4B; 
        for (int i = 15; i < 45; i++) 
        { 
            t_ns[i] = 0x41; 
        } 
        t_ns[45] = 0x00; 
        t_ns[46] = 0x00; 
        t_ns[47] = 0x21; 
        t_ns[48] = 0x00; 
        t_ns[49] = 0x01; 
        return t_ns; 
    } 
 
    // 表1 “UDP-NetBIOS-NS”應答包的結構及主要字段一覽表 
    // 序號 字段名 長度 
    // 1 Transaction ID 兩字節(16位) 
    // 2 Flags 兩字節(16位) 
    // 3 Questions 兩字節(16位) 
    // 4 AnswerRRs 兩字節(16位) 
    // 5 AuthorityRRs 兩字節(16位) 
    // 6 AdditionalRRs 兩字節(16位) 
    // 7 Name<Workstation/Redirector> 34字節(272位) 
    // 8 Type:NBSTAT 兩字節(16位) 
    // 9 Class:INET 兩字節(16位) 
    // 10 Time To Live 四字節(32位) 
    // 11 Length 兩字節(16位) 
    // 12 Number of name 一個字節(8位) 
    // NetBIOS Name Info 18×Number Of Name字節 
    // Unit ID 6字節(48位 
    private String GetMacAddr(byte[] b) throws Exception 
    { 
        // 獲取計算機名 
        //System.out.println(new String(b, 57, 18)); 
        //System.out.println(new String(b, 75, 18)); 
        //System.out.println(new String(b, 93, 18)); 
        int i = b[56] * 18 + 56; 
        String sAddr = ""; 
        StringBuffer sb = new StringBuffer(17); 
        // 先從第56字節位置,讀出Number Of Names(NetBIOS名字的個數,其中每個NetBIOS Names 
        // Info部分占18個字節) 
        // 然後可計算出“Unit ID”字段的位置=56+Number Of 
        // Names×18,最後從該位置起連續讀取6個字節,就是目的主機的MAC地址。 
        for (int j = 1; j < 7; j++) 
        { 
            sAddr = Integer.toHexString(0xFF & b[i + j]); 
            if (sAddr.length() < 2) 
            { 
                sb.append(0); 
            } 
            sb.append(sAddr.toUpperCase()); 
            if (j < 6) 
                sb.append('-'); 
        } 
        return sb.toString(); 
    } 
 
    private void close() 
    { 
        try 
        { 
            ds.close(); 
        } 
        catch (Exception ex) 
        { 
            ex.printStackTrace(); 
        } 
    } 
 
    public String GetRemoteMacAddr() throws Exception 
    { 
        byte[] bqcmd = GetQueryCmd(); 
        this.send(bqcmd); 
        DatagramPacket dp = this.receive(); 
        String smac = GetMacAddr(dp.getData()); 
        this.close(); 
        return smac; 
    } 
 
    public static void main(String[] args) throws Exception 
    { 
        RemoteMacAddr addr = new RemoteMacAddr("192.168.1.119"); 
        System.out.println(addr.GetRemoteMacAddr()); 
    } 

發佈留言