Получение уникального идентификатора для маршрутизатора WiFi
Можно ли каким-либо образом получить уникальный идентификатор для конкретного маршрутизатора wifi?
Я пытаюсь написать приложение для Android, которое должно знать, к какому маршрутизатору он подключен. Я знаю, что андроид предоставляет способ получить BSSID в текущей подключенной сети, но, к моему удивлению, это не уникально.
Я узнал, что на двухполосных маршрутизаторах два разных устройства могут получать два разных BSSID, даже если они находятся на одном SSID.
Есть ли другой параметр, который я могу получить, который может однозначно идентифицировать Wi-Fi, с которым я подключен? Мне бы хотелось попробовать какую-то стороннюю библиотеку, если бы это позволило мне, так как я вполне уверен, что Android не поставляется в комплекте с лучшим методом, чем дает мне BSSID.
Изменить: я пытаюсь выяснить, кто все установил домашний Wi-Fi (через приложение) как тот же Wi-Fi, что и я. Каждый пользователь устанавливает свой "домашний Wi-Fi", который сохраняется на сервере (адрес mac - это то, что я сохраняю). Затем каждый пользователь может запросить, кто все на Wi-Fi, и если они в настоящее время подключены к этому Wi-Fi или нет. Запрос "кто на моем Wi-Fi" выполняется путем поиска того же MAC-адреса, что и тот, с которым я подключен. Это не удается, если мой дом имеет двойную полосу, так как они могут быть подключены ко второй частоте (и, следовательно, к второму MAC).
Ответы
Ответ 1
Вы правы, полагая, что getBSSID()
вернет два разных адреса для двух разных диапазонов, поскольку они представляют собой по существу две разные точки доступа: одну 2,4 ГГц и одну 5 ГГц, просто завернутую в тот же пакет. Я написал быстрое приложение, которое получает и отображает все доступные поля, которые могут быть получены с помощью класса WifiInfo
. Когда я подключился к диапазону 2,4 ГГц моей точки доступа, детали были следующими:
![enter image description here]()
Обратите внимание, что вы можете сказать, что вы подключены к диапазону 2,4 ГГц ( "Частота: 2452" ). Повторение процесса с полосой 5 ГГц показывает следующее:
![enter image description here]()
Как вы можете видеть, MAC-адреса для двух разных диапазонов отличаются только одним числом; Я не знаю, так ли это для всех маршрутизаторов. Если это действительно так, то вы можете окончательно определить, к какой точке доступа вы подключены, анализируя комбинацию MAC-адреса (BSSID) и частоты.
Ответ 2
К сожалению, нет гарантированного метода однозначной идентификации конкретной точки доступа. Вы можете приблизиться, используя SSID, MAC и т.д., Но это не обязательно будет работать каждый раз, и все равно было бы возможно, чтобы кто-то обманул это, если они пожелали.
Если вы хотите рассмотреть различные интерфейсы WiFi (1) (в отличие от физического устройства, поддерживающего его), то MAC-адрес по определению - то, что вам нужно (запрет неработающих устройств, которые неправильно используют MAC).
(1) Я использую слово "интерфейсы", потому что он может поддерживать несколько сетей (т.е. SSID) на одном и том же интерфейсе. Интерфейс будет эффективно представлять собой один канал на одной частоте.
Ответ 3
Просто используйте MAC-адрес AP. (MAC-адрес уникален)
Вот как это сделать:
Могу ли я найти MAC-адрес моей точки доступа в Android?
Ответ 4
Для уникального идентификатора вы можете использовать
BSSI + Частота
Пример: -
AA: AA: AA: AA: AA: AA + 2432 и AA: AA: AA: AA: AA: AA + 5230 являются уникальными в двухдиапазонном случае
Ответ 5
Вы можете найти MAC-адрес вашего маршрутизатора и использовать его в качестве основы для уникальной идентификации.
Вы можете сделать это, проверив таблицу ARP на Android-устройствах и сравните IP-адрес маршрутизатора, к которому вы подключены. Пример можно показать здесь:
http://www.flattermann.net/2011/02/android-howto-find-the-hardware-mac-address-of-a-remote-host/
Выбран соответствующий код:
/**
* 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;
}