Wi-Fi-модем – как получить список подключенных клиентов

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

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

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

Он также доступен для пользователей без полномочий 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; }