Wi-Fi 感知扫描限制

Wi-Fi Aware scan throttling

Google 在 Android 8 或 9 中引入了一组关于 Wi-Fi 扫描频率的限制。应用程序扫描 Wi-Fi 连接的频率受到限制,包括 P2P Wi-Fi 对等点。 Wi-Fi Aware 的情况如何?它有同样的限制吗?是不是更容易绕过?

这个答案是根据 OP 的最新评论。

跟踪网络 RSSI 的一种方法是注册意图 RSSI_CHANGED_ACTION using a BroadcastReceiver and then extract the raw RSSI values from the Intent's extra values which are stored with the key Wi-FiManager.EXTRA_NEW_RSSI and obtain the threshold levels(usually the workable values) using calculateSignalLevel()。一些大概的代码:

    } else if (action.equals(WifiManager.RSSI_CHANGED_ACTION)) {
        // Default to -200 as its below WifiManager.MIN_RSSI.
        int rawRssi = intent.getIntExtra(WifiManager.EXTRA_NEW_RSSI, -200);
        int rssiLevel = mWifiManager.calculateSignalLevel(rawRssi);
    }

此外,要回答之前关于 Wi-Fi 感知是否受相同扫描限制的问题,答案是 'no',而不是因为它具有针对 Wi-Fi 的豁免-Direct 但因为它的操作方式不同于 Wi-Fi-Direct 连接。对于 Wi-Fi Direct 连接,需要对 WifiManager 进行 request() 以启动扫描,这些扫描会受到限制,限制的持续时间根据应用程序是否是在 foreground/background。当然可以从“开发者设置”页面覆盖此限制。

Wi-Fi-Aware 使用不同的范例。如果这是关于测距的使用,那么可以在两个设备之间利用 Wi-Fi-Aware 技术,如下所示:

  1. 使用 context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI_RTT);

    检查是否支持使用 Wi-Fi-RTTI api 进行测距
  2. 通过注册 intent WifiRttManager.ACTION_WIFI_RTT_STATE_CHANGED 检查 Wi-Fi RTT 是否可用,并在其收到后检查 Wi-Fi RTT 是否可用。

  3. 创建一个ranging request

  4. 开始ranging

  5. 从成功的测距结果中提取rssi

需要注意的一件事是,根据框架中的 this 代码,每个 UID 的测距请求限制为 20 个。

static final int MAX_QUEUED_PER_UID = 20;

请注意,如果您 运行 作为常规应用程序,您的应用程序将拥有自己的 UID。