通过iBeacon Monitoring& amp;检测信标。 Ranging vs CoreBluetooth scanForPeripheralsWithServices

时间:2015-01-31 19:12:07

标签: ios bluetooth-lowenergy core-bluetooth ibeacon

iOS对于想要扫描BLE信标\外设的应用程序所施加的限制存在很多混淆。 在阅读了几篇博客和Stack Overflow答案之后,我想看看我是否正确理解了所有问题。如果有什么我误解或错过了,请纠正我。我只提到iOS 7及更高版本,专注于检测而不是连接(你能使用iBeacon Monitoring& Ranging API连接到CLBeacon吗?)。

信标的选项很明确 - 使用通用BLE外设或使用在iBeacon format中通告的BLE外设(另外,非标准外设可以在adv-packet中以iBeacon格式进行通告和扫描响应数据包中的不同格式。)

一般限制

  • iBeacon Ranging会让你知道你周围的信标。您必须指定信标预先通告的ProximityUUID(否#34;一般"扫描)。将使用最近找到的CLBeacon对象数组每秒调用didRangeBeacons。距离信标的距离及其准确性是由iOS使用一些机密算法计算的,只有Apple的开发人员才知道(该算法基于rssi值和rssi-at-1-meter校准字节表示信标通告)。每次进入或退出某个区域时,您也可以使用iBeacon Monitoring来呼叫代理人 - 再次,您必须指定您要查找的ProximityUUID(您还可以指定一个主要和次要)。 "退出某个地区"由一段时间没有收到任何广告定义,因此不能立即。可以同时监控每台设备的区域数量限制为20 - 这意味着如果其他应用同时监控\范围,您的应用可能无法监控\范围(对吗?)。
  • CoreBluetooth - 您还可以检测信标广告中的其他广告结构。如果信标也以iBeacon格式进行广告,则您无法看到iBeacon字段(ProximityUUID,主要,次要......),尽管它们是在标准"制造商特定"您可以在其他情况下看到的广告结构。

在前台运行 - 限制较少的用例:

  • iBeacon测距和监控 - 没有进一步的限制。
  • CoreBluetooth - 在nil serviceUUIDs中传递scanForPeripheralsWithServices将扫描所有外围设备。一些CBCentralManagerScanOptionAllowDuplicatesKey作为YES在选项中传递将使didDiscoverPeripheral被多次调用同一个外围设备\信标(我假设使用你检测到广告的计时器没有收到一些时间并假设用户退出"区域")。

在后台运行 - 更受限制的用例:

  • iBeacon Ranging无法直接使用。 iBeacon Monitoring将调用didEnterRegion并给予应用程序运行时间6秒 - 您可以在其中开始测距(例如,检测主要和次要)。由于iOS打开和关闭扫描以保持电池电量,因此检测可能不会立即进行。如果您输入具有相同ProximityUUID的多个信标的区域,并且您在没有特定主要和/或次要的情况下监视此UUID,则当您开始从第一个信标接收信号时将调用didEnterRegion - 但是,如果您没有退出第一个信标的区域,你也进入了第二个信标的区域,应用程序将不再被唤醒(didEnterRegion将不再被调用)所以你无法开始测距以检测第二个信标&# 39; s major&次要。该应用程序不能简单地弹出到前台,但可以创建本地通知和其他后台操作。
  • CoreBluetooth - 根据Core Bluetooth Background Processing scanForPeripheralsWithServices可以在后台运行,但必须指定至少一个serviceUUID。 didDiscoverPeripheral将被赋予10秒的运行时间。使用CBCentralManagerScanOptionAllowDuplicatesKey将无法使用 - didDiscoverPeripheral将为每个外围设备调用一次。因此,您无法检测到"退出"来自该地区和"重新进入"。我想你可以使用一个非标准的BLE外设来改变它的MAC地址来克服这个问题。该应用程序不能简单地弹出到前台,但可以创建本地通知和其他后台操作。由于iOS打开和关闭扫描以保持电池电量,因此检测可能不会立即进行。

在应用被杀后运行

  • iBeacon监控 - 工作!即使用户杀死了应用程序或设备已重新启动。
  • CoreBluetooth - 如果应用程序被iOS杀死(由于不活动或内存限制),应用程序将被唤醒。但是,如果用户明确杀死了应用程序,它就不会被唤醒(这使得第一个案例难以测试)。我不知道设备重启后会发生什么......

有没有人对这些限制有更多经验?在某些用例中,scanForPeripheralsWithServices可以用作iBeacon Monitoring的更好替代方案吗?

谢谢!

1 个答案:

答案 0 :(得分:4)

你的描述大多正确。只有两点澄清:

  • 每个设备的20个区域限制,它是特定于应用的。无论其他应用在移动设备上做什么,您的应用仍然可以通过iOS监控多达20个地区。也就是说,可能的硬件限制是特定于设备的,可以通过硬件辅助在后台监控多少个区域。这些限制没有记录。如果超过这些未记录的限制,则在后台检测到信标可能需要更长的时间。 (尽管如此,无论如何,检测何时都没有OS保证。)

  • 您无法使用监控和范围API连接到CLBeacon。这些API仅适用于无连接的BLE广告包。

是的,可以使用scanForPeripheralsWithServices作为替代方案。这就是Gimbal信标为实现专有系统所做的事情。然而,在背景检测时间和可靠性方面存在实际缺点。