gpt4 book ai didi

ios - 通过iBeacon监控和测距与CoreBluetooth scanForPeripheralsWithServices检测信标

转载 作者:IT王子 更新时间:2023-10-29 08:12:15 24 4
gpt4 key购买 nike

iOS对要扫描BLE信标\外围设备的应用程序施加的限制存在很多困惑。
在阅读了几个博客和Stack Overflow的答案之后,我想看看我是否正确理解了所有问题。如果我误会或错过任何事情,请纠正我。我仅指iOS 7及更高版本,并专注于检测而不是连接(可以使用iBeacon监视和测距API连接到CLBeacon吗?)。

信标的选项很明确-使用通用BLE外围设备或使用以iBeacon format进行广告的BLE外围设备(此外,非标准外围设备也可以以iBeacon格式在adv数据包中进行广告,而在扫描中以其他格式进行广告-响应数据包)。

一般限制

  • iBeacon测距会让您知道周围有哪些信标。您必须指定信标预先发布的ProximityUUID(不进行“常规”扫描)。 didRangeBeacons将被每秒发现的CLBeacon对象数组每秒调用一次。与信标的距离及其准确性是由iOS使用只有Apple开发人员才真正知道的 secret 算法来计算的(该算法基于信标宣传的rssi值和rssi-at-1米校准字节)。您还可以在每次进入或退出区域时使用iBeacon Monitoring来调用代表-再次必须指定要查找的ProximityUUID(也可以指定主要和次要)。 “退出区域”是由一段时间内未收到任何广告定义的,因此不能立即生效。每个设备可同时测距/监视的区域数量每个设备限制为20-这意味着,如果其他应用程序同时进行测距/测距,您的应用程序可能将无法测距/测距(对吗?)。
  • CoreBluetooth-您还可以在信标的广告中检测其他广告结构。如果该信标也以iBeacon格式进行广告发布,则您将看不到iBeacon字段(ProximityUUID,major,minor ...),尽管它们是按照标准的“特定于制造商”的广告结构发送的,您在其他情况下也可以看到这些字段。

  • 在前景中运行-限制较少的用例:
  • iBeacon测距和监视-没有更多限制。
  • CoreBluetooth-在nilserviceUUIDs中传递scanForPeripheralsWithServices将扫描所有外围设备。在选项中将CBCentralManagerScanOptionAllowDuplicatesKey传递为YES将使同一外围设备/信标多次调用didDiscoverPeripheral(我假设使用计时器,您检测到一段时间未收到广告,并假设用户退出了“区域”) 。

  • 在后台运行-更为严格的用例:
  • iBeacon测距不能直接工作。 iBeacon Monitoring将调用didEnterRegion并为应用程序提供6秒钟的运行时间-您可以在其中开始测距(例如,检测主要和次要)。由于iOS会打开和关闭扫描以节省电池电量,因此检测可能不会立即进行。如果您输入具有相同ProximityUUID的多个信标区域,并且监视此UUID而没有特定的主音和/或次音,则当您开始从第一个信标接收信号时会调用didEnterRegion-但是,如果您没有退出第一个信标的区域,并且您还输入了第二个信标的区域,该应用程序将不会再次被唤醒(不会再次调用didEnterRegion),因此您无法开始检测第二个信标的主要和次要区域。该应用程序不能简单地弹出到前台,而是可以创建本地通知和其他后台操作。
  • CoreBluetooth-根据Core Bluetooth Background Processing的使用,scanForPeripheralsWithServices可以在后台运行,但必须至少指定一个serviceUUID。 didDiscoverPeripheral的运行时间为10秒。使用CBCentralManagerScanOptionAllowDuplicatesKey将不起作用-每个外围设备都会调用一次didDiscoverPeripheral。因此,您无法从该区域检测到“退出”并“重新进入”。我想您可以使用更改其MAC地址的非标准BLE外设来解决此问题。该应用程序不能简单地弹出到前台,而是可以创建本地通知和其他后台操作。由于iOS会打开和关闭扫描以节省电池电量,因此检测可能不会立即进行。

  • 应用程序被杀死后运行
  • iBeacon监视-正常运行!即使用户终止了该应用程序或设备已重新启动。
  • CoreBluetooth-如果该应用被iOS杀死,则该应用将被唤醒(由于不 Activity 或内存限制)。但是,如果用户明确终止了该应用程序,则不会将其唤醒(这使得第一种情况很难测试)。我不知道设备重启后会发生什么...

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

    谢谢!

    最佳答案

    您的描述大体上是正确的。仅作两个澄清:

  • 每个设备的20个区域限制为而不是,这是特定于应用程序的。无论其他应用程序在移动设备上正在执行什么操作,iOS仍允许您的应用程序监视多达20个区域。就是说,可能存在特定于设备的硬件限制,这些限制是在硬件协助下可以在后台监视多少个区域的。这些限制未记录。如果超过了这些未记录的限制,则在后台检测到的信标可能会花费更长的时间。 (尽管如此,无论如何,并不能保证检测到的操作系统。)
  • 您无法使用监视和测距API连接到CLBeacon。这些API仅适用于无连接的BLE广告包。

  • 是的,可以使用 scanForPeripheralsWithServices作为替代。这就是云台信标为实现专有系统所做的工作。但是,在背景检测时间和可靠性方面存在真正的缺点。

    关于ios - 通过iBeacon监控和测距与CoreBluetooth scanForPeripheralsWithServices检测信标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28255475/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com