Wi-Fi tethering – cómo obtener la lista de clientes conectados

¿Hay alguna manera de obtener una lista de direcciones MAC conectadas cuando mi teléfono está en modo Wi-Fi tethering?

En primer lugar, debe tener un dispositivo enraizado. Cuando se acaba de leer el archivo dnsmasq.leases . Generalmente se coloca en: /data/misc/dhcp/dnsmasq.leases . Una estructura del archivo es bastante simple – cada línea es un resumen de un usuario conectado. El resumen tiene varios campos incluyendo MAC. No encontré la posibilidad de obtener MAC sin root. Por favor, corrija si estoy equivocado.

La lectura /proc/net/arp proporcionaría la información para los clientes estáticos y DHCP que se han comunicado con el dispositivo durante los últimos 60 segundos (configurados en /proc/sys/net/ipv4/neigh/wl0.1/gc_stale_time donde wl0.1 es la interfaz de red inalámbrica en mi teléfono).

Está disponible para usuarios no root.

 @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; } 
 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; } 
  • Manteniendo Wifi-Direct activado en dispositivos AOSP
  • Android: Fuerza los datos que se envían a través de radio vs WiFi
  • Android se conecta a WiFi sin interacción humana
  • ¿Cómo ser notificado cuando un compañero ya no está disponible en la gama Wi-Fi Direct?
  • La aplicación nunca recibe RSSI_CHANGED_ACTION
  • ¿Cómo distinguir entre diferentes redes wifi?
  • Detectar si la conexión es wifi, 3G o EDGE en android?
  • Wifi y 3G a la misma hora
  • ¿Cómo detectar dispositivos móviles cercanos usando el SDK de Android?
  • Forzar Android a utilizar la red Wifi sin Internet
  • BroadcastReceiver recibe varios mensajes idénticos para un evento
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.