2021-10-26

H5获取当前网络的ip +后端根据ip获取网段的MAC地址(wifi打卡)*

1.业务要求h5的app要做wifi打卡,我的思路就是根据用户手机获取网络ip,再根据ip来获取路由的mac地址。数据库先存打卡wifi的mac地址。后面获取的与数据库对比,来完成wifi打卡。因为项目不是安卓的架构所以,只能从h5来获取ip。代码直接写在下面了。

	          let addrs = Object.create(null);
	          addrs["0.0.0.0"] = false;
	          function updateDisplay(newAddr) {
	            if (newAddr in addrs) return;
	            else addrs[newAddr] = true;
	            let displayAddrs = Object.keys(addrs).filter(function (k) {
	              return addrs[k];
	            });
	            for (let i = 0; i < displayAddrs.length; i++) {
	              if (displayAddrs[i].length > 16) {
	                displayAddrs.splice(i, 1);
	                i--;
	              }
	            }
	            alert(displayAddrs[0],'120');//打印出内网ip
	            _this.ipName = displayAddrs[0];
	            _this.changeColor(_this.ipName);
	          }
	          function grepSDP(sdp) {
	            let hosts = [];
	            sdp.split("\r\n").forEach(function (line, index, arr) {
	              if (~line.indexOf("a=candidate")) {
	                let parts = line.split(" "),
	                  addr = parts[4],
	                  type = parts[7];
	                if (type === "host") {
	                  updateDisplay(addr);
	                }
	              } else if (~line.indexOf("c=")) {
	                let parts = line.split(" "),
	                  addr = parts[2];
	                updateDisplay(addr);
	              }
	            });
	          }
	        })();
	      else {
	        console.log("请使用主流浏览器:chrome,firefox,opera,safari");
	      }

2.后台根据ip地址来获取网络的MAC地址

//安卓app获取当前网络的ip 以及网络的MAC地址
    @POST
    @Path("findMac")
    @Produces(MediaType.APPLICATION_JSON)
    public BaseDTO findMac() {
        BaseDTO result = new BaseDTO();
        try {
            Enumeration<NetworkInterface> allNetInterfaces = NetworkInterface.getNetworkInterfaces();
            InetAddress ip = null;
            while (allNetInterfaces.hasMoreElements()) {
                NetworkInterface netInterface = (NetworkInterface) allNetInterfaces.nextElement();
                if (netInterface.isLoopback() || netInterface.isVirtual() || netInterface.isPointToPoint() || !netInterface.isUp()) {
                    continue;
                } else {
                    Enumeration<InetAddress> addresses = netInterface.getInetAddresses();
                    while (addresses.hasMoreElements()) {
                        ip = addresses.nextElement();
                        if (ip != null && ip instanceof Inet4Address) {
                            System.out.println("IP地址:"+ip.getHostAddress());
                            System.out.println(getMacAddress(ip.getHostAddress()));
                        }
                    }
                }
            }
        } catch (Exception e) {
            result.setMessage("获取ip失败");
            result.setCode(500);
            return result;
        }
        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;
    }
    /**
     *
     * @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;
    }
    /**
     * @param ip 目标ip
     * @return  Mac Address
     *
     */
    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;
    }
    /**
     * 获取MAC地址
     * @return 返回MAC地址
     */
    public static String getMacAddress(String ip){
        String macAddress = "";
        macAddress = getMacInWindows(ip).trim();
        if(macAddress==null||"".equals(macAddress)){
            macAddress = getMacInLinux(ip).trim();
        }
        return macAddress;
    }

3.具体对比的逻辑自己去写就可以了

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
本系统旨在基于移动设备WIFI环境下解决学生签到,教师查询考勤记录,发布公告等问题。本课题研究成果如下: (1)通过调查研究发现便捷,低成本的移动设备主要趋向于安卓智能设备。尽管Apple iPhone 系列吸引了广大用的眼球,但是Google安卓系统的智能手机却一直是国内市场的“主力军”。【1】【通信信息报/2012年/4月/18日/第B04版 玩转终端 安卓独占中国市场七成份额 中低端手机加速规模扩张】同时Apple 手机成本相对较高,在普通高校学生使用率较低。本系统采用开发安卓的客户端简单APP应用调用安卓设备的底层硬件功能,安卓APP通过HTTP 协议、Web Services与服务器ASP.NET网站数据资源进行交互。 (2)安卓移动设备在连接上WIFI时可以通过安卓系统WIFI Manager类管理WIFI状态,获得设备的物理地址,通过这一物理地址作为与学生学号绑定的条件,解决学生代签漏签问题。 (3)开发出教师使用端,主要功能是释放WIFI信号,发布公告,查询学生的签到情况等功能WIFI热点释放功能依赖于Java反射机制,逆向解析并调用WIFI Manager类中的方法去实现热点的打开、关闭和状态管理。【2使用Java反射机制逆向分析类方法之间的关系DOI:10.16184/j.cnki.comprg.2016.19.006 分类号:TP312.2】 (4)开发web服务端实现管理员对教师、课程、专业、及学生等基本信息的管理功能
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

司小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值