2012-04-03 8 views

Antwort

9

Zuerst müssen Sie ein gerootetes Gerät haben. Wenn es fertig ist, lesen Sie einfach dnsmasq.leases Datei. Normalerweise befindet es sich unter: /data/misc/dhcp/dnsmasq.leases. Eine Struktur der Datei ist ziemlich einfach - jede Zeile ist eine Zusammenfassung eines verbundenen Benutzers. Die Zusammenfassung enthält mehrere Felder einschließlich MAC. Ich habe keine Möglichkeit gefunden, MAC ohne root zu bekommen. Bitte korrigieren Sie mich, falls ich falsch liege.

+1

was ist mit Clients verbunden mit statischen ip nicht dhcp, sie Wird nicht in der Dnsmasq erscheinen, hast du eine Idee? – user935143

+0

Gibt es keine Klasse von 'android' Paket, um diesen Job zu machen? –

7

/proc/net/arp Lesen der Informationen für bieten würde sowohl statische als auch DHCP-Clients, die während der letzten 60 Sekunden mit dem Gerät kommuniziert haben (konfiguriert in /proc/sys/net/ipv4/neigh/wl0.1/gc_stale_timewl0.1 wo die Schnittstelle mit dem Telefon drahtloses Netzwerk).

Es ist auch für Nicht-Root-Benutzer verfügbar.

+2

Ist das wahr unter/proc/net/arp aktualisiert nicht immer die Liste, wenn das Gerät (Client) von der AP @Roman getrennt? – 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

Bitte geben Sie einige zusätzliche Informationen darüber, was Ihr Code macht. Es ist schwer für jemanden neu zu sagen, was vor sich geht. –