Wi-Fi tethering - how to get list of connected clients
Asked Answered
R

4

6

Is there any way to get a the list of connected MAC addresses when my phone is on Wi-Fi tethering mode?

Roger answered 3/4, 2012 at 15:19 Comment(1)
Please check this link. #21523461Attempt
A
9

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.

Antler answered 18/4, 2012 at 20:15 Comment(2)
what about clients connected with static ip not dhcp, they will not appear in the dnsmasq, do you have any idea?Olson
Isn't there any class from android package to do this job?Mobility
S
7

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.

Sessler answered 29/3, 2013 at 12:5 Comment(1)
Is that true under /proc/net/arp is not always updating the list when the device (client) disconnected from the AP @Roman?Schuster
C
1
@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;
}
Cordite answered 10/11, 2016 at 14:36 Comment(1)
While 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.Gallipot
C
0
public static ArrayList<String> getConnectedDevicesMac()
{
    ArrayList<String> res = new ArrayList<String>();
    //NetManager.updateArpFile();

    BufferedReader br;
    try
    {
        br = new BufferedReader(new FileReader("/proc/net/arp"));
        String line;
        line = br.readLine();
        while ((line = br.readLine()) != null)
        {
            String[] sp = line.split(" +");
            if (sp[3].matches("..:..:..:..:..:.."))
                res.add(sp[3]);
        }

        br.close();
    }
    catch (Exception e)
    {}

    return res;
}
Cordite answered 12/11, 2016 at 18:9 Comment(1)
Please provide some additional info on what your code is doing. It's hard to tell for anyone new what's going on.Weeden

© 2022 - 2024 — McMap. All rights reserved.