如何检测系统是不是连接到 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?的主要内容,如果未能解决你的问题,请参考以下文章

可达性帮助 - WiFi 检测

使用 iOS 7 无线分发 ad hoc

在不受支持的 iOS 设备上安装 ad hoc

004.Ansible Ad-Hoc命令集

Ansible Ad-Hoc命令集

004.Ansible Ad-Hoc命令集