如何准确扫描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