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

嗨,我正在尝试查找所有从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的所有设备的IP和Mac地址? 的全部内容, 来源链接: utcz.com/qa/409316.html

回到顶部