https://source.android.google.cn/devices/tech/connect/wifi-rtt
Android 9 中的 WLAN 往返时间 (RTT) 功能允许设备测量与其他支持设备的距离:无论它们是接入点 (AP) 还是 WLAN 感知对等设备(如果设备支持 WLAN 感知功能)。此功能基于 IEEE 802.11mc 协议,使应用能够使用准确性更高的定位功能和增强的感知功能。
在位于 device// 的 device.mk 中,修改 PRODUCT_COPY_FILES 环境变量,以便支持 WLAN RTT 功能:

PRODUCT_COPY_FILES += frameworks/native/data/etc/android.hardware.wifi.rtt.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.wifi.rtt.xml

用户可以利用 WLAN RTT(往返时间)API 提供的 WLAN 定位功能,测量距附近支持 RTT 的 WLAN 接入点和 WLAN 感知对等设备的距离。

如果是测量与三个或更多接入点的距离,则可以使用多点定位算法来预估与这些测量值最相符的设备位置。结果通常可以精确到 1 至 2 米。

凭借这种精准度,可以开发基于精确位置的服务,例如室内导航、无歧义语音控制。

请求发出设备无需连接到接入点即可通过 WLAN RTT 测量距离。为维护隐私,只有发出请求的设备能够确定距接入点的距离,接入点没有此信息。前台应用执行 WLAN RTT 操作不受限制,但后台应用执行此类操作时会受限。

WLAN RTT 和相关精确时间测量 (FTM) 功能由 IEEE 802.11mc 标准规定。WLAN RTT 需要 FTM 提供的精确时间测量,因为前者通过测量数据包在设备之间往返所需的时间,并将该时间乘以光速来计算两个设备之间的距离。

实现RTT要求:
1、测距请求发出设备的硬件必须实现 802.11mc FTM 标准。
2、测距请求发出设备必须运行 Android 9(API 级别 28)或更高版本的操作系统。
3、测距请求发出设备必须启用位置服务并打开 WLAN 扫描(Settings > Location)。
4、测距请求发出设备必须拥有 ACCESS_FINE_LOCATION 权限。
5、接入点必须实现 IEEE 802.11mc FTM 标准。

应用使用 WLAN RTT,需要完成:
1、 请求权限

<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_FINE_LOCATION" />

ACCESS_FINE_LOCATION 权限属于危险权限,因此每次用户要执行 RTT 扫描操作时,您都需要在运行时请求该权限。如果尚未获得授权,则应用需要向用户请求该权限。
2.、检查设备是否支持 WLAN RTT

context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI_RTT);

3、 检查 WLAN RTT 是否可用
设备上可能存在 WLAN RTT,但由于用户已禁用 WLAN,该功能目前或不可用。如果 SoftAP 或网络共享处于使用状态,则某些设备可能不支持 WLAN RTT,具体视设备的硬件和固件功能而定。如要检查 WLAN RTT 当前是否可用,请调用 isAvailable()。

WLAN RTT 的可用性随时可能发生变化。您的应用应注册一个 BroadcastReceiver,以接收 ACTION_WIFI_RTT_STATE_CHANGED(系统会在可用性发生变化时发送该内容)。当应用收到广播 Intent 时,其应检查可用性的当前状态,并对其行为进行相应调整。

IntentFilter filter =new IntentFilter(WifiRttManager.ACTION_WIFI_RTT_STATE_CHANGED);
BroadcastReceiver myReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {if (wifiRttManager.isAvailable()) {…} else {…}}
};
context.registerReceiver(myReceiver, filter);

创建测距请求

通过指定请求范围的 AP 或 WLAN 感知对等设备的列表,即可创建测距请求 (RangingRequest)。您可以在单个测距请求中指定多个接入点或 WLAN 感知对等设备,然后测量并返回与所有设备的距离。

例如,请求可以使用 addAccessPoint() 方法指定要测量距离的接入点:

RangingRequest.Builder builder = new RangingRequest.Builder();
builder.addAccessPoint(ap1ScanResult);
builder.addAccessPoint(ap2ScanResult);RangingRequest req = builder.build();

接入点由其 ScanResult 对象标识,该对象可通过调用 WifiManager.getScanResults() 获得。您可以使用 addAccessPoints(List) 批量添加多个接入点。

与之类似,测距请求可以通过以下两种途径添加 WLAN 感知对等设备:使用 addWifiAwarePeer(MacAddress 对等点) 方法利用请求的 MAC 地址,或者使用 addWifiAwarePeer(PeerHandle 对等点) 方法利用请求的 PeerHandle。

请求测距

应用使用 WifiRttManager.startRanging() 方法发出测距请求,并提供以下内容:用于指定操作的 RangingRequest、用于指定回调上下文的 Executor,以及用于接收结果的 RangingResultCallback。

WifiRttManager mgr =(WifiRttManager) Context.getSystemService(Context.WIFI_RTT_RANGING_SERVICE);RangingRequest request ...;
mgr.startRanging(request, executor, new RangingResultCallback() {@Overridepublic void onRangingFailure(int code) { … }@Overridepublic void onRangingResults(List<RangingResult> results) { … }
});

测距操作以异步方式执行;测距结果在 RangingResultCallback 的某个回调中返回:

如果整个测距操作失败,则会触发 onRangingFailure 回调,并返回 RangingResultCallback 中描述的状态代码。如果该服务当时出于某些原因(例如 WLAN 遭到禁用、应用请求的测距操作过多并受到限制,或者存在权限问题)无法执行测距操作,则可能会发生此类失败。
测距操作完成后,会触发 onRangingResults 回调,并返回与请求列表匹配的结果列表(每个请求匹配一个结果)。结果的顺序不一定与请求的顺序一致。请注意,测距操作可能已经完成,但每个结果仍有可能提示该特定测量失败,

解释测距结果

onRangingResults 回调返回的每个结果均由 RangingResult 对象指定。请对每个请求执行以下操作。

  1. 识别请求
    根据创建 RangingRequest 时提供的信息来识别请求。该信息通常是在 ScanResult 中提供的 MAC 地址,用于识别接入点。您可以使用 getMacAddress() 方法从测距结果中获得 MAC 地址。

测距结果列表的顺序可能与测距请求中指定的对等设备(接入点)的顺序不同,因此您应使用 MAC 地址而非结果的顺序来识别对等设备。

  1. 确定每个测量是否成功
    如要确定测量是否成功,请使用 getStatus() 方法。STATUS_SUCCESS 以外的任何值都表示失败。失败意味着此结果的所有其他字段(上述请求标识除外)均为无效字段,相应的 get* 方法也将失败,并显示 IllegalStateException 异常。

  2. 获取每个成功测量的结果
    对于每个成功的测量,您可以使用相应的 get 方法检索结果值:

距离(单位为毫米)和测量的标准偏差:

getDistanceMm()

getDistanceStdDevMm()

用于测量的数据包的 RSSI:

getRssi()

测量所用时间(以毫秒为单位;表示自启动以来的时间):

getRangingTimestampMillis()

尝试的测量个数和成功的测量个数(以及距离测量的依据):

getNumAttemptedMeasurements()

getNumSuccessfulMeasurements()

关注公众号,获取更多开发必备知识

Android RTT : 通过 RTT 确定 WLAN 位置信息相关推荐

  1. Android 打开 GPS 导航并获取位置信息

    原文地址为: Android 打开 GPS 导航并获取位置信息 最近在做一个 Android 项目,需要用到GPS获取位置信息,从 API 查了一下,发现获取位置信息仅需极其简单的一句即可: getL ...

  2. Android 获取定位权限,获取位置信息(国家、地区、经纬)

    第一步 授权 在 AndroidManifest.xml 中加上位置信息权限按需要添加 <uses-permission android:name="android.permissio ...

  3. Android GPS应用:动态获取位置信息

    随时随地技术实战干货,获取项目源码.学习资料,请关注源代码社区公众号(ydmsq666) 在上文中,介绍了GPS概念及Android开发GPS应用涉及到的常用类和方法.在本文中,开发一个小应用,实时获 ...

  4. Android11模拟定位开发,Android 11 中的位置信息更新

    为了进一步保护用户隐私,Android 11 增加了单次位置信息访问权限,并更改了用户授予在后台访问位置信息权限的方式.这些更新会影响到 Android 11 及更高版本上运行的所有应用. 单次访问权 ...

  5. android10位置信息,Android 11 中的位置信息更新

    为了进一步保护用户隐私,Android 11 增加了单次位置信息访问权限,并更改了用户授予在后台访问位置信息权限的方式.这些更新会影响到 Android 11 及更高版本上运行的所有应用. 单次访问权 ...

  6. Android开发:基于原生API获取位置信息、卫星信号个数及参与定位的卫星个数

    目录 概述 权限申请及开启GPS 调用原生API进行定位 获取设备收到的卫星信号个数 获取用于定位的卫星信号个数 成果图 概述 最近在做室内外无缝定位的相关demo,室外定位中,GNSS定位方法具有精 ...

  7. android wifi ap 定位,通过 RTT 确定 Wi-Fi 位置信息

    您可以利用 Wi-Fi RTT(往返时间)API 提供的 Wi-Fi 位置功能测量距附近支持 RTT 的 Wi-Fi 接入点和 Wi-Fi 感知对等设备的距离. 如果您测量与三个或更多接入点的距离,可 ...

  8. java更新 位置_请求位置信息更新  |  Android 开发者  |  Android Developers

    适当地使用位置信息能够为应用的用户带来好处.例如,如果应用要在用户步行或驾车时帮助他们寻路,或者如果应用要跟踪资产的位置,那么就需要定期获取设备的位置信息.除了地理位置(纬度和经度)之外,您可能还需要 ...

  9. 对Android GPS获取位置信息的新研究.

    前段时间略看了Android 的GPS API,就冒然发布了一片博文,现在再回过头来看看,确实有不少不足甚至错误.这篇算做补充和纠正吧. 1.要想获取位置信息,需要在手机设置中将"位置与安全 ...

最新文章

  1. CentOS 7部署OpenStack(9)—部署dashboard
  2. 试求由a,b,c三个字母组成的n位符号串中不出现aa图像的符号串的数目
  3. 开发路上踩过的坑要一个个填起来————持续更新······(7月30日)
  4. mac 系统安装总结
  5. python画折线图详解-手把手教你Python yLab的绘制折线图的画法
  6. python中的for循环
  7. matlab中rowset什么意思,没什么用的matlab代码1
  8. 从bootm 命令讲起/U-boot的环境变量: bootcmd 和bootargs
  9. python简短语法_python 简单语法入门
  10. Qt工作笔记-QVector下标访问和迭代访问效率实践(大跌狗眼)
  11. Windows下Redmine插件安装
  12. numpy.reshape(与ndarray.reshape一样)使用方法
  13. PMF镜像中文件提取/diskgenius做的镜像文件
  14. 中国微电网市场趋势报告、技术动态创新及市场预测
  15. echarts 柱形图数据位置显示
  16. Oracle ORA-28000 the account is locked
  17. luogu P5234 [JSOI2012]越狱老虎桥
  18. 广东省电子商务认证有限公司
  19. 一句话理解青蛙跳台阶(C语言递归求解)每日一题
  20. vue项目打包后出现页面布局异常、图片显示不出来等问题

热门文章

  1. [译] 第三章 MCMC
  2. 点云学习笔记15——PCL常用的基础代码
  3. 【图像重建】基于ART算法和SIRT算法实现超声CT反演附MATLAB代码
  4. 【源码】MIC工具箱:迭代与全局优化算法工具箱
  5. 如何获取沪深股市历史数据并入库
  6. 天猫9月上旬规则变动合集
  7. 创新/技术/设计的本质,是什么?
  8. 一位优秀管理者每天、每周、每月的工作安排,你做到了几点
  9. 多线程(三)——了解线程
  10. 何谓 Add-on Domain,Subdomain,Parked domain,无限个又代表甚么意思?