位置驱动程序功率和性能指南
以下部分介绍了确保位置驱动程序节省电源并高效提供数据的指南。
跟踪连接的客户端数和无线电状态
位置传感器必须跟踪已连接应用程序的数量,并且必须跟踪每个已订阅应用程序的 SENSOR_PROPERTY_LOCATION_DESIRED_ACCURACY 和 SENSOR_PROPERTY_CURRENT_REPORT_INTERVAL 属性的值。
当连接的客户端数为零时,位置传感器会进入尽可能最低的功率状态,最好是 D3。 当事件指示客户端已连接时,传感器应退出低功率状态并获取数据。
此外,如果定位设备包含无线电(如 GPS 位置传感器),则还必须使用无线电管理跟踪无线电状态。 驱动程序编写器必须创建一个与驱动程序通信的无线电管理实现,以设置无线电状态。 传感器地理位置驱动程序示例中提供了无线电管理实现以及如何与驱动程序通信的示例。
跟踪连接的客户端和无线电状态时,位置传感器应在无线电打开时,在任何时候没有连接的客户端时,进入尽可能低的功率状态,最好是 D3。 下图说明了连接的客户端的状态机、无线电状态和建议的相应设备状态。
下表提供了各种输入组合和结果输出(包括电源状态)的另一个视图。
客户端存在(输入) | 无线电状态(输入) | CRI(输入) | 位置报告(输入) | ASIC 状态(输出) | 传感器状态(输出) | 电源状态(输出) |
---|---|---|---|---|---|---|
否 | 任意 | 任意 | 任意 | 关 | 空值 | D3 |
是 | 开 | <= 120 秒 | 否 | 开 | 正在初始化 | D0 |
是 | 开 | <= 120 秒 | 是 | 开 | 就绪 | D0 |
是 | 关 | 任意 | 任意 | 关 | 不可用 | D3 |
是 | 开 | >120 秒 | 任意 | 关 | 就绪 | D3 |
是 | 开 | >120 秒 | 任意 | 开 | 就绪 | D0 |
WDK 中的传感器地理位置驱动程序示例提供了一个跟踪连接客户端数量和无线电状态的驱动程序示例。
跟踪报告间隔
通过订阅事件来使用位置数据的应用程序通过设置 SENSOR_PROPERTY_CURRENT_REPORT_INTERVAL 属性请求数据更新事件的最大频率。 为了节约能源,驱动程序发送数据报告的频率不应超过请求的最低报告间隔。
有关如何跟踪每个应用程序的值的详细信息,请参阅筛选数据。 还可以在 WDK 的传感器地理位置驱动程序示例中找到跟踪报告间隔的示例。
跟踪所需准确度
正如跟踪每个客户端的报告间隔一样,必须跟踪每个客户端请求的准确度级别。
WDK 中的传感器地理位置驱动程序示例提供了一个跟踪客户端所需准确度的驱动程序示例。
位置传感器驱动程序必须支持 SENSOR_PROPERTY_LOCATION_DESIRED_ACCURACY 作为可设置的属性。 驱动程序应监视连接的客户端的所需准确度属性,并根据请求的最高所需准确度设置 SENSOR_PROPERTY_LOCATION_DESIRED_ACCURACY。
如果应用请求的最高准确度为 DESIRED_ACCURACY_DEFAULT,则位置传感器应优化功率和其他成本注意事项。 如果可以从系统上的其他提供程序获得位置数据,并且数据准确性为 500 米或更高,则位置 API 不会使用 GPS 传感器。
如果任何应用请求 DESIRED_ACCURACY_HIGH,传感器应提供可能的最高准确度报告。 位置 API 将始终连接到所有位置传感器(包括 GPS),以获取尽可能准确的位置。
检测空闲状态
驱动程序检测空闲状态,并进入低功率状态。 例如,当 GPS 设备的位置未更改、没有挂起的 I/O 请求或数据不可用时,可能会出现空闲状态。 如果 GPS 或全球导航卫星系统 (GNSS) 设备是通过 USB 实现的,则必须支持选择性挂起。 有关详细信息,请参阅在基于 UMDF 的驱动程序中支持空闲关闭电源。
GPS 和全球导航卫星系统 (GNSS) 的位置插入
GPS 或全球导航卫星系统 (GNSS) 传感器可以使用来自系统上三角测量传感器的数据来缩短首次定位的时间。 这称为位置插入。
仅在采集阶段支持这种传感器到传感器通信。 全球导航卫星系统 (GNSS) 驱动程序可以通过传感器 API 与任何三角测量传感器(包括 Windows 定位程序)建立连接。 然后,如果位置数据可用,驱动程序可以获取粗略的位置。 获取位置后,驱动程序应立即关闭连接。
如果全球导航卫星系统 (GNSS) 驱动程序在 15 秒内未从传感器 API 获取位置,则应超时并关闭与传感器 API 的连接。 不要继续订阅事件。
与 Windows 定位程序(或通过传感器 API 的任何其他传感器)的持久连接不应保持打开。
不要实例化 ILocation,以从其他位置传感器获取数据。 请改用传感器 API (ISensorManager)。
传感器不应从相同类型的位置传感器获取数据。 例如,三角测量传感器不应使用来自其他三角测量传感器的数据。
若要访问三角测量传感器,请调用 ISensorManager::GetSensorByType,类型为 SENSOR_TYPE_LOCATION_TRIANGULATION。 这将返回所有三角测量传感器,包括 Windows 8 内置的 Windows 定位程序。 GPS 驱动程序需要能够处理从零个传感器返回到多个传感器的任何位置。 有关使用 GetSensorsByType 的详细信息,请参阅检索传感器对象。
Windows 定位程序不提供任何准确性或可用性的保证。
不支持使用传感器 API 进行传感器到传感器通信以启用位置融合(例如,使用加速计或陀螺磁力计数据来估计物理位置)。