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 技术,如下所示:
使用 context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI_RTT);
检查是否支持使用 Wi-Fi-RTTI api 进行测距
通过注册 intent WifiRttManager.ACTION_WIFI_RTT_STATE_CHANGED
检查 Wi-Fi RTT 是否可用,并在其收到后检查 Wi-Fi RTT 是否可用。
创建一个ranging request
开始ranging
从成功的测距结果中提取rssi。
需要注意的一件事是,根据框架中的 this 代码,每个 UID 的测距请求限制为 20 个。
static final int MAX_QUEUED_PER_UID = 20;
请注意,如果您 运行 作为常规应用程序,您的应用程序将拥有自己的 UID。
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 技术,如下所示:
使用
检查是否支持使用 Wi-Fi-RTTI api 进行测距context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI_RTT);
通过注册 intent
WifiRttManager.ACTION_WIFI_RTT_STATE_CHANGED
检查 Wi-Fi RTT 是否可用,并在其收到后检查 Wi-Fi RTT 是否可用。创建一个ranging request
开始ranging
从成功的测距结果中提取rssi。
需要注意的一件事是,根据框架中的 this 代码,每个 UID 的测距请求限制为 20 个。
static final int MAX_QUEUED_PER_UID = 20;
请注意,如果您 运行 作为常规应用程序,您的应用程序将拥有自己的 UID。