当前位置: 首页 > 面试题库 >

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

谭锐藻
2023-03-14
问题内容

嗨,我正在尝试查找所有从android连接到“我的WIFI路由器”的设备,我需要每个设备(包括iOT设备)的设备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地址)。


问题答案:

我找到了解决问题的方法,大多数设备不在系统arp表中,因此您需要在第一次ping通每个设备,一旦ping该设备将存储在系统ARP表中,该表存储
(/proc/net/arp)

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

码:

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路由器的所有设备,我需要设备每个设备(包括物联网设备)的Mac地址和本地ip地址,现在,我正尝试从ARP缓存表中查找。但有时在扫描中,一些设备丢失,这不是那么准确。 我的代码: 如何准确扫描android中的所有设备(IP地址和Mac地址)。

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

  • 问题内容: 我正在开发一个需要扫描WiFi网络并显示所有已连接设备列表的应用程序。 允许用户点击设备,该应用应显示该特定设备的所有硬件信息。这里所说的硬件是指-RAM,存储介质,存储容量,设备名称,设备IP地址等。 现在,该设备可以是xbox,带Linux / Windows的笔记本电脑,iPhone等手机或任何基于Andorid的智能手机甚至打印机。 如何扫描WiFi网络并查询/检测连接到它的所

  • 我正在尝试在这里制作一个应用程序,它将检测WiFi网络中连接的所有设备。我已经做了足够多的谷歌,并提出了一个应用程序,可以检测在应用程序的WiFi网络中连接的设备的IP地址。 现在我想要更多的东西。 < li >我能否找到设备名称,即电话名称或型号或系统名称,以及我们可以用来检测特定设备的任何信息? < li >我们能否找到设备距离,例如该设备距离我们使用应用的手机有多远? < li >这是主要任

  • 问题内容: 我需要在Swift中获取iOS设备的IP地址。这不是其他有关此问题的重复!如果没有wifi IP地址,我只需要获取WiFiIP地址-我需要处理它。关于堆栈溢出有一些问题,但是只有返回IP地址的函数。: 在这里,我得到2个值-来自移动互联网的地址(我认为)和需要的WiFi地址。还有其他方法可以获取仅WiFi IP地址吗? 问题答案: 根据多个SO线程(例如,iOS网络接口名称的确切含义是

  • 我正在开发一个应用程序,我需要扫描WiFi网络,并显示所有连接设备的列表。 允许用户点击一个设备,应用程序应该显示该特定设备的所有硬件信息。这里我说的硬件是指内存、存储介质、存储容量、设备名称、设备IP地址等。 现在,这个设备可以是任何东西,比如xbox,带有Linux/Windows的笔记本电脑,iPhone之类的手机,或者任何基于Android的智能手机,甚至是打印机。 我如何扫描WiFi网络