是否可以使用 CoreBluetooth 而不是 iBeacons 在后台测量距离?

Is it possible to use CoreBluetooth instead of iBeacons to measure distance in the background?

我正在做一个项目,其中固定的 iPad 将充当 BLE 外围设备,而 iPhone 将充当 BLE 中心。当 iPhone 进入 距离 iPad 几米 时,iPhone 将 做一些事情 。 iPhone 需要能够 运行 在后台或锁定。

我一直在使用 CoreLocation 库来创建 iBeacon。使用测距方法,CoreLocation 允许我找到信标的 准确度和接近度 。但是,根据我的发现,CoreLocation 不允许 进行背景测距。我还发现 monitoring 一个信标区域可以触发 enter/exit 允许我临时启动应用程序的事件(~5秒),然后是准确度和接近度的范围。然而,这个解决方案不会工作,因为iPad的信标范围非常大,并且中央设备会触发enter/exit 在设备到达我的目标范围(外围设备几米)之前很久发生的事件。

因此,我一直在研究 CoreBluetooth 库 作为 CoreLocation/iBeacons 的替代品。我知道使用 CoreBluetooth,我必须根据 RSSI 手动计算距离。

我的第一个问题是, Are my assumptions correct? Would CoreBluetooth be a good alternative to use for this project?

我的第二个问题是, Can the iPhone (central) determine the distance between itself and the iPad (peripheral) while locked or running in the background?

提前致谢!

CoreBluteooth 通常无法替代 CoreLocation 来检测信标,原因有很多:

  1. 您根本无法使用 Core Bluetooth 检测 iBeacon 传输。 Apple 明确阻止您这样做,如果广告数据与 iBeacon 匹配,则在 CoreBluetooth API 中清除广告数据。

  2. 在后台使用 CoreBluetooth 检测其他信标格式的能力很差。制造商广告(如 AltBeacon)几乎完全在后台被阻止(您只能检测到一个数据包!)。可以在后台检测到服务广告(如 Eddystone),但相对于使用 CoreLocation 获得的回调而言,回调速度非常慢。

  3. 缺少许多其他 CoreLocation 功能,例如应用程序在信标检测时自动启动,以及在您的应用程序暂停时进行快速背景检测的硬件过滤器。

您实际上可以通过几种不同的方式使用 CoreLocation 在后台对信标进行测距:

  1. 如您所见,每个区域 entry/exit 过渡后 10 秒。
  2. 如果您请求额外的背景 运行 时间,则每个区域 entry/exit 转换后最多 180 秒。
  3. 无限期,如果您将 Info.plist 设置为具有位置背景模式,并注册定期位置更新(例如 log/lon 位置更新)

上面的选项 2 和 3 适用于 CoreLocation,但不适用于 CoreBluetooth。要通过选项 3 进入 AppStore,您必须让 Apple 审阅者相信您的应用程序提供了合法的后台位置跟踪功能。

最后,您可以根据 CLBeacon#rssi 属性 进行自己的距离计算。最好在 20-30 秒内对它进行平均以减少噪音,并且您将以某种方式需要自己的参考值来了解 1 米处的预期 RSSI,因为第三方软件无法读取信标帧中嵌入的参考值.但您可能不需要这样做。如果您只是用您的应用程序瞄准 iPads,您可以简单地将信标内的校准常数调整为您的 iPad 的预期 1 米距离 RSSI,并且您应该获得更准确的距离测量。

尽管存在上述缺点,但在某些情况下您仍想使用 CoreBluetooth。出于这个原因,我构建了 this repo

也可以使用高级技术,例如使用 CoreBluetooth 在事件上强制屏幕读取来自 "Overflow Area" advertisements 的 RSSI。