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