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:

Android RttManagerCompat

该库利用 Java 反射来访问 API,基本上它似乎可以工作。

更新:

  • 该应用程序必须安装在 system/priv-app/ 文件夹中
  • 因此phone需要root。

更新:

  • Android P 提供了一个 public API,这使得该库已过时。

Android P 开始,现在可以使用 Wi-Fi RTT (IEEE 802.11mc) 的 public API。

WiFiRttManager

将以下内容添加到您的 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