任何 iBeacon 接近 UUID 的应用回调
Posted
技术标签:
【中文标题】任何 iBeacon 接近 UUID 的应用回调【英文标题】:App callback for any iBeacon proximity UUID 【发布时间】:2015-04-16 01:47:10 【问题描述】:我玩过 Airlocate 和两部 iPhone。也在 Linux /hcitool 信标发射器和 Airlocate 测距之间。我看到要跟踪的一组邻近 UUID 是硬编码在 Airlocate 源代码中的。
当 ios 应用位于任何 iBeacon(任何邻近 UUID)附近时,是否有可能获得更通用的回调,并让该应用决定如何以它想要的方式行事。
我知道从操作系统的角度来看这绝对是可能的,因为我在 PDU 的开头看到了一个 9 字节的 iBeacon 前缀,它与邻近 UUID 无关。
另一个查询 - 我将 APP 中的邻近 UUID 硬编码视为某种配对。一般蓝牙配对与此有何不同。
我提出这些问题的目的是了解使用信标传送(广播)数据的可行性,以便附近的所有接收者都能接收到它。如果我选择使用特定的 16 字节邻近 UUID,那么我只剩下 5 个字节(主要/次要/功率)来发送数据。否则我得到 21 个字节
【问题讨论】:
iOS 中的核心位置库要求您(至少)指定信标的 UUID 以及可选的主要和次要值。这些定义了一个“区域”,您一次可以监控 20 个区域。 iBeacon 的典型用例是使用应用程序识别某个位置,然后将此信息提供给某些服务以检索数据 【参考方案1】:通过“更通用的回调”,您似乎正在尝试收听不是由您部署的 iBeacons。答案是否定的,你不能那样做。
根据这篇文章:http://beekn.net/2013/10/ibeacons-can-my-ios-app-find-beacons-that-arent-mine/ ,要收听 iBeacon,您必须首先知道它的邻近 UUID。 不幸的是,Apple 决定限制您这样做的能力。 CoreBluetooth 框架可以检测附近的 iBeacon,但由于它只返回设备 UUID,而不是接近 UUID,因此您无法向它们添加回调。
并且android可以毫无问题地读取任何iBeacon的proximityUUID。
【讨论】:
这对 iOS 来说是正确的。为了澄清更多,CoreLocation
不会在没有首先指定 ProximityUUID 的情况下给您任何回调。 CoreBluetooth
,同时过滤掉所有 iBeacon 传输,因此您根本无法读取它们。在这里阅读更多:developer.radiusnetworks.com/2013/10/21/…
我从您的回答中得知,我无法使用核心定位获得我想要的东西,即如果我的 BLE 发射器在 PDU 的数据部分传输 9 字节 iBeacon 前缀。现在我的问题是 - 如果我不放 iBeacon 前缀,我可以使用 CoreBluetooth 获得任何蓝牙广告(信标而不是 iBeacons)的回调 - 还是我必须指定 6 字节设备 MAC(位于标头之间和 PDU 中的数据)以获取回调。
核心蓝牙框架不会询问您的 iBeacon 接近 UUID,它可以扫描附近的所有广播 BT 设备,是的,它会给您一个已扫描设备的回调。
对@CraigZheng 的评论稍加补充——CoreBluetooth 可以扫描附近所有正在广播的BTLE 设备。我确实意识到上下文表明 LE 是正在讨论的内容(毕竟 iBeacons 是 LE 构造),但考虑到 LE 和经典之间的区别,以及新手经常遇到的困惑,明确指出这可能是有用的,如果不是为了OP,然后为后续读者。
澄清:CoreBluetooth 仅在您的应用处于前台时为您提供制造商广告的回调以上是关于任何 iBeacon 接近 UUID 的应用回调的主要内容,如果未能解决你的问题,请参考以下文章
iBeacons - locationManager:didEnterRegion 回调和 UUID
在后台使用 iBeacon 或 CoreBluetooth 识别 iOS 设备
如何在不知道 UUID、任何可能获得核心蓝牙或其他方式的情况下检测 iBeacons
使用 CLLocationManager 获取 iBeacon 邻近度更新
对于具有不同 UUID、major 和 minor 的多个 iBeacon,仅触发一次 didEnterRegion 事件