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

20

有没有什么方法可以获取特定WiFi路由器的唯一标识符?

我试图编写一个需要知道连接到哪个路由器的Android应用程序。我知道Android提供了一种获取当前连接网络的BSSID的方法,但出乎我的意料,这不是唯一的。
我发现在双频路由器上,即使它们在同一个SSID下,两个不同的设备可能会得到两个不同的BSSID。
是否有其他参数我可以获取,可以唯一地标识我所连接的WiFi?如果可以的话,我很想尝试一些第三方库,因为我很确定Android没有比给我提供BSSID更好的方法。

编辑:我想找出已将家庭WiFi(通过应用程序)设置为与我相同WiFi的所有人。每个用户都设置他们的“家庭WiFi”,然后在服务器上保存(我保存的是MAC地址)。然后,每个用户都可以查询谁在他们的WiFi上,并查看他们当前是否连接到该WiFi。搜索与我连接的相同MAC地址来查询“谁在我的WiFi上”会失败,如果我家中有双频,因为他们可能连接到第二个频率(从而是第二个MAC)。


也许如果您解释一下为什么想要这样做,我们可以提出其他实现更大目标的替代方案。 - Brian White
@BrianWhite 更新了问题,说明了我想要实现的目标。 - Urban
好的,这是“什么”(原问题是“如何”),但对“为什么”仍然模糊不清。知道自己是否在同一个AP上的目的是什么?您将通过此信息实现什么? - Brian White
我的应用程序基本上告诉你你的室友中谁在家。我使用WiFi来确定谁在家谁不在家。路由器的MAC地址用于确定谁是我的室友,也就是谁住在这个房子里。 - Urban
@Urban,在这种情况下,查询您的公共IP地址并进行比较如何?它可能是动态的,但不会经常更改。您将匹配使用相同NAT防火墙的所有人,这比访问点要广泛一些,但对于您的目的可能还可以。或者您也可以训练系统识别多个MAC地址为相同,并以此方式匹配。或者始终存在“粗略”位置服务。 - Brian White
显示剩余6条评论
5个回答

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

enter image description here

请注意,您可以确定自己连接到了2.4 GHz频段(“Frequency: 2452”)。重复使用5 GHz频段进行此过程会显示以下内容:

enter image description here

正如您所看到的,两个不同频段的MAC地址仅有一个数字不同;我不知道这是否适用于所有路由器。如果确实如此,那么您可以通过分析MAC地址(BSSID)和频率的组合来确定自己连接的是哪个接入点。


我已经获取了我所连接的双频带的所有上述细节,并注意到其中一些的BSSID在第3个或甚至第2个字符(在xx:oo:xx:xx:xx:xx中的o处)处不同。这意味着即使对于不同的频段,它们之间也没有一致性。 - Urban
3
如果您考虑到2.4GHz和5GHz频段本质上是具有唯一MAC地址的独立路由器,那么我不知道是否有办法确定任何给定的2.4GHz和5GHz频段属于同一个物理访问点。 - Willis
嗯,我希望有一种方法可以做到这一点。 - Urban
MAC地址是以1600万为一块分配给公司的。如何将它们分配给实际接口取决于制造商,尽管按顺序分配是常见的做法,但并非总是如此。有时,即使不应该这样做,他们甚至在设备的不同接口上使用相同的MAC地址。 - Brian White
由于他们的研究付出了很大的努力,我打算给予此回答赏金奖励。然而,由于这并没有完全“解决”我的问题,所以我不会将其标记为答案。感谢@Willis。 - Urban

2
不幸的是,没有任何一个“保证”的方法可以唯一地识别特定的接入点。您可以使用SSID、MAC等来接近实现这个目标,但不一定每次都奏效,并且如果有人想欺骗它,仍然是有可能的。如果您希望考虑不同的WiFi接口(与支持该WiFi的物理设备不同),则MAC地址就是您需要的(除了错误地重新使用MAC的破损设备)。我使用“接口”这个词,因为在同一个接口上支持多个网络(即SSID)是可能的。接口将有效地成为单个频道上的单个频率。

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;
}

我对ARP不太熟悉,所以我得试一下,但是如果将这两个频率视为两个不同的接入点,这样会返回两个不同的地址,对吗? - Urban
可能,我不知道。 - Knossos
我在单频路由器上尝试了一下,结果与getBSSID方法相同。我非常确定在双频路由器上也会返回两个地址。 - Urban

1

1
这就是我在问题中已经描述的内容。BSSID(你在答案中提供链接的)对于两个不同的频段返回了两个不同的值。 - Urban

1

对于唯一标识符,您可以使用BSSI+频率

例如:- AA:AA:AA:AA:AA:AA+2432和AA:AA:AA:AA:AA:AA+5230在双频情况下是唯一的


1
那并没有帮助。在你的例子中,你的两个BSSID是相同的(AA:AA:AA....),然而,正如我在问题中所描述的,对于同一个双频路由器,我得到了两个不同的BSSID。这意味着如果我有两个双频路由器,我将会有4个唯一的BSSID。因此,用频率附加它们并不能使事情变得更好。 - Urban

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接