嗨,我正在尝试查找所有从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)
(/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" />