【问题标题】:Minimise battery consumption on Beacon Ranging in iOS while using iBeacon使用 iBeacon 时在 iOS 中最小化 Beacon Ranging 的电池消耗
【发布时间】:2020-10-21 13:26:14
【问题描述】:

我正在研究一个在扫描信标时需要连续回调的用例。 我想到了两种方法,但它们都有问题。

  1. 监控:监控只提供进入和退出回调。只能收听 20 个信标是有限制的。还有我可以定义的范围来获取进入和退出回调吗?例如,如果广告信标进入 2 米范围内,我会收到一个进入回调,如果设备移出该范围,我会收到一个退出回调。

  2. 测距:测距提供连续回调以及一组其他参数(如 rssi)来计算距离。然而,在测距方面的一个大问题是,与监控相比,它消耗了大量的电池。在优化电池消耗的同时获得持续回调的方法应该是什么?

我已经尝试了这两种方法并走到了死胡同。因此,这似乎是一个理论问题,但对于以某种方式解决用例的任何见解。

【问题讨论】:

    标签: ios location bluetooth-lowenergy monitoring ibeacon


    【解决方案1】:

    在使用 iOS CoreLocation 信标监控 API 时,无法设置任何类型的 rssi 或距离过滤器。使用 iBeacon 时,测距是唯一的选择。

    虽然持续 BLE 扫描的电池消耗是一个问题,但您可以通过根据需要以较低的占空比进行扫描来缓解这一问题,以满足您的要求。例如,您可以以 20% 的占空比进行扫描(并使用 20% 的电量作为恒定测距),每分钟测距 12 秒。您可以根据需要调整此占空比,以平衡电池节省和响应能力之间的目标。我参与过一些项目,我会根据应用状态更改此占空比,因此应用可以在信标很重要时对信标做出更快的响应,并在响应不那么重要时节省电池电量。

    为了能够做到这一点,您必须解锁让 iOS 让您的应用在后台无限时间运行的能力:

    1. 在 Info.plist 中添加位置背景模式
    2. 从用户那里获得“总是”位置许可。仅获得“使用时”权限是不够的。
    3. 按照此处所述启动后台任务:http://www.davidgyoungtech.com/2014/11/13/extending-background-ranging-on-ios
    4. 向 CoreLocation 请求 3 公里位置更新。这将使应用程序在后台运行,而不会从 GPS 中消耗额外的电池电量,因为 3 公里精度仅使用蜂窝无线电您不需要对这些结果做任何事情。您只需要请求他们保持应用程序的运行即可。

    完成上述操作后,您可以在计时器上调用locationManager.startRangingBeacons(...)locationManager.stopRangingBeacons(...) 来实现您想要的任何占空比。

    【讨论】:

    • 你建议在 Timer 上运行它,你的意思是 NSTimer?由于它涉及主动运行循环,并且很难在后台操作这些 NSTimer。对于在后台线程中运行并重复 5-15 秒以执行停止和开始测距的计时器,您是否有任何替代解决方案。
    • 您可以看到一个示例here 突出显示的代码设置了一个无限循环运行的后台任务,每1.0 秒唤醒一次以在主线程上运行代码。您可以将其更改为您想要的任何间隔,并更改定期执行的代码以停止/开始测距。
    • 谢谢,大卫!您能否建议停止/开始测距信标的最佳有效方法?因为我已经尝试停止所有范围内的 UUID(大约〜80)并根据您链接的示例 sn-p 代码以 20 秒的间隔再次启动它。但是通过这种方式,电池消耗量增加了更多。此外,我还使用了多个其他属性来停止/开始更新位置管理器提供的位置,但这不会影响停止远程信标以在调用停止范围/位置时提供回调。
    • 我会尝试扫描 10 秒,然后停止 110 秒,因此您每 2 分钟进行一次 10 秒扫描。
    • @davidyoung 无论如何我可以在测距时设置扫描间隔而不是运行后台计时器?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-16
    相关资源
    最近更新 更多