如何检测系统是不是连接到 ad hoc 或基础设施 wifi?
Posted
技术标签:
【中文标题】如何检测系统是不是连接到 ad hoc 或基础设施 wifi?【英文标题】:How to detect if system is connected to ad hoc or infrastructure wifi?如何检测系统是否连接到 ad hoc 或基础设施 wifi? 【发布时间】:2016-04-24 00:29:37 【问题描述】:我正在开发一个应用程序,在启用下载之前检查连接是否可靠(基本上连接应该是基础设施 wifi 而不是数据包)但万一用户是
-
使用自组织网络,或
移动设备的互联网连接为 WAP
然后连接并在桌面上开始下载,它仍然是不受欢迎的。有没有办法检测某些 wifi 连接实际上不是来自 ad hoc 还是使用手机的 WAP?
【问题讨论】:
使用移动设备作为热点也是一种基础设施。 Ad-Hoc 只是两个设备之间的连接,但手机在用作热点时是 WAP,因为多个客户端可以连接到它。 感谢 RON 纠正我,现在这很清楚,我将相应地编辑问题 如果您从桌面执行此操作,我认为您无法区分常规基础设施 WAP 或作为热点 WAP 的电话,因为电话只是另一个基础设施 WAP。 ad hoc 连接不应该访问 Internet,所以这很容易。 @rai:对我下面的回答有任何评论吗?它解决了你的问题吗? 【参考方案1】:你可以检测...
-
...Ad-Hoc 网络,通过检查您是否真的可以access a server on the internet - 通常,Ad-Hoc 不包括完全连接,因此如果您有网络但无法访问 Internet,则无法下载
...通过测量请求的round-trip time 来衡量电话接入点的使用情况——它们通常在移动宽带上相当高。
long start = System.nanoTime();
HttpGet requestForTest = new HttpGet("http://m.google.com");
try
new DefaultHttpClient().execute(requestForTest); // can last...
catch (Exception e)
long rtt = System.nanoTime() - start;
// ... evaluate the rtt
此表可能与评估相关 (source)
Generation | Data rate | Latency
2G | 100–400 Kbit/s | 300–1000 ms
3G | 0.5–5 Mbit/s | 100–500 ms
4G | 1–50 Mbit/s | < 100 ms
除了这两个选项:您为什么特别禁止 Ad-Hoc 或移动宽带?你也不应该
什么都不禁止,让用户决定是否要等待很长时间或
禁止所有慢速连接,即监控传输速率几秒钟,如果太小则自动取消下载【讨论】:
【参考方案2】:本质上,您正在 ISO/OSI 模型的第 7 层上编写应用程序,并且您想知道第 2 层的内容。这显然不是它应该如何工作的。
如果你的下载量很大,你应该保护用户不要烧毁他们的移动合约的数据量,并在执行下载之前通知用户。 这也是 Google Play 商店处理大于几 MB 的下载的方式。 您可以在应用的首选项中选择仅在使用 Wi-Fi 时允许下载,这样用户就可以确保保存他们的数据计划。 如果您绝对不希望用户通过移动网络下载您的文件,请只允许 Wi-Fi,然后执行 pin 并下载 1MB 文件以测量带宽,然后再决定实际下载是否需要永远与否。其余的都由系统处理,不需要你关心。
【讨论】:
桌面如何知道Wi-Fi是通过手机?它只知道它已连接到 Wi-Fi。 桌面不应该知道。想知道设备如何在第 2 层连接只是想要控制应用程序的使用方式(无论是桌面还是移动)的蹩脚借口。如果您的应用无法处理慢速/不良连接,请修复您的应用,而不是强迫用户获得更多带宽。 但这就是问题所在。桌面需要知道它是连接到常规基础设施还是移动热点。我没有问这个问题,但这是 OP 需要回答的问题。我不认为桌面可以可靠地分辨出区别 那么唯一的答案可能是“不,它不需要知道,而且它不可能知道,除了像 AP 的 MAC 地址这样可以被欺骗的半知半解的猜测” 【参考方案3】:检查是否连接到wifi:
ConnectivityManager connManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo wifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (wifi.isConnected())
// is connected to wifi
不要忘记将权限添加到Manifest:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
【讨论】:
这不会区分来自路由器的 wifi 和 ad hoc以上是关于如何检测系统是不是连接到 ad hoc 或基础设施 wifi?的主要内容,如果未能解决你的问题,请参考以下文章