Android WiFi 设备到 AP 的往返时间 (RTT)
Android WiFi Device-to-AP Round-Trip-Time (RTT)
与AndroidAPI-Level 21
分别在SDK中添加了23种测量Wifiroundtrip time
(RTT)的方法:
但是我没有找到任何关于如何使用 API 来测量 RTT
的信息。
相关classRttManager仍标记为系统API。
有什么方法可以进行Device-To-AP RTT
测量吗?
我写了一个小库来将隐藏的 API 调用包装在 Compat class:
中
该库利用 Java 反射来访问 API,基本上它似乎可以工作。
更新:
- 该应用程序必须安装在 system/priv-app/ 文件夹中
- 因此phone需要root。
更新:
- Android P 提供了一个 public API,这使得该库已过时。
从 Android P
开始,现在可以使用 Wi-Fi RTT (IEEE 802.11mc) 的 public API。
将以下内容添加到您的 AndroidManifest:
<manifest ...>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-feature android:name="android.hardware.wifi.rtt" />
...
</manifest>
获取 WiFiRttManager 实例:
final WifiRttManager rttManager = (WifiRttManager) context.getSystemService(Context.WIFI_RTT_RANGING_SERVICE);
检查设备是否支持 Rtt 测量:
rttManager.isAvailable();
执行测距:
// A ScanResult can be retrieved by e.g. perform a WiFi scan for WiFi's in range -> https://developer.android.com/reference/android/net/wifi/ScanResult.html
final RangingRequest request = new RangingRequest.Builder()
.addAccessPoint(scanResult)
.build();
final RangingResultCallback callback = new RangingResultCallback() {
public void onRangingResults(List<RangingResult> results) {
// Handle result, e.g. get distance to Access Point
}
public void onRangingFailure(int code) {
// Handle failure
}
};
// Start ranging and return result on main thread.
rttManager.startRanging(request, callback, null);
请注意,接入点还必须支持 Wi-Fi RTT (IEEE 802.11mc)!
更新:可以在此处找到示例应用程序: Android Wifi RttManager sample
与AndroidAPI-Level 21
分别在SDK中添加了23种测量Wifiroundtrip time
(RTT)的方法:
但是我没有找到任何关于如何使用 API 来测量 RTT
的信息。
相关classRttManager仍标记为系统API。
有什么方法可以进行Device-To-AP RTT
测量吗?
我写了一个小库来将隐藏的 API 调用包装在 Compat class:
中该库利用 Java 反射来访问 API,基本上它似乎可以工作。
更新:
- 该应用程序必须安装在 system/priv-app/ 文件夹中
- 因此phone需要root。
更新:
- Android P 提供了一个 public API,这使得该库已过时。
从 Android P
开始,现在可以使用 Wi-Fi RTT (IEEE 802.11mc) 的 public API。
将以下内容添加到您的 AndroidManifest:
<manifest ...>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-feature android:name="android.hardware.wifi.rtt" />
...
</manifest>
获取 WiFiRttManager 实例:
final WifiRttManager rttManager = (WifiRttManager) context.getSystemService(Context.WIFI_RTT_RANGING_SERVICE);
检查设备是否支持 Rtt 测量:
rttManager.isAvailable();
执行测距:
// A ScanResult can be retrieved by e.g. perform a WiFi scan for WiFi's in range -> https://developer.android.com/reference/android/net/wifi/ScanResult.html
final RangingRequest request = new RangingRequest.Builder()
.addAccessPoint(scanResult)
.build();
final RangingResultCallback callback = new RangingResultCallback() {
public void onRangingResults(List<RangingResult> results) {
// Handle result, e.g. get distance to Access Point
}
public void onRangingFailure(int code) {
// Handle failure
}
};
// Start ranging and return result on main thread.
rttManager.startRanging(request, callback, null);
请注意,接入点还必须支持 Wi-Fi RTT (IEEE 802.11mc)!
更新:可以在此处找到示例应用程序: Android Wifi RttManager sample