获取WiFi路由器的唯一标识符

时间:2015-04-17 07:46:28

标签: java android network-programming wifi router

有什么方法可以获得特定wifi路由器的任何唯一标识符吗?

我正在尝试编写一个需要知道它连接到哪个路由器的Android应用。我知道android提供了获取当前连接网络的BSSID的方法,但令我惊讶的是,这并不是唯一的。
我发现在双频路由器上,两个不同的设备可能会获得两个不同的BSSID,即使它们位于相同的SSID上。 我可以获取任何其他参数,可以唯一标识我连接的wifi吗?我很想尝试一些第三方库,如果这样可以允许我,因为我很确定Android没有包装更好的方法而不是给我BSSID。

编辑:我正在试图找出谁将他们的家庭wifi(通过应用程序)设置为与我相同的Wi-Fi。每个用户设置他们的“家庭Wi-Fi”,它被保存在服务器上(mac地址是我正在保存的)。然后,每个用户都可以查询所有人都在他们的Wi-Fi上,以及他们当前是否在该Wi-Fi上连接。 “谁在我的wifi上”的查询是通过搜索与我连接的MAC地址相同的MAC地址来完成的。如果我的家有双频段,则会失败,因为它们可以连接到第二频率(因此也可以连接到第二频率)。

5 个答案:

答案 0 :(得分:7)

你认为getBSSID()将为两个不同的频段返回两个不同的地址是正确的,因为它们本质上是两个不同的接入点,一个2.4GHz和一个5 GHz,只是简单地包装在同一个包中。我编写了一个快速应用程序,它可以获取并显示可以使用WifiInfo类获得的所有可用字段。当我连接到接入点的2.4 GHz频段时,详细信息如下:

enter image description here

请注意,您可以告诉您已连接到2.4 GHz频段("频率:2452和#34;)。使用5 GHz频段重复该过程显示以下内容:

enter image description here

如您所见,两个不同频段的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;
}