Android 查询局域网内所有ip和mac地址

这篇具有很好参考价值的文章主要介绍了Android 查询局域网内所有ip和mac地址。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1:通过java运行cmd命令,来通过arp命令获取同一网络下设备信息,对于支持linux 和windows的设备有效,像一些非智能设备,就无力回天了

2:使用android手机通过向子网内所有设备先发送一遍udp包,实现与在线的设备都进行通信一遍,这样对应的路由信息就自动存储在本地手机中,然后在通过读取android 本机的arp缓存表,来获取设备信息

好,下面详细进行第二种方式的描述:
Step1:首先,获取本机所处的子网段,方法详细代码如下:

    /**
     * 获取ip地址
     *
     * @return
     */
    private static String getHostIP() {
        String hostIp = null;
        try {
            //这里以eth0为例
            hostIp = getIpAddress("eth0");
        } catch (SocketException e) {
            e.printStackTrace();
        }
        return hostIp;
    }
    /**
     * Get Ip address 自动获取IP地址
     * 可以传入eth1,eth0,wlan0,等
     *
     * @throws SocketException
     */
    public static String getIpAddress(String ipType) throws SocketException {
        String hostIp = null;
        try {
            Enumeration nis = NetworkInterface.getNetworkInterfaces();
            InetAddress ia = null;
            while (nis.hasMoreElements()) {
                NetworkInterface ni = (NetworkInterface) nis.nextElement();

                if (ni.getName().equals(ipType)) {


                    Enumeration<InetAddress> ias = ni.getInetAddresses();
                    while (ias.hasMoreElements()) {

                        ia = ias.nextElement();
                        if (ia instanceof Inet6Address) {
                            continue;// skip ipv6
                        }
                        String ip = ia.getHostAddress();

                        // 过滤掉127段的ip地址
                        if (!"127.0.0.1".equals(ip)) {
                            hostIp = ia.getHostAddress();
                            break;
                        }
                    }
                }
            }
        } catch (SocketException e) {
            e.printStackTrace();
        }
        Log.d(ipType, "get the IpAddress--> " + hostIp + "");
        return hostIp;
    }

Step2:new出一个线程,向网段内所有在线设备发送消息。

/**
     * 创建一个线程向本地所有ip发送一个数据
     */
    public static void sendDataToLocal() {
        //局域网内存在的ip集合
        final List<String> ipList = new ArrayList<>();
        final Map<String, String> map = new HashMap<>();
        //获取本机所在的局域网地址
        String hostIP = getHostIP();
        int lastIndexOf = hostIP.lastIndexOf(".");
        final String substring = hostIP.substring(0, lastIndexOf + 1);
        new Thread(new Runnable() {
            @Override
            public void run() {
                DatagramPacket dp = new DatagramPacket(new byte[0], 0, 0);
                DatagramSocket socket;
                try {
                    socket = new DatagramSocket();
                    int position = 2;
                    while (position < 255) {
                        Log.e("Scanner ", "run: udp-" + substring + position);
                        dp.setAddress(InetAddress.getByName(substring + String.valueOf(position)));
                        socket.send(dp);
                        position++;
                        if (position == 125) {
                            //分两段掉包,一次性发的话,达到236左右,会耗时3秒左右再往下发
                            socket.close();
                            socket = new DatagramSocket();
                        }
                    }
                    socket.close();
                } catch (SocketException e) {
                    e.printStackTrace();
                } catch (UnknownHostException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

执行完后会自动写入到/proc/net/arp
目录下,如下:
android 获取局域网ip,安卓,java,android,tcp/ip,java
Step3:延时3秒后,读取本机proc/net/arp目录下的内容,得到结果:

/**
     * 读取/proc/net/arp并且解析出来ip,mac,flag
     * flag 为0x00说明目前不在局域网内,曾经在过.0x02代表在局域网内
     */
    public static void readArp() {
        try {
            BufferedReader br = new BufferedReader(new FileReader("/proc/net/arp"));
            String line = "";
            String ip = "";
            //flag 为0x00说明目前不在局域网内,曾经在过.0x02代表在局域网内
            String flag = "";
            String mac = "";
            if (br.readLine() == null) {
                Log.e("scanner", "readArp: null");
            }
            while ((line = br.readLine()) != null) {
                line = line.trim();
                if (line.length() < 63)
                    continue;
                if (line.toUpperCase(Locale.US).contains("IP"))
                    continue;
                ip = line.substring(0, 17).trim();
                flag = line.substring(29, 32).trim();
                mac = line.substring(41, 63).trim();
                if (mac.contains("00:00:00:00:00:00"))
                    continue;
                Log.e("scanner", "readArp: mac= " + mac + " ; ip= " + ip + " ;flag= " + flag);
            }
            br.close();
        } catch (Exception ignored) {
        }
    }

打印日志如下
android 获取局域网ip,安卓,java,android,tcp/ip,java
最后附上完整代码文章来源地址https://www.toymoban.com/news/detail-525985.html

public class DiscoverNetIpUtil{
    /**
     * 获取ip地址
     *
     * @return
     */
    private static String getHostIP() {
        String hostIp = null;
        try {
            //这里以eth0为例
            hostIp = getIpAddress("eth0");
        } catch (SocketException e) {
            e.printStackTrace();
        }
        return hostIp;
    }

    /**
     * Get Ip address 自动获取IP地址
     * 可以传入eth1,eth0,wlan0,等
     *
     * @throws SocketException
     */
    public static String getIpAddress(String ipType) throws SocketException {
        String hostIp = null;
        try {
            Enumeration nis = NetworkInterface.getNetworkInterfaces();
            InetAddress ia = null;
            while (nis.hasMoreElements()) {
                NetworkInterface ni = (NetworkInterface) nis.nextElement();

                if (ni.getName().equals(ipType)) {


                    Enumeration<InetAddress> ias = ni.getInetAddresses();
                    while (ias.hasMoreElements()) {

                        ia = ias.nextElement();
                        if (ia instanceof Inet6Address) {
                            continue;// skip ipv6
                        }
                        String ip = ia.getHostAddress();

                        // 过滤掉127段的ip地址
                        if (!"127.0.0.1".equals(ip)) {
                            hostIp = ia.getHostAddress();
                            break;
                        }
                    }
                }
            }
        } catch (SocketException e) {
            e.printStackTrace();
        }
        Log.d(ipType, "get the IpAddress--> " + hostIp + "");
        return hostIp;
    }

    /**
     * 创建一个线程向本地所有ip发送一个数据
     */
    public static void sendDataToLocal() {
        //局域网内存在的ip集合
        final List<String> ipList = new ArrayList<>();
        final Map<String, String> map = new HashMap<>();
        //获取本机所在的局域网地址
        String hostIP = getHostIP();
        int lastIndexOf = hostIP.lastIndexOf(".");
        final String substring = hostIP.substring(0, lastIndexOf + 1);
        new Thread(new Runnable() {
            @Override
            public void run() {
                DatagramPacket dp = new DatagramPacket(new byte[0], 0, 0);
                DatagramSocket socket;
                try {
                    socket = new DatagramSocket();
                    int position = 2;
                    while (position < 255) {
                        Log.e("Scanner ", "run: udp-" + substring + position);
                        dp.setAddress(InetAddress.getByName(substring + String.valueOf(position)));
                        socket.send(dp);
                        position++;
                        if (position == 125) {
                            //分两段掉包,一次性发的话,达到236左右,会耗时3秒左右再往下发
                            socket.close();
                            socket = new DatagramSocket();
                        }
                    }
                    socket.close();
                } catch (SocketException e) {
                    e.printStackTrace();
                } catch (UnknownHostException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

    /**
     * 读取/proc/net/arp并且解析出来ip,mac,flag
     * flag 为0x00说明目前不在局域网内,曾经在过.0x02代表在局域网内
     */
    public static void readArp() {
        try {
            BufferedReader br = new BufferedReader(new FileReader("/proc/net/arp"));
            String line = "";
            String ip = "";
            //flag 为0x00说明目前不在局域网内,曾经在过.0x02代表在局域网内
            String flag = "";
            String mac = "";
            if (br.readLine() == null) {
                Log.e("scanner", "readArp: null");
            }
            while ((line = br.readLine()) != null) {
                line = line.trim();
                if (line.length() < 63)
                    continue;
                if (line.toUpperCase(Locale.US).contains("IP"))
                    continue;
                ip = line.substring(0, 17).trim();
                flag = line.substring(29, 32).trim();
                mac = line.substring(41, 63).trim();
                if (mac.contains("00:00:00:00:00:00"))
                    continue;
                Log.e("scanner", "readArp: mac= " + mac + " ; ip= " + ip + " ;flag= " + flag);
            }
            br.close();
        } catch (Exception ignored) {
        }
    }
}

到了这里,关于Android 查询局域网内所有ip和mac地址的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 查找局域网树莓派raspberry的mac地址和ip

    依赖python库: 运行代码: 以上代码的运行有个工具的依赖 Npcap来源github Npcap来自官网 Bonjour来自github(这个通常Windows会自带,如果没有就下载安装一下) 通常,上面这个代码可能无法正常显示raspberry的主机名,那就要结合ping -4 raspberrypi.local指令了,代码如下: 看看运行结

    2024年01月20日
    浏览(36)
  • 几种查询局域网内在线弱电设备IP地址的方法,总有一款你会用的到

    方法一:通过电脑cmd命令查询局域网内设备IP 在电脑开始菜单[运行],输入cmd回车,在弹出的命令提示窗口输入ipconfig/all回车,能够查看本机的IP、网关、mac地址信息。 然后在命令提示窗口输入arp -a,进行回车,等待返回结果。 从返回结果可以查询看本地局域网中的所有与本

    2023年04月09日
    浏览(41)
  • 查看局域网内所有IP

    要如何查看局域网内正在使用的电脑的IP一共分以下几个步骤: 第一步:点击电脑左下角的“开始”,然后再点击“运行…”。 第二步:在运行窗口里填入“cmd”,然后点击确定。 第三步:在cmd命令窗口输入“ipconfig/ALL”命令,点击键盘上的回车键。 第四步:这时会在cmd命令

    2024年02月10日
    浏览(36)
  • 查局域网所有占用IP

    按:win+r 出现下面界面,在文本框中输入 cmd 按确定即可出现cmd命令界面 在cmd命令窗口输入你想要ping的网段,下面192.168.20.%i即为你想要ping的网段,%i代表0-255 上面命令执行完后继续输入 arp -a,即统计所有ping通的IP

    2024年02月11日
    浏览(35)
  • 局域网ip地址不够用-增加内网IP地址

    正常情况下局域网的ip地址只有254个,也就是192.168.1.1-192.168.1.254,随着现在联网的设备越来越多,比如监控,智能设备等都需要ip,稍微有点规模的公司254个ip可能就不够用了。哪怎么解决呢? 1、通过改子网掩码来增加内网ip   子网掩码为255.255.255.0时,路由器下面的内网ip最

    2024年02月09日
    浏览(48)
  • Mac上手动配置局域网IP

    拿起心爱的mac笔记本,去项目现场处理问题,项目现场使用的局域网,手动配置参考一下,实操有效哦!话不多说,上图… 步骤1:系统偏好设置 步骤2:选择网络 步骤3:选择右下角的添加服务 步骤4:配置IP地址,子网掩码和路由器(项目现场提供) 步骤5:配置DNS(项目现

    2024年02月13日
    浏览(47)
  • windows下查看同局域网其它主机MAC地址命令

    事情是这样的,今天去面试的时候笔试有一道题问到:Windows下使用什么命令来获知同局域网内其他主机的MAC地址。一开始看到感觉很熟悉,但是却答不上来。原来建站这么就,很多使用都要使用ping命令来测试网站的可连接性和速度等等。 但是这样的ping命令并不可以看到一台

    2024年02月05日
    浏览(62)
  • 判断两个 IP 地址是否在同一个局域网中

    如何判断两个 IP 地址是否在同一个局域网中, 核心知识点是出于一个网络号, 主要是通过本身ip 与 所处的子网掩码进行 计算处理是否处于同一个局域网中(在 TCP/IP协议规则里面,IP地址与子网掩码做与运算)。

    2024年02月13日
    浏览(76)
  • 如何正确修改IP地址为手动或自动获取?(只针对局域网ip 静态ip)

      本文主要和广大电脑用户分享 如何正确修改IP地址为手动或自动获取? 有时候电脑连接不上网络,主要原因是需要修改IP地址,这些针对IP地址的修改来做个详细的介绍。(本文所指修改ip地址的方法,只针对局域网ip  静态ip),动态ip是DHCP自动分配的,需要到路由器设置

    2024年02月05日
    浏览(48)
  • 如何能在局域网中隐藏电脑及IP地址(防止被攻击)

    局域网在各大单位中最为常见,所有开机的电脑都会不约而同的出现在单位的局域网上,而且大家都有固定的IP地址,而固定的IP地址很容易被攻击,因此,有没有什么办法可以在局域内隐藏自己的电脑及IP地址呢?答案是肯定的,可以。 隐藏自己的计算机 在windowsXP中右键点击

    2024年02月06日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包