java - saber - Obtener un identificador único para un enrutador WiFi
usar celular como router wifi (5)
¿Hay alguna manera de obtener un identificador único para un enrutador wifi en particular?
Estoy intentando escribir una aplicación de Android que necesita saber a qué enrutador está conectado. Sé que Android proporciona una forma de obtener el BSSID de la red conectada actualmente, pero para mi sorpresa, esto no es único.
Descubrí que en los enrutadores de banda dual, dos dispositivos diferentes podrían obtener dos BSSID diferentes, incluso si están en el mismo SSID.
¿Hay algún otro parámetro que pueda obtener que pueda identificar de forma única el wifi al que estoy conectado? Me encantaría probar alguna biblioteca de terceros, si eso me lo permitiera, ya que estoy bastante seguro de que Android no viene con un método mejor que el de darme el BSSID.
Edición: estoy tratando de descubrir quiénes han configurado su wifi doméstico (a través de la aplicación) como el mismo Wi-Fi que yo. Cada usuario configura su ''Wi-Fi doméstico'' que se guarda en el servidor (la dirección mac es lo que estoy guardando). Luego, cada usuario puede consultar quiénes están todos en su Wi-Fi, y si están actualmente conectados a ese Wi-Fi o no. La consulta de ''quién está en mi wifi'' se realiza buscando la misma dirección MAC a la que estoy conectado. Esto falla si mi hogar tiene una banda dual, ya que podrían conectarse a la segunda frecuencia (y por lo tanto a la segunda MAC).
Lamentablemente, no hay un método garantizado para identificar de manera única un punto de acceso específico. Puede acercarse utilizando el SSID, MAC, etc., pero no necesariamente funcionaría cada vez y aún sería posible que alguien lo supiera si lo desea.
Si desea considerar diferentes interfaces WiFi (1) (a diferencia del dispositivo físico que lo soporta), entonces la dirección MAC es, por definición, lo que necesita (salvo los dispositivos rotos que reutilizan incorrectamente un MAC).
(1) Utilizo la palabra "interfaces" porque es posible admitir varias redes (es decir, SSID) en la misma interfaz. Una interfaz será efectivamente un solo canal en una sola frecuencia.
Para el identificador único, puede utilizar la frecuencia BSSI +
Ejemplo: - AA: AA: AA: AA: AA: AA + 2432 y AA: AA: AA: AA: AA: AA + 5230 son únicos en el caso de banda dual
Puede encontrar la dirección Mac de su enrutador y utilizarla como base para identificarla de manera única.
Puede hacerlo revisando la tabla ARP de sus dispositivos Android y comparar la IP del enrutador al que está conectado. Un ejemplo se puede mostrar aquí:
http://www.flattermann.net/2011/02/android-howto-find-the-hardware-mac-address-of-a-remote-host/
Código relevante extraído:
/**
* Try to extract a hardware MAC address from a given IP address using the
* ARP cache (/proc/net/arp).<br>
* <br>
* We assume that the file has this structure:<br>
* <br>
* IP address HW type Flags HW address Mask Device
* 192.168.18.11 0x1 0x2 00:04:20:06:55:1a * eth0
* 192.168.18.36 0x1 0x2 00:22:43:ab:2a:5b * eth0
*
* @param ip
* @return the MAC from the ARP cache
*/
public static String getMacFromArpCache(String ip) {
if (ip == null)
return null;
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader("/proc/net/arp"));
String line;
while ((line = br.readLine()) != null) {
String[] splitted = line.split(" +");
if (splitted != null && splitted.length >= 4 && ip.equals(splitted[0])) {
// Basic sanity check
String mac = splitted[3];
if (mac.matches("..:..:..:..:..:..")) {
return mac;
} else {
return null;
}
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
Simplemente use la dirección MAC del AP. (La dirección MAC es única)
He aquí cómo: ¿Puedo encontrar la dirección MAC de mi punto de acceso en Android?
Tiene razón al suponer que getBSSID()
devolverá dos direcciones diferentes para las dos bandas diferentes, ya que son esencialmente dos puntos de acceso diferentes, uno de 2,4 GHz y uno de 5 GHz, simplemente envuelto en el mismo paquete. Escribí una aplicación rápida que obtiene y muestra todos los campos disponibles que pueden obtenerse usando la clase WifiInfo
. Cuando me conecté a la banda de 2.4 GHz de mi punto de acceso, los detalles fueron los siguientes:
Tenga en cuenta que puede saber que está conectado a la banda de 2,4 GHz ("Frecuencia: 2452"). La repetición del proceso con la banda de 5 GHz muestra lo siguiente:
Como puede ver, las direcciones MAC para las dos bandas diferentes difieren en un solo número; No sé si este es el caso de todos los enrutadores. Si este es el caso, entonces puede determinar de manera concluyente a qué punto de acceso está conectado analizando una combinación de la dirección MAC (BSSID) y la frecuencia.