【问题标题】:Fetch unique identifier for a WiFi router获取 WiFi 路由器的唯一标识符
【发布时间】:2015-04-17 07:46:28
【问题描述】:

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

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

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

【问题讨论】:

  • 为什么不直接使用接入点的名称?
  • 两个不同的房子可以有相同的接入点名称(SSID)。所以这不是唯一的。例如,很多人通常将 SSID 保留为默认路由器名称,例如“linksys-123”。
  • 好吧,我的错,我以为它会在“受控”环境中。但我认为使用接入点的“MAC”地址会起作用。
  • @Wildcopper 这就是我的想法。但是,在双频段路由器上,您可以有两个 MAC 地址,每个频段一个。好吧,至少当getBSSID 方法在连接到同一个 WiFi 的两部不同手机上返回两个不同的地址时,我能感知到这一点。
  • 也许如果你解释了为什么你想这样做,我们可以建议替代方案来实现更高的目标。

标签: java android network-programming wifi router


【解决方案1】:

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

请注意,您可以判断您已连接到 2.4 GHz 频段(“频率:2452”)。使用 5 GHz 频段重复该过程会显示以下内容:

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

【讨论】:

  • 我确实为我连接的双频段提取了上述所有这些细节,并注意到在其中一些上,BSSID 在第 3 个字符甚至第 2 个字符( xx:oo:xx:xx:xx:xx 中的 o 不同)。这意味着它们在不同频段的差异甚至没有一致性。
  • 如果您认为 2.4 和 5 GHz 频段本质上是具有唯一 MAC 地址的单个路由器,那么我不知道是否有办法确定任何给定的 2.4 GHz 和 5 GHz 频段是否属于同一个物理接入点
  • 嗯,我希望有办法做到这一点。
  • MAC 地址以 1600 万个单位分配给公司。如何将这些分配给实际接口取决于制造商,尽管按顺序分配它们很常见,但情况并非总是如此。有时他们甚至在设备的不同接口上使用相同的 MAC,即使您不应该这样做。
  • 由于他们为研究付出的努力,我给了这个答案的赏金数额。但是,由于这并没有完全“解决”我的问题,所以我没有将其标记为答案。谢谢@Willis
【解决方案2】:

遗憾的是,没有保证唯一标识特定接入点的方法。您可以通过使用 SSID、MAC 等来接近,但不一定每次都有效,如果有人愿意,仍然有可能对其进行欺骗。

如果您希望考虑不同的 WiFi 接口 (1)(与支持它的物理设备相反),那么 MAC 地址根据定义就是您需要的(除非损坏的设备错误地重复使用 MAC)。

(1) 我使用“接口”这个词是因为可以在同一个接口上支持多个网络(即 SSID)。一个接口实际上是一个单一频率的单一通道。

【讨论】:

    【解决方案3】:

    只需使用 AP 的 MAC 地址即可。 (MAC地址是唯一的)

    方法如下: Can I find the MAC address of my Access point in Android?

    【讨论】:

    • 这就是我在问题中已经描述的内容。 BSSID(您在答案中提供了链接)为两个不同的频段返回两个不同的值。
    【解决方案4】:

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

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

    【讨论】:

    • 这没有帮助。在您的示例中,您的两个 BSSID 相同(AA:AA:AA ....),但是,正如我在问题中所描述的,我为同一个双频路由器获得了两个不同的 BSSID。这意味着如果我有两个双频路由器,我将有 4 个唯一的 BSSID。因此,按频率添加它们并不会让事情变得更好。
    【解决方案5】:

    您可以找到路由器的 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不是很熟悉,所以我得试试这个,但是如果两个频率被认为是两个不同的接入点,这不会返回两个不同的地址吗?跨度>
    • 可能,我不知道
    • 在单频路由器上试过,结果和getBSSID方法一样。我很确定这也会在双频路由器上返回两个地址。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多