首页 文章

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

提问于
浏览
19

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

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

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

5 回答

  • 1

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

    enter image description here

    请注意,您可以告诉您已连接到2.4 GHz频段(“频率:2452”) . 使用5 GHz频段重复此过程显示以下内容:

    enter image description here

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

  • 1

    遗憾的是,没有保证唯一识别特定接入点的方法 . 您可以通过使用SSID,MAC等来接近,但它不一定每次都能正常工作,如果他们愿意,某人仍然可以欺骗它 .

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

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

  • 6

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

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

  • 1

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

    示例: - AA:AA:AA:AA:AA:AA 2432和AA:AA:AA:AA:AA:AA 5230在双频段情况下是独一无二的

  • 2

    您可以找到路由器的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;
    }
    

相关问题