用于信标的 CoreBluetooth

2023-12-29

我有一个需要信标范围的项目,我查看了很多示例代码,它们都使用CLLocationManager and CLBeaconRegion。我的问题是didRangeBeacons每秒仅调用一次回调。

尽管我没有找到任何专门针对信标的代码示例,但我认为 CoreBluetooth 可以让我更好地控制应用程序扫描信标的频率是否正确?

我的想法是,如果我能够以更高的速率(例如 200 毫秒)扫描信标,我将能够在过滤功能中使用更多 rssi 值,从而获得更准确的接近度,而无需花费太长时间。我的假设正确吗?

谁能向我指出有关使用 CoreBluetooth 和信标的任何示例代码/教程(如果值得付出额外的努力)?


如果您使用 CoreBluetooth 而不是 CoreLocation 扫描信标,则检测到的每个广告数据包都会收到一个回调,而 CoreLocation 则每秒会收到一个回调。这两种方法都有优点和缺点,因此准确了解每种方法的工作原理以做出正确的选择非常重要。其优缺点很大程度上受信标的广告速率影响,标准的iBeacon广告速率为10 Hz。

使用 CoreLocation 测距

以下方法将每秒获取一次回调,但仅适用于与 iBeacon 布局匹配并与该布局中已注册用于测距的 ProximityUUID 的 BLE 广告CLBeaconRegion目的。当满足这些条件时,每秒调用以下回调不管在该时间间隔内检测到多少个信标数据包:

locationManager(_ manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], in region: CLBeaconRegion).

Each CLBeacon数组中的对象beacons has a rssi场地。该字段包含过去一秒间隔内检测到的所有信标数据包的平均 RSSI。

如果信标以 10 Hz 进行广播,则该 RSSI 读数将是过去一秒接收到的 8-10 个数据包的平均值(由于无线电噪声、冲突和干扰,通常仅接收到 80-90% 的数据包)。

如果信标以 1Hz 或更低的频率进行广告(典型的电池信标试图节省电量),则平均值中将只包含一个 RSSI 读数。 (无法知道回调返回的 rssi 值中有多少检测结果。)

因此,虽然您无法访问每次检测的 RSSI 值,并且无法控制平均间隔,但您确实可以从多次检测中受益,因为 RSSI 值是平均的,并且比有检测时的噪声更少。只读过一篇。因此,只要您愿意接受其硬编码的平均间隔,CoreLocation 即可为您提供与 CoreBluetooth 一样高的准确性。

The CLBeacon对象还具有字段accuracy and 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 信标工具 https://github.com/AltBeacon/ios-beacon-tools,允许检测培根CoreBluetooth并根据在任意指定的平均间隔内收集的 RSSI 来计算距离估计。

然而,使用有几个缺点CoreBluetooth:

  • iBeacon 数据包无法解码,因为操作系统会过滤掉与其布局匹配的任何数据包的数据负载。因此,您必须使用类似 AltBeacon 的布局,或者使用 Eddystone 框架。

  • 像 AltBeacon 这样的制造商广告不会在后台投放,只会在前台投放。

  • 像 Eddystone 这样的服务广告是在后台投放的,但速度非常非常慢。所以对于RSSI数据采集来说没有什么用处。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用于信标的 CoreBluetooth 的相关文章

随机推荐

  • React-Native 中的倒计时器

    我想在反应原生中加载屏幕时从 3 倒计时到 1 我用 setTimeOut 尝试过 但没有成功 我在这里做错了什么 我怎样才能实现这个目标 当屏幕加载时 我想以 1 秒的间隔显示 3 gt 2 gt 1 这是我的代码 constructor
  • 创建 SAML 断言并签署响应

    我有一个 Java Web 应用程序 我想为我的应用程序实现 SAML 单点登录 我有这个GitHub onelogin 程序 https github com onelogin java saml发送请求并获取响应 但它无法正常工作 我在
  • 如何使 IEnumerable 只读?

    为什么是列表list1Instance and p in the Main下面的代码的方法指向同一个集合 class Person public string FirstName string Empty public string Las
  • 将列添加到稀疏矩阵

    当我执行以下代码时 我得到一个稀疏矩阵 import numpy as np from scipy sparse import csr matrix row np array 0 0 1 2 2 2 col np array 0 2 2 0
  • 实体框架是否与 SQL Server 绑定?

    如果我想连接到 Oracle MySQL 甚至 MS Access 怎么办 不 它使用 ADO Net 提供程序 模型插入数据库提供程序以提供对任何第三方数据库的访问 可用列表第三方 EF 提供商在这里 http msdn microsof
  • 进入前台时的 UIRefreshControl 错误

    当我使用时我注意到一个小错误 但真的很烦人 UIRefreshControl在我的视图控制器中 当应用程序从后台返回时UIRefreshControl已经加载 看起来像这样 正如你所看到的 我使用了一个自定义导航控制器 它像 Faceboo
  • 为什么 Google 云端硬盘返回“无法解析内容范围标头。”?

    这是我的简单代码 用于恢复 可能 中断的 Google Drive 上传 Using message New ByteArrayContent New Byte message Headers ContentRange New Header
  • 从左到右表达式求值

    在 C 中 是否保证表达式从左到右计算 例如 myClass GetClass if myClass null myClass Property gt 0 continue 是否存在不符合规定的语言 您实际上指的是一种称为 短路逻辑表达式
  • 如何拥有与 OnPropertyChanged 一起使用的 UserControl 的可绑定属性

    我有一个带有一些公共属性的简单用户控件 WinForms 当我使用此控件时 我想将 DataSourceUpdateMode 设置为的数据绑定到这些属性属性改变时 数据源是一个实现 INotifyPropertyChanged 的 类 我知
  • 如何使用 Django 智能选择来过滤 ManyToManyField?

    class Course models Model course code models CharField max length 100 unique True title models CharField max length 200
  • 插入数据库时​​对密码进行哈希加密

    我正在为学校做一个应用程序 在将密码插入我的用户数据库时需要加密密码的帮助 我正在使用 C 编程语言进行编程 并且使用 MS server 2008 R2 来操作我的数据库 我正在考虑进行哈希加密 如果有人帮助我 我会很高兴 这是我将数据插
  • 查找 System.AccessViolationException 的原因

    我们的应用程序遇到了奇怪的致命 System AccessViolationException 当我们配置 AppDomain CurrentDomain UnhandledException 事件来记录异常时 我们会看到这些 Except
  • 这个 PHP 代码安全吗?

    只是一个简单的问题 以下 PHP 代码安全吗 还有什么你认为我可以或应该补充的吗 post GET post if is numeric post post mysql real escape string post else die NA
  • C# 将一个字符串的一部分复制到另一个字符串

    我正在尝试将文本框的部分文本复制到另一个字符串 例如 如果我的文本框包含 10 个字符 我想将字符 3 到字符 7 复制到另一个名为 TEST 的字符串 我们该怎么做呢 when textbox contains ABCDEFGHIJ th
  • 从 R 中的一系列情节创建电影 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 有没有一种简单的方法可以通过在 R 中将多个情节拼接在一起来创建 电影 这是我使用 R 帮助找到的一种方法 要创建单独的图像帧 jpe
  • 写入 log4net FileAppender 时存在多线程性能问题

    TickZoom 是一款非常高性能的应用程序 它使用自己的并行化库和多个操作系统线程来平滑地利用多核计算机 该应用程序遇到了瓶颈 用户需要从单独的操作系统线程将信息写入 LogAppender FileAppender 使用 Minimal
  • hide() 单选按钮*和*它在 jquery 中的文本标签

    我正在回顾最近的一个项目 解决可访问性问题 并确保所有表单元素都有标签 将标签文本放入标签中会导致我之前编写的一些笨拙代码出现问题 基本上 如果您有一个单选按钮及其标签
  • R 将正数和负数的 $xxx.xx 更改为 xxx.xx 但不舍入

    我有一个 df 其中第 2 列及以后的列是美元金额 例如 1004 23 1482 40 2423 94 等 类似于下面的示例 gt df id desc price 1 0 apple 1 00 2 1 banana 2 25 3 2 g
  • 从 C# 调用时将记录选项返回为 null

    是否有可能返回record option从 F 到 C 的值作为空值 我想将一些逻辑封装在 F 程序集中 并尽可能多地隐藏在外观后面 对 C 来说更自然 这是一些综合示例 type Data DataField1 int DataField
  • 用于信标的 CoreBluetooth

    我有一个需要信标范围的项目 我查看了很多示例代码 它们都使用CLLocationManager and CLBeaconRegion 我的问题是didRangeBeacons每秒仅调用一次回调 尽管我没有找到任何专门针对信标的代码示例 但我