有什么方法可以获得特定wifi路由器的任何唯一标识符吗?
我正在尝试编写一个需要知道它连接到哪个路由器的Android应用。我知道android提供了获取当前连接网络的BSSID的方法,但令我惊讶的是,这并不是唯一的。
我发现在双频路由器上,两个不同的设备可能会获得两个不同的BSSID,即使它们位于相同的SSID上。
我可以获取任何其他参数,可以唯一标识我连接的wifi吗?我很想尝试一些第三方库,如果这样可以允许我,因为我很确定Android没有包装更好的方法而不是给我BSSID。
编辑:我正在试图找出谁将他们的家庭wifi(通过应用程序)设置为与我相同的Wi-Fi。每个用户设置他们的“家庭Wi-Fi”,它被保存在服务器上(mac地址是我正在保存的)。然后,每个用户都可以查询所有人都在他们的Wi-Fi上,以及他们当前是否在该Wi-Fi上连接。 “谁在我的wifi上”的查询是通过搜索与我连接的MAC地址相同的MAC地址来完成的。如果我的家有双频段,则会失败,因为它们可以连接到第二频率(因此也可以连接到第二频率)。
答案 0 :(得分:7)
你认为getBSSID()
将为两个不同的频段返回两个不同的地址是正确的,因为它们本质上是两个不同的接入点,一个2.4GHz和一个5 GHz,只是简单地包装在同一个包中。我编写了一个快速应用程序,它可以获取并显示可以使用WifiInfo
类获得的所有可用字段。当我连接到接入点的2.4 GHz频段时,详细信息如下:
请注意,您可以告诉您已连接到2.4 GHz频段("频率:2452和#34;)。使用5 GHz频段重复该过程显示以下内容:
如您所见,两个不同频段的MAC地址仅相差一个数字;我不知道所有路由器是否都是这种情况。如果情况确实如此,那么您可以通过分析MAC地址(BSSID)和频率的组合来最终确定您所连接的接入点。
答案 1 :(得分:2)
可悲的是,没有唯一标识特定接入点的保证方法。您可以通过使用SSID,MAC等来接近,但它不一定每次都能正常工作,如果他们愿意,某人仍然可以欺骗它。
如果您想考虑不同的WiFi接口(1)(而不是支持它的物理设备),那么根据定义,MAC地址就是您所需要的(除非错误地重复使用MAC的设备损坏)。 / p>
(1)我使用“接口”一词,因为它可以支持同一接口上的多个网络(即SSID)。接口实际上是单个频率的单个通道。
答案 2 :(得分:1)
只需使用AP的MAC地址即可。 (MAC地址是唯一的)
以下是: Can I find the MAC address of my Access point in Android?
答案 3 :(得分:1)
对于唯一标识符,您可以使用 BSSI +频
实施例: - AA:AA:AA:AA:AA:AA + 2432和AA:AA:AA:AA:AA:AA + 5230在双频段情况下是独一无二的
答案 4 :(得分:1)
您可以找到路由器的Mac地址,并将其用作唯一标识路由器的基础。
您可以通过检查Android设备ARP表并比较您连接的路由器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;
}