【问题标题】:How to detect if system is connected to ad hoc or infrastructure wifi?如何检测系统是否连接到 ad hoc 或基础设施 wifi?
【发布时间】:2016-04-24 00:29:37
【问题描述】:

我正在开发一个应用程序,在启用下载之前检查连接是否可靠(基本上连接应该是基础设施 wifi 而不是数据包)但万一用户是

  1. 使用自组织网络,或
  2. 移动设备的互联网连接为 WAP

然后连接并在桌面上开始下载,它仍然是不受欢迎的。有没有办法检测某些 wifi 连接实际上不是来自 ad hoc 还是使用手机的 WAP?

【问题讨论】:

  • 使用移动设备作为热点也是一种基础设施。 Ad-Hoc 只是两个设备之间的连接,但手机在用作热点时是 WAP,因为多个客户端可以连接到它。
  • 感谢 RON 纠正我,现在这很清楚,我将相应地编辑问题
  • 如果您从桌面执行此操作,我认为您无法区分常规基础设施 WAP 或作为热点 WAP 的电话,因为电话只是另一个基础设施 WAP。 ad hoc 连接不应该访问 Internet,所以这很容易。
  • @rai:对我下面的回答有任何评论吗?它解决了你的问题吗?

标签: android networking routing network-programming wifi


【解决方案1】:

你可以检测...

  1. ...Ad-Hoc 网络,通过检查您是否真的可以access a server on the internet - 通常,Ad-Hoc 不包括完全连接,因此如果您有网络但无法访问 Internet,则无法下载
  2. ...通过测量请求的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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    • 2013-11-28
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    相关资源
    最近更新 更多