Wi-Fi tethering - how to get list of connected clients
Solution 1
Firstly, you must have a rooted device. When it's done just read dnsmasq.leases file. Usually it is placed at: /data/misc/dhcp/dnsmasq.leases. A structure of the file is pretty simple - each line is a summary of a connected user. The summary has several fields including MAC. I didn't find a possibility to get MAC without root. Please correct me if I'm wrong.
Solution 2
Reading /proc/net/arp
would provide the information for both static and DHCP clients that have communicated with the device during the last 60 seconds (configured in /proc/sys/net/ipv4/neigh/wl0.1/gc_stale_time
where wl0.1
is the wireless network interface on my phone).
It is available for non-root users too.
Solution 3
@SuppressWarnings("ConstantConditions")
public static String getClientMacByIP(String ip)
{
String res = "";
if (ip == null)
return res;
String flushCmd = "sh ip -s -s neigh flush all";
Runtime runtime = Runtime.getRuntime();
try
{
runtime.exec(flushCmd,null,new File("/proc/net"));
}
BufferedReader br;
try
{
br = new BufferedReader(new FileReader("/proc/net/arp"));
String line;
while ((line = br.readLine()) != null)
{
String[] sp = line.split(" +");
if (sp.length >= 4 && ip.equals(sp[0]))
{Assistance.Log(sp[0]+sp[2]+sp[3],ALERT_STATES.ALERT_STATE_LOG);
String mac = sp[3];
if (mac.matches("..:..:..:..:..:..") && sp[2].equals("0x2"))
{
res = mac;
break;
}
}
}
br.close();
}
catch (Exception e)
{}
return res;
}
//--------------------------------------------------------
@SuppressWarnings("ConstantConditions")
public static String getClientIPByMac(String mac)
{
String res = "";
if (mac == null)
return res;
String flushCmd = "sh ip -s -s neigh flush all";
Runtime runtime = Runtime.getRuntime();
try
{
runtime.exec(flushCmd,null,new File("/proc/net"));
}
BufferedReader br;
try
{
br = new BufferedReader(new FileReader("/proc/net/arp"));
String line;
while ((line = br.readLine()) != null)
{
String[] sp = line.split(" +");
if (sp.length >= 4 && mac.equals(sp[3]))
{
String ip = sp[0];
if (ip.matches("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}") && sp[2].equals("0x2"))
{
res = ip;
break;
}
}
}
br.close();
}
catch (Exception e)
{}
return res;
}
Fiur
Updated on June 26, 2022Comments
-
Fiur almost 2 years
Is there any way to get a the list of connected MAC addresses when my phone is on Wi-Fi tethering mode?
-
user935143 about 11 yearswhat about clients connected with static ip not dhcp, they will not appear in the dnsmasq, do you have any idea?
-
gumuruh almost 10 yearsIs that true under /proc/net/arp is not always updating the list when the device (client) disconnected from the AP @Roman?
-
Kurt Van den Branden over 7 yearsPlease provide some additional info on what your code is doing. It's hard to tell for anyone new what's going on.
-
Ritwik Jamuar over 6 yearsIsn't there any class from
android
package to do this job? -
truedat101 almost 6 yearsWhile there might be some problems with this answer from the standpoint of the "sh ip -s -s neigh flush all" command, it leads one in the right direction. If connected, /proc/net/arp should have the current neighbords in the file, and this file is accessible from non-rooted devices, making this solution viable to read this file, and parse off the address of the p2p-wlan0-0 device, which on my devices always is in the 192.168.49.* address range.