Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取WiFi路由器的唯一标识符_Java_Android_Network Programming_Wifi_Router - Fatal编程技术网

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

Java 获取WiFi路由器的唯一标识符,java,android,network-programming,wifi,router,Java,Android,Network Programming,Wifi,Router,是否有任何方法可以获取特定wifi路由器的唯一标识符 我正在尝试编写一个Android应用程序,需要知道它连接到哪个路由器。我知道android提供了一种获取当前连接网络BSSID的方法,但令我惊讶的是,这并不是唯一的。 我发现在双频路由器上,两个不同的设备可能会获得两个不同的BSSID,即使它们位于同一个SSID上。 是否有任何其他参数可以唯一标识我连接的wifi?如果允许的话,我很想尝试一些第三方库,因为我非常确定Android没有比给我BSSID更好的打包方法 编辑:我正在尝试找出谁都将他

是否有任何方法可以获取特定wifi路由器的唯一标识符

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


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

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

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


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

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

以下是如何:

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

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

您可以找到路由器的Mac地址,并将其作为唯一标识它的基础

您可以通过检查Android设备的ARP表并比较您所连接的路由器IP来实现这一点。此处可以显示一个示例:

相关代码摘录:

/**
 * 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;
}
/**
*尝试使用从给定IP地址提取硬件MAC地址
*ARP缓存(/proc/net/ARP)。
*
*我们假设该文件具有以下结构:
*
*IP地址HW类型标志HW地址掩码设备 *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 *@从ARP缓存返回MAC */ 公共静态字符串getMacFromArpCache(字符串ip){ 如果(ip==null) 返回null; BufferedReader br=null; 试一试{ br=新的BufferedReader(新的文件读取器(“/proc/net/arp”); 弦线; 而((line=br.readLine())!=null){ String[]splitted=line.split(“+”); 如果(拆分!=null&&splitted.length>=4&&ip.equals(拆分[0])){ //基本健康检查 字符串mac=splitted[3]; 如果(mac.matches(“…:”)){ 返回mac; }否则{ 返回null; } } } }捕获(例外e){ e、 printStackTrace(); }最后{ 试一试{ br.close(); }捕获(IOE异常){ e、 printStackTrace(); } } 返回null; }
遗憾的是,没有保证唯一标识特定接入点的方法。你可以通过使用SSID、MAC等来接近它,但它不一定每次都能工作,而且如果有人愿意,仍然有可能欺骗它

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


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

为什么不简单地使用接入点的名称呢?两个不同的房屋可以有相同的接入点名称(SSID)。所以这不是唯一的。例如,许多人通常将SSID保留为默认路由器名称,如'linksys-123'。啊,好吧,我不好,我以为它会在“受控”环境中。但我认为使用接入点的“MAC”地址是可行的,这就是我的想法。但是,在双频段路由器上,您可以有两个MAC地址,每个频段一个。好吧,至少当
getBSSID
方法在连接到同一WiFi的两部不同手机上返回两个不同的地址时,我能感觉到这一点。也许如果你解释了为什么要这样做,我们可以建议替代方案来实现更高的目标。我确实为我连接的双频段收集了所有上述细节,并且注意到,在其中的一些中,BSSID在字符的第三,甚至第二的PAR上不同(在O中不同于O:xx:xx:xx:xx:xx)。这意味着,对于不同的频带,它们可能会有什么不同的一致性。如果你认为2.4和5 GHz频带本质上是单独的ROU。