2012-04-03 4 views
4

Есть ли способ получить список подключенных MAC-адресов, когда мой телефон подключен к модему Wi-Fi?Wi-Fi-модем - как получить список подключенных клиентов

+0

Пожалуйста, проверьте эту ссылку. http://stackoverflow.com/questions/21522961/how-to-get-the-client-device-details-which-is-connected-to-wifi-hotspot – user2711243

ответ

9

Во-первых, у вас должно быть корневое устройство. Когда это делается, просто прочитайте dnsmasq.leases файл. Обычно он размещается по адресу: /data/misc/dhcp/dnsmasq.leases. Структура файла довольно проста - каждая строка представляет собой сводку подключенного пользователя. В сводке есть несколько полей, включая MAC. Я не нашел возможность получить MAC без root. Пожалуйста, поправьте меня, если я ошибаюсь.

+1

Что касается клиентов, связанных со статическим ip не dhcp, они не появится в dnsmasq, у вас есть идея? – user935143

+0

Разве нет класса из пакета 'android' для выполнения этой работы? –

7

Чтение /proc/net/arp будет предоставлять информацию для статических и DHCP клиентов, которые общались с устройством в течение последних 60 секунд (настраивается в /proc/sys/net/ipv4/neigh/wl0.1/gc_stale_time где wl0.1 является беспроводным сетевым интерфейсом на моем телефоне).

Он также доступен для пользователей, не являющихся пользователем root.

+2

Это правда, что под/proc/net/arp не всегда обновляется список, когда устройство (клиент) отключено от AP @Roman? – gumuruh

0
@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; 
} 
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; 
} 
+0

Пожалуйста, предоставьте дополнительную информацию о том, что делает ваш код. Трудно сказать кому-нибудь новому, что происходит. –

Смежные вопросы