用于信标的 CoreBluetooth
CoreBluetooth for beacons
我有一个需要信标范围的项目,我查看了很多示例代码,它们都使用了 CLLocationManager
和 CLBeaconRegion
。我的问题是 didRangeBeacons
回调每秒只调用一次。
虽然我没有找到任何专门针对信标的代码示例,但我认为 CoreBluetooth 可以让我更好地控制我的应用扫描信标的频率是否正确?
我的想法是,如果我能够以更高的速率(例如 200 毫秒)扫描信标,我将能够在我的过滤功能中使用更多的 rssi 值,从而获得更准确的接近度,而不会花费太长时间。我的假设是否正确?
任何人都可以向我指出任何关于将 CoreBluetooth 与信标一起使用的示例 code/tutorial(如果值得付出额外的努力)?
如果您使用 CoreBluetooth 而不是 CoreLocation 来扫描信标,则您会为检测到的每个广告数据包获得一个回调,而 CoreLocation 则每秒获得一个回调。有优点也有缺点对于这两种方法,因此重要的是要准确了解每种方法的工作原理以做出正确的选择。优劣受beacon的广告率影响很大,标准的iBeacon广告率是10Hz。
使用 CoreLocation 测距
以下方法每秒将获得一次回调,但仅适用于匹配 iBeacon 布局并匹配该布局内已注册为测距的 ProximityUUID 的 BLE 广告,作为 CLBeaconRegion
对象的一部分。满足这些条件时,每秒调用以下回调 ,而不管在该时间间隔内检测到多少个信标数据包:
locationManager(_ manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], in region: CLBeaconRegion)
.
beacons
数组中的每个 CLBeacon
对象都有一个 rssi
字段。该字段包含在过去一秒间隔内检测到的所有信标数据包的平均 rssi。
如果信标以 10 Hz 的频率广播,则此 RSSI 读数将是过去一秒内收到的 8-10 个数据包的平均值(由于无线电噪声、冲突和干扰)。
如果信标以 1Hz 或更低的频率进行广告(典型的电池信标试图节省电量),那么平均值中将只包含一个 RSSI 读数。 (无法知道回调返回的 rssi 值中有多少检测。)
因此,虽然您无法访问每次检测的 rssi 值,也无法控制平均间隔,但在 rssi 值被平均的意义上,您确实获得了多次检测的好处,并且比只有一个读数时噪音小。 CoreLocation 因此可以为您提供与 CoreBluetooth 一样多的准确性,前提是您愿意接受其 hard-coded 平均间隔。
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。这使您可以 fine-grained 控制 rssi 的使用,并且您可以在任意平均间隔内进行距离估计。
上述动机促使我开发了开源 iOS Beacon Tools,它允许使用 CoreBluetooth
检测培根并根据在任意指定的平均间隔内收集的 rssi 计算距离估计值。
但是,使用 CoreBluetooth
有几个缺点:
iBeacon 数据包无法解码,因为操作系统会过滤掉与其布局匹配的任何数据包的数据负载。为此,您必须使用类似 AltBeacon 的布局,或使用 Eddystone 框架。
像AltBeacon这样的厂商广告不在后台投放,只在前台投放。
像 Eddystone 这样的服务广告在后台投放,但速度非常非常慢。所以对rssi数据采集没有用
我有一个需要信标范围的项目,我查看了很多示例代码,它们都使用了 CLLocationManager
和 CLBeaconRegion
。我的问题是 didRangeBeacons
回调每秒只调用一次。
虽然我没有找到任何专门针对信标的代码示例,但我认为 CoreBluetooth 可以让我更好地控制我的应用扫描信标的频率是否正确?
我的想法是,如果我能够以更高的速率(例如 200 毫秒)扫描信标,我将能够在我的过滤功能中使用更多的 rssi 值,从而获得更准确的接近度,而不会花费太长时间。我的假设是否正确?
任何人都可以向我指出任何关于将 CoreBluetooth 与信标一起使用的示例 code/tutorial(如果值得付出额外的努力)?
如果您使用 CoreBluetooth 而不是 CoreLocation 来扫描信标,则您会为检测到的每个广告数据包获得一个回调,而 CoreLocation 则每秒获得一个回调。有优点也有缺点对于这两种方法,因此重要的是要准确了解每种方法的工作原理以做出正确的选择。优劣受beacon的广告率影响很大,标准的iBeacon广告率是10Hz。
使用 CoreLocation 测距
以下方法每秒将获得一次回调,但仅适用于匹配 iBeacon 布局并匹配该布局内已注册为测距的 ProximityUUID 的 BLE 广告,作为 CLBeaconRegion
对象的一部分。满足这些条件时,每秒调用以下回调 ,而不管在该时间间隔内检测到多少个信标数据包:
locationManager(_ manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], in region: CLBeaconRegion)
.
beacons
数组中的每个 CLBeacon
对象都有一个 rssi
字段。该字段包含在过去一秒间隔内检测到的所有信标数据包的平均 rssi。
如果信标以 10 Hz 的频率广播,则此 RSSI 读数将是过去一秒内收到的 8-10 个数据包的平均值(由于无线电噪声、冲突和干扰)。
如果信标以 1Hz 或更低的频率进行广告(典型的电池信标试图节省电量),那么平均值中将只包含一个 RSSI 读数。 (无法知道回调返回的 rssi 值中有多少检测。)
因此,虽然您无法访问每次检测的 rssi 值,也无法控制平均间隔,但在 rssi 值被平均的意义上,您确实获得了多次检测的好处,并且比只有一个读数时噪音小。 CoreLocation 因此可以为您提供与 CoreBluetooth 一样多的准确性,前提是您愿意接受其 hard-coded 平均间隔。
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。这使您可以 fine-grained 控制 rssi 的使用,并且您可以在任意平均间隔内进行距离估计。
上述动机促使我开发了开源 iOS Beacon Tools,它允许使用 CoreBluetooth
检测培根并根据在任意指定的平均间隔内收集的 rssi 计算距离估计值。
但是,使用 CoreBluetooth
有几个缺点:
iBeacon 数据包无法解码,因为操作系统会过滤掉与其布局匹配的任何数据包的数据负载。为此,您必须使用类似 AltBeacon 的布局,或使用 Eddystone 框架。
像AltBeacon这样的厂商广告不在后台投放,只在前台投放。
像 Eddystone 这样的服务广告在后台投放,但速度非常非常慢。所以对rssi数据采集没有用