Random小白 2018-05-25 07:42 采纳率: 100%
浏览 9958
已采纳

java如何从http请求中获取mac(支持PC、手机)

在网上找了很多资料,大部分都比较坑,不是通过dos命令就是用nbtstat -A的方式,后来找到一个有残缺的,大概只能通过web获取
package com.wt.jwzh.common.utils;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/**

  • @date 2018年5月22日 下午12:09:13 * */

public class UdpGetClientMacAddr {
private String sRemoteAddr;

private int iRemotePort=137;

private byte[] buffer = new byte[1024];

private DatagramSocket ds=null;

public UdpGetClientMacAddr(String strAddr) throws Exception{  
    sRemoteAddr = strAddr;  
    ds = new DatagramSocket();  
}  

public final DatagramPacket send(final byte[] bytes) throws IOException {  
    DatagramPacket dp = new DatagramPacket(bytes,bytes.length,InetAddress.getByName(sRemoteAddr),iRemotePort);  
    ds.send(dp);  
    return dp;  
}  

public final DatagramPacket receive() throws Exception {  
    DatagramPacket dp = new DatagramPacket(buffer,buffer.length);  
    ds.receive(dp);  
    return dp;  
}  
public 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;  
}  
public final String GetMacAddr(byte[] brevdata) throws Exception {  
    // 获取计算机名  
    int i = brevdata[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 & brevdata[i+j]);  
        if(sAddr.length() < 2)  
        {  
            sb.append(0);  
        }  
        sb.append(sAddr.toUpperCase());  
        if(j < 6) sb.append(':');  
    }  
    return sb.toString();  
}  

public final void close() throws Exception {  
    ds.close();  
}  

public final String GetRemoteMacAddr() throws Exception {  
    byte[] bqcmd = GetQueryCmd();  
    send(bqcmd);  
    DatagramPacket dp = receive();  
    String smac = GetMacAddr(dp.getData());  
    close();  
    return smac;  
}  

}
嗯,求正确的获取方式

  • 写回答

7条回答

  • huang2004091011 2018-05-25 09:17
    关注

    你这个是获取同一个局域网的mac,公网上是获取不到终端的mac的,除非通过web 插件本地获取再上传

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

悬赏问题

  • ¥50 求图像处理的matlab方案
  • ¥50 winform中使用edge的Kiosk模式
  • ¥15 关于#python#的问题:功能监听网页
  • ¥15 怎么让wx群机器人发送音乐
  • ¥15 fesafe材料库问题
  • ¥35 beats蓝牙耳机怎么查看日志
  • ¥15 Fluent齿轮搅油
  • ¥15 八爪鱼爬数据为什么自己停了
  • ¥15 交替优化波束形成和ris反射角使保密速率最大化
  • ¥15 树莓派与pix飞控通信