- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个需要一系列信标的项目,我查看了很多都使用的示例代码 CLLocationManager
和 CLBeaconRegion
.我的问题是 didRangeBeacons
回调每秒只被调用一次。
虽然我没有找到任何专门针对信标的代码示例,但我认为 CoreBluetooth 可以让我更好地控制我的应用程序扫描信标的频率是否正确?
我的想法是,如果我能够以更高的速率(比如 200 毫秒)扫描信标,我将能够在我的过滤功能中使用更多的 RSSI 值,从而获得更准确的接近度,而不会花费太长时间。我的假设是否正确?
任何人都可以向我指出有关将 CoreBluetooth 与信标一起使用的任何示例代码/教程(如果值得付出额外的努力)?
最佳答案
如果您使用 CoreBluetooth 而不是 CoreLocation 来扫描信标,则您会为检测到的每个广告数据包获得一个回调,而对于 CoreLocation,您将获得每秒一个回调。 这两种方法各有优缺点,因此准确了解每种方法的工作原理以做出正确的选择非常重要。优缺点受信标广告速率影响较大,标准iBeacon广告速率为10Hz。
使用 CoreLocation 测距
以下方法将每秒获得一次回调,但仅适用于匹配 iBeacon 布局并匹配该布局中的 ProximityUUID 的 BLE 广告,该布局已作为 CLBeaconRegion
的一部分注册进行测距。目的。当满足这些条件时,无论在该时间间隔内检测到多少信标数据包,都会每秒调用以下回调:locationManager(_ manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], in region: CLBeaconRegion)
.
每个CLBeacon
beacons
数组中的对象有一个 rssi
field 。该字段包含在过去一秒间隔内检测到的所有信标数据包的平均 RSSI。
如果信标以 10 Hz 的频率进行广告,则该 RSSI 读数将是过去一秒内收到的 8-10 个数据包的平均值(由于 radio 噪声、冲突和干扰,通常只有 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
有几个缺点。 :
关于ios - 用于信标的 CoreBluetooth,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41737833/
我在为 MacOSX 构建的独立包中添加 DMG 背景的自定义图标时遇到问题。我在项目的根目录中添加了一个包。正在从中加载自定义图标,但没有加载 DMG 背景图标。我正在使用 Java fx 2.2.
Qt for Symbian 和 Qt for MeeGo 有什么区别?我知道 Qt 是一个交叉编译平台。这是否意味着如果我使用来自 Qt 的库,完全相同的库可以在所有支持 Qt 的设备(例如 Sym
我正在尝试使用 C# .NET 3.5/4.0 务实地运行 SQL Server 数据库的备份。我已经找到了如何完成此操作,但是我似乎找不到用于备份的命名空间库。 我正在寻找 Microsoft.Sq
我最近在疯狂学习 Java,但我通常是一名 .NET 开发人员。 (所以请原谅我的新手问题。) 在 .Net 中,我可以在不使用 IIS 的情况下开发 ASP.Net 页面,因为它有一个简化的 Web
这post仅当打印命令中有字符串时才有用。现在我有大量的源代码,其中包含一条声明,例如 print milk,butter 应该格式化为 print(milk,butter) 用\n 捕获行尾并不成功
所以我的问题是: https://gist.github.com/panSarin/4a221a0923927115584a 当我保存这个表格时,我收到了标题中的错误 NoMethodError (u
如何让 Html5 音频在点击时播放声音? (ogg 用于 Firefox 等浏览器,mp3 用于 chrome 等浏览器) 到目前为止,我可以通过 onclick 更改为单个文件类型,但我无法像在普
如果it1和it2有什么区别? std::set s; auto it1 = std::inserter(s, s.begin()); auto it2 = std::inserter(s, s.en
4.0.0 com.amkit myapp SpringMVCFirst
我目前使用 Eclipse 作为其他语言的 IDE,而且我习惯于不必离开 IDE 做任何事情 - 但是我真的很难为纯 ECMAScript-262 找到相同或类似的设置。 澄清一下,我不是在寻找 DO
我想将带有字符串数组的C# 结构发送到C++ 函数,该函数接受void * 作为c# 结构和char** 作为c# 结构字符串数组成员。 我能够将结构发送到 c++ 函数,但问题是,无法从 c++ 函
我正在使用动态创建的链接: 我想为f:param附加自定义转换器,以从#{name}等中删除空格。 但是f:param中没有转换器
是否可以利用Redis为.NET创建后写或直写式缓存?理想情况下,透明的高速缓存是由单个进程写入的,并且支持从数据库加载丢失的数据,并每隔一段时间持久保存脏块? 我已经搜查了好几个小时,也许是goog
我正在通过bash执行命令的ssh脚本。 FILENAMES=( "export_production_20200604.tgz" "export_production_log_2020060
我需要一个正则表达式来出现 0 到 7 个字母或 0 到 7 个数字。 例如:匹配:1234、asdbs 不匹配:123456789、absbsafsfsf、asf12 我尝试了([a-zA-Z]{0
我有一个用于会计期间的表格,该表格具有期间结束和开始的开始日期和结束日期。我使用此表来确定何时发生服务交易以及何时在查询中收集收入,例如... SELECT p.PeriodID, p.FiscalY
我很难为只接受字符或数字的 Laravel 构建正则表达式验证。它是这样的: 你好<-好的 123 <- 好的 你好123 <-不行 我现在的正则表达式是这样的:[A-Za-z]|[0-9]。 reg
您实际上会在 Repeater 上使用 OnItemDataBound 做什么? 最佳答案 “此事件为您提供在客户端显示数据项之前访问数据项的最后机会。引发此事件后,数据项将被清空,不再可用。” ~
我有一个 fragment 工作正常的项目,我正在使用 jeremyfeinstein 的 actionbarsherlock 和滑动菜单, 一切正常,但是当我想自定义左侧抽屉列表单元格时,出现异常
最近几天,我似乎平均分配时间在构建我的第一个应用程序和在这里发布问题!! 这是我的第一个应用程序,也是我们的设计师完成的第一个应用程序。我试图满足他所做的事情的外观和感觉,但我认为他没有做适当的事情。
我是一名优秀的程序员,十分优秀!