深情的遥控器 · SecondLevelDomainForbi ...· 10 月前 · |
留胡子的铅笔 · ComboBoxItem Class ...· 1 年前 · |
单身的斑马 · MvvmLight ...· 1 年前 · |
求醉的水龙头 · JavaMe开发:绘制可自动换行文本-小程序 ...· 1 年前 · |
踏实的毛衣 · linux删除文本文件空白行 - 知乎· 1 年前 · |
有没有办法为特定的wifi路由器获取任何唯一的标识符?
我正在尝试写一个Android应用程序,它需要知道它连接到哪个路由器。我知道android提供了一种方法来获取当前连接的网络的BSSID,但令我惊讶的是,这并不是唯一的。
我发现在双频路由器上,两个不同的设备可能会获得两个不同的BSSID,即使它们位于相同的SSID上。
有没有其他参数可以让我唯一识别我所连接的wifi?如果允许的话,我很乐意尝试一些第三方库,因为我非常确定Android不会提供比给我BSSID更好的方法。
编辑:我正在试着找出谁都把他们家里的wifi (通过应用程序)设置为和我一样的wifi。每个用户设置他们的“家庭Wi-Fi”,保存在服务器上( mac地址就是我要保存的地址)。然后,每个用户都可以查询他们的Wi-Fi上的所有人,以及他们当前是否连接到该Wi-Fi。'who is on my wifi‘的查询是通过搜索与我连接的MAC地址相同的MAC地址来完成的。如果我的家庭有一个双频段,这将失败,因为它们可以连接到第二个频率(因此第二个MAC)。
您假设
getBSSID()
将为两个不同的频段返回两个不同的地址,这一假设是正确的,因为它们实际上是两个不同的接入点,一个2.4 GHz和一个5 GHz,只是简单地封装在同一个包中。我编写了一个快速应用程序,它可以获取并显示使用
WifiInfo
类可以获得的所有可用字段。当我连接到接入点的2.4 GHz频段时,详细信息如下:
请注意,您可以告诉您已连接到2.4 GHz频段(“频率: 2452")。对5 GHz频段重复此过程将显示以下内容:
如您所见,两个不同频段的MAC地址仅相差一个数字;我不知道是否所有路由器都是如此。如果确实如此,那么您可以通过分析MAC地址(BSSID)和频率的组合来最终确定您连接的接入点。
只需使用AP的MAC地址。(MAC地址是唯一的)
下面是如何实现的: Can I find the MAC address of my Access point in Android?
对于唯一标识符,可以使用BSSI+Frequency
示例:-AA:AA+2432和AA:AA+5230在双频段情况下是唯一的
您可以找到路由器的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>
* We assume that the file has this structure:<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();