当前位置: 首页 > 知识库问答 >
问题:

如何准确地扫描所有设备的IP和Mac地址 连接到Android中的wifi?

徐兴昌
2023-03-14

嗨,我正试图找到从android连接到我的WIFI路由器的所有设备,我需要设备每个设备(包括物联网设备)的Mac地址和本地ip地址,现在,我正尝试从ARP缓存表中查找。但有时在扫描中,一些设备丢失,这不是那么准确。

我的代码:

 List<LocalDeviceInfo> devicesInfos = new ArrayList<>();


        BufferedReader bufferedReader = null;

        try {
            bufferedReader = new BufferedReader(new FileReader("/proc/net/arp"));

            String line;
            while ((line = bufferedReader.readLine()) != null) {
                String[] splitted = line.split(" +");
                if (splitted != null && splitted.length >= 4) {
                    String ip = splitted[0];
                    String mac = splitted[3];
                    if (mac.matches("..:..:..:..:..:..")) {
                        LocalDeviceInfo thisNode = new LocalDeviceInfo(ip, mac);
                        devicesInfos.add(thisNode);
                    }
                }
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally{
            try {
                bufferedReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        // Print Description
        for (LocalDeviceInfo devicesInfo :devicesInfos)
        {
            System.out.print("✅");
            System.out.println("IP : "+devicesInfo.getIp());
            System.out.println("Mac : "+devicesInfo.getMacAddress());
        }

如何准确扫描android中的所有设备(IP地址和Mac地址)。

共有2个答案

白阳煦
2023-03-14

实际上,您只需要ping设备网络的广播地址,即可使ICMP ECHO请求转到网络上的每台计算机。无需单独 ping 通。另一方面,某些设备不会响应此类ping作为“安全预防措施”。这取决于你。

然后,按照另一个答案中的代码做——解析包含arp缓存的< code>/proc/net/arp。从procfs中的特殊文件中,您可以找到您网络中网络设备的MAC地址。(将此作为答案发布,因为我还没有足够的声誉将此作为评论添加到其他答案中)

曾丰茂
2023-03-14

我找到了我的问题的解决方案,大多数设备不在系统arp表中,所以你需要在第一时间ping每个设备,一旦你Ping了那个设备,它将被存储在系统ARP表中,这个表存储在< code>(/proc/net/arp)

ping所有带有ip的设备:(首先您需要找到设备的IP地址,然后您可以确定子网掩码,然后您可以从(0-255)开始ping

代码:

public  void startPingService(Context context)
{
  List<LocalDeviceInfo> deviceInfoList  = new ArrayList<LocalDeviceInfo>();
    try {

        WifiManager mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
        WifiInfo mWifiInfo = mWifiManager.getConnectionInfo();
        String subnet = getSubnetAddress(mWifiManager.getDhcpInfo().gateway);


        for (int i=1;i<255;i++){

            String host = subnet + "." + i;

            if (InetAddress.getByName(host).isReachable(timeout)){

                String strMacAddress = getMacAddressFromIP(host);

                Log.w("DeviceDiscovery", "Reachable Host: " + String.valueOf(host) +" and Mac : "+strMacAddress+" is reachable!");

                    LocalDeviceInfo localDeviceInfo = new LocalDeviceInfo(host,strMacAddress);
                    deviceInfoList.add(localDeviceInfo);
             }
            else
            {
                Log.e("DeviceDiscovery", "❌ Not Reachable Host: " + String.valueOf(host));

            }
        }


    }
    catch(Exception e){
        //System.out.println(e);
    }


}


private String getSubnetAddress(int address)
{
    String ipString = String.format(
            "%d.%d.%d",
            (address & 0xff),
            (address >> 8 & 0xff),
            (address >> 16 & 0xff));

    return ipString;
}

从ARP缓存表获取Mac地址

public String getMacAddressFromIP(@NonNull String ipFinding)
{

    Log.i("IPScanning","Scan was started!");
    List<LocalDeviceInfo> antarDevicesInfos = new ArrayList<>();


    BufferedReader bufferedReader = null;

    try {
        bufferedReader = new BufferedReader(new FileReader("/proc/net/arp"));

        String line;
        while ((line = bufferedReader.readLine()) != null) {
            String[] splitted = line.split(" +");
            if (splitted != null && splitted.length >= 4) {
                String ip = splitted[0];
                String mac = splitted[3];
                if (mac.matches("..:..:..:..:..:..")) {

                    if (ip.equalsIgnoreCase(ipFinding))
                    {
                        return mac;
                    }
                }
            }
        }

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally{
        try {
            bufferedReader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    return "00:00:00:00";
}

您也需要这些权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
 类似资料:
  • 问题内容: 嗨,我正在尝试查找所有从android连接到“我的WIFI路由器”的设备,我需要每个设备(包括iOT设备)的设备Mac地址和本地IP地址,现在,我正在尝试从ARP缓存表中查找。但是有时在扫描中缺少某些设备,并非如此准确。 我的代码: 如何准确扫描android中的所有设备(IP地址和Mac地址)。 问题答案: 我找到了解决问题的方法,大多数设备不在系统arp表中,因此您需要在第一次pi

  • 有没有一个清晰的方法,可以很容易地实现扫描本地网络,以获得连接到我的WiFi网络的设备的MAC地址在Android中?谢谢。

  • 本文向大家介绍IP地址和MAC地址之间的区别,包括了IP地址和MAC地址之间的区别的使用技巧和注意事项,需要的朋友参考一下 MAC地址和IP地址,都用于识别网络或Internet上的计算机。MAC地址由NIC卡的制造商提供,并提供计算机的物理地址。IP地址由Internet服务提供商提供,被称为网络上连接的计算机的逻辑地址。 以下是MAC地址和IP地址之间的一些重要区别。 序号 键 MAC地址 I

  • contiki os如何将IP地址映射到MAC地址,该地址存储在哪里? 我知道ICMPv6和RPL的基础知识,但是一旦网络建成,在发送IPv6数据包时,如何知道下一跳的MAC地址?我假设不是每次都发送邻居请求消息。此外,在Cooja上,我看到的唯一ICMPv6消息是RPL消息。 我试图通过grep、谷歌搜索和文档找到答案,但我找不到。

  • 问题内容: 我想知道Android设备的IP地址是数据IP还是Wifi IP。 1)首先将设备连接到3G,然后将设备分配给网络IP。 2)之后将设备连接到WIFI,现在该设备将分配给WIFI IP。 3)任何可以让我们知道IP地址是Wifi IP地址还是网络IP的Android API? 在2.3.5中使用了下面的代码,一切都很好,但是在4.0.3中,ICS存在一些问题。 请帮助 4)当我关闭移动

  • 我有一个物联网设备,我知道该设备的Mac地址。我的物联网设备连接到我的wifi,我想知道有什么方法可以使用该设备的mac地址来了解其本地ip地址?我的要求是将android应用程序连接到同一个wifi,使用Mac地址搜索设备的ip地址,并建立TCP连接。到目前为止,我一直在搜索这个问题,我没有得到这个问题的完美答案,这真的需要< code>ssdp扫描,或者有任何其他方法可以做到这一点。 RARP