CoreBluetooth 用于信标
Posted
技术标签:
【中文标题】CoreBluetooth 用于信标【英文标题】:CoreBluetooth for beacons 【发布时间】:2017-01-19 09:12:07 【问题描述】:我有一个需要一系列信标的项目,我查看了很多示例代码,它们都使用CLLocationManager
和CLBeaconRegion
。我的问题是 didRangeBeacons
回调每秒只被调用一次。
虽然我没有找到任何专门针对信标的代码示例,但我认为 CoreBluetooth 可以让我更好地控制我的应用扫描信标的频率是否正确?
我的想法是,如果我能够以更高的速率(比如 200 毫秒)扫描信标,我将能够在我的过滤功能中使用更多的 rssi 值,从而获得更准确的接近度而不会花费太长时间。我的假设是否正确?
任何人都可以向我指出任何有关将 CoreBluetooth 与信标一起使用的示例代码/教程(如果值得付出额外的努力的话)?
【问题讨论】:
是的,不是的。如果信标是“纯信标”,ios 会将其广告翻译为信标(例如,android 不会),并且只能通过 CoreLocation 看到。如果是混合的,可以使用 CoreBluetooth 看到,但不能使用 CoreLocation。 “高级”信标,可以切换和发送他们想要的任何东西,作为“纯信标”,或两者兼而有之(为了让大多数信标可以通过 CoreBluetooth 进行配置)。 @Larme 这很有趣。所以,如果它是一个“纯粹的信标”,我会被 CoreLocation 困住吗?是否有不同信标类型(纯、高级、混合)的列表? 【参考方案1】:如果您使用 CoreBluetooth 而不是 CoreLocation 来扫描信标,则检测到的每个广告数据包都会收到一个回调,而 CoreLocation 每秒会收到一个回调。这两种方法各有利弊,所以重要的是要准确了解每个工作是如何做出正确选择的。 Beacon 的广告速率对优缺点影响很大,标准的 iBeacon 广告速率为 10 Hz。
使用 CoreLocation 测距
以下方法将每秒获得一次回调,但仅适用于匹配 iBeacon 布局并匹配该布局内的 ProximityUUID 的 BLE 广告,该布局已注册为 CLBeaconRegion
对象的一部分。当满足这些条件时,每秒调用一次以下回调无论在该时间间隔内检测到多少信标数据包:
locationManager(_ manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], in region: CLBeaconRegion)
.
beacons
数组中的每个 CLBeacon
对象都有一个 rssi
字段。该字段包含在过去一秒间隔内检测到的所有信标数据包的平均 rssi。
如果信标以 10 Hz 的频率进行广播,则此 rssi 读数将是过去一秒内收到的 8-10 个数据包的平均值(由于无线电噪声、冲突和干扰,通常仅收到 80-90% 的数据包) .
如果信标的广告频率为 1Hz 或更低(典型的电池信标会尝试节省电量),则平均值中只会包含一个 rssi 读数。 (无法知道回调返回的 rssi 值中有多少检测。)
因此,虽然您无法从每次检测中访问 rssi 值,并且您无法控制平均间隔,但您确实可以从多次检测中受益,因为 rssi 值是平均的且噪音较小好过只有一次阅读。 如果您愿意接受其硬编码的平均间隔,CoreLocation 可为您提供与 CoreBluetooth 一样高的准确性。
CLBeacon
对象还具有 accuracy
和 proximity
的字段,它们基于在较长时间间隔内过滤的 rssi 派生值(实验表明它大约为 20 秒)。 API 中无法控制此平均间隔,对于一些需要快速更新距离估计的应用程序来说,20 秒是一个很长的延迟。
使用 CoreBluetooth 扫描
这通常通过设置允许重复结果的标志来完成:
centralManager.scanForPeripherals(withServices: [], options: [CBCentralManagerScanOptionAllowDuplicatesKey: true] )
当上述扫描开始时,对每一个检测到的蓝牙广告进行以下回调:
centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber)
此回调中的 rssi 编号是来自单个数据包检测的原始值。如果您的信标以 10 Hz 的频率进行广告,您将在此方法上每秒收到 8-10 个回调(同样,不是 100% 的数据包被接收),您可以根据需要平均或过滤您的 rssi。这使您可以对使用 rssi 进行细粒度控制,并且您可以在任意平均间隔上进行距离估计。
上述动机促使我开发了开源 iOS Beacon Tools,它允许使用 CoreBluetooth
检测培根,并根据在任意指定的平均间隔内收集的 rssi 计算距离估计。
但是,使用CoreBluetooth
有几个缺点:
iBeacon 数据包无法解码,因为操作系统会过滤掉与其布局匹配的任何数据包的数据负载。因此,您必须使用类似于 AltBeacon 的布局,或使用 Eddystone 框架。
像 AltBeacon 这样的制造商广告不会在后台投放,而只会在前台投放。
像 Eddystone 这样的服务广告在后台投放,但速度非常非常慢。所以对 rssi 数据收集没有用处。
【讨论】:
感谢您的详尽回答。你的意思是说虽然 altbeacon 一样准确,只是延迟时间可能更短? 将 CoreBluetooth 与 AltBeacon 结合使用可以增加访问单个 RSSI 读数的灵活性,是的。更少的延迟是利用这种灵活性最引人注目的用例。以上是关于CoreBluetooth 用于信标的主要内容,如果未能解决你的问题,请参考以下文章
CoreBluetooth 监控 100 个具有相同 UUID 且具有唯一输入的信标
当我使用我的 Android 设备作为使用 AltBeacon 的 ibeacon 时找不到 CoreBluetooth