- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我们创建了一个 iOS 应用程序,该应用程序实现了 CBCentralManager 以连接到我们创建的以 10Hz 传输数据的设备。数据快速通过并显示非常重要,因此我们围绕此建立了严格的延迟检查,如果遗漏了太多点,或者如果本地时钟检测到输入值变慢,我们将出错并断开连接。
客户要求我们实现第二个 iOS 应用程序来观察第一个应用程序。我们在原始应用程序中实现了一个 CBPeripheralManager,它可以广告、可以连接并定期将其数据发布到一些传出特征。
我们发现我们似乎无法将观察者 iOS 应用程序连接到原始 iOS 应用程序(即,原始 iOS 应用程序同时具有与设备的 CBCentral 连接和与观察者应用程序的 CBPeripheral 连接) ), 而不会影响我们对来自设备的传入数据的延迟检查。
我已经尝试了所有我能想到的方法,我为 CBPeripheralManager 和 CBCentralManager 使用了单独的队列,如下所示:
q = dispatch_get_global_queue(QOS_CLASS_UTILITY, 0);
ptr_CBPeriphMgr = [[CBPeripheralManager alloc] initWithDelegate:self queue:q];
此外,
似乎无论我尝试什么,在外围和中央连接都处于事件状态 4-5 分钟后(我们有一个循环,其中第二个应用程序每五秒重复连接和断开连接,以挑战设备连接)我的传入从设备到中央的值更新减慢到大约 1/4 或 1/5 的速度,或者它们停止整整一秒,然后几乎同时进行三到四次更新——这两者都会触发我们的延迟检查。这就像一些队列被填满并且性能停滞不前,但正如我上面提到的,我认为我正在使用单独的队列。
我无计可施...有没有人想过如何在 iOS 应用程序中优先考虑我的核心功能而不是我的外围功能,或者以某种方式提高性能以防止这成为一个问题并保留我的应用程序响应来自设备的 10Hz 更新,即使被观察为外围设备?
(编辑声明我们正在反复连接/断开第二个应用程序......也许我在断开连接后没有正确清理,垃圾堆积起来并搞砸了 BLE?这可以解释为什么问题似乎无论第二次连接上的数据更新频率如何,都会在 4-5 分钟后发生。)
最佳答案
这里有一些建议:
QOS_CLASS_USER_INITIATED
或更高级别而不是 QOS_CLASS_UTILITY
创建队列。-[CBCentralManager stopScan]
,并在不需要时调用-[CBPeripheralManager stopAdvertising]
为传入连接做好准备(可能在您连接时)。-[CBPeripheralManager setDesiredConnectionLatency:forCentral:]
预留更多资源。但是,如果您可以针对 iOS 11+,我建议使用 L2CAP channel 来减少延迟并提高速度。尽管 CoreBluetooth 的 L2CAP 支持没有很好的记录,这里有一个 list of the available APIs .
关于ios - 如何在 CBPeripheralManager 处于事件状态时提高 CBCentralManager 的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51926555/
_manager = [[CBCentralManager alloc] initWithDelegate:self queue:nil]; [NSThread sleepForTimeInterva
我想知道如何确定 CBCentralManager 正在扫描哪些外围设备而不使用其他变量,换句话说,仅来自 CBCentralManager 对象。 最佳答案 看起来像是 CBCentralManag
iOS CoreBluetooth 中是否有一种机制,以便在发现(但未连接)外围设备“丢失”时触发事件,即正在广播的外围设备不再广播。 最佳答案 您可以在 CBCentralManager 的 sca
我想停止,然后在 CBCentralManager 上重新开始扫描。我的问题是:我应该在调用 stopScanning() 后等待交易完成,还是立即调用 startScanning()? 我不知道下层
我正在从事一个包括 CoreBluetooth 在内的项目。我研究了该主题并在网上找到了一些教程。 现在我重新创建了其中的一些教程,并且在几乎所有方法中我都遇到了以下错误: Initializer f
我正在尝试通过附近的蓝牙设备进行连接。我能够发现但无法连接它们。 这个代表正在工作,但在发现我正在尝试连接其中一个外围设备之后 func centralManager(_ central: CBCen
我正在尝试按照有关此 page 的教程进行操作,用于列出 BLE 设备并与之通信。 与作者不同,我对制作 GUI 应用程序不感兴趣,宁愿让它基于控制台。 我制作了两个文件来测试蓝牙通信,main.sw
当我运行代码并打开/关闭 MacbookPro 上的蓝牙时,状态始终为 4,对应于 PoweredOff 状态。 import Cocoa import CoreBluetooth @NSApplic
我在我的Objective-c代码中第一次使用CoreBluetooth框架。 我的iPhone版本是iPhone-3GS。 运行代码时,输出为“平台或硬件不支持低功耗蓝牙”。 我看到了3GS规范
是多个 CBCentralManager支持的实例?如果是这样,它们是在哪个版本的 iOS 中开始支持的? 我找到了 multiple emails在 Apple 邮件列表中声明它们不是。但是,这不是
我正在尝试使用 Core Bluetooth 连接两部 iPhone。一个运行外围设备,另一个运行中央设备。看来这两个设备已连接。并且在典型的控制流中调用每个方法,直到 peripheralManag
我想检查我的 iPhone 连接到了哪些蓝牙设备。为此,我使用 CBCentralManager.retrieveConnectedPeripherals()像这样: let connectedPer
我正在开发一个测试 BTLE 应用程序。用户可以选择启动中央或外设模式。如果 2 个设备都处于事件状态并且在范围内,它们会立即检测、连接并传递数据,但是...... 如果设备 1 以中央模式启动然后置
当使用 CBCentralManager 恢复状态时,字典有时会包含扫描的外围设备的 UUID internal func centralManager(_ central: CBCentralMan
我已经使用 CBCentralManager 检测到外围设备, 我用过的代码是这样的, - (void)viewDidLoad { [super viewDidLoad]; // Do
它们有什么区别?我应该什么时候使用 CBCentral 什么时候使用 CBCentralManager? 据我了解,CBCentralManager 和 CBCentral 都用于管理连接,但 CBC
我正在尝试访问 macOS (2017 iMac) 上的蓝牙外围设备,但是 CBCentralManager 似乎从未进入 .poweredOn 状态。 import Cocoa import Cor
是否支持多个 CBCentralManager 实例?我可以在我的应用程序的两个不同 View Controller 中创建两个 CBCentralManager 实例,并且都连接到同一个外围设备吗?
初始化 CBCentralManager 实例(需要委托(delegate)并且通常指向所属类)的好方法是什么? 我可以将该属性声明为隐式展开的可选属性,但作为一般做法,这样做似乎不像 Swift,也
我有一台 Mac,使用 CoreBluetooth 作为 CBPeripheralManager 设置为蓝牙配件。 Mac 在一组特征 CBUUID 上做广告,一旦它有了订阅者,我就单击一个按钮,每半
我是一名优秀的程序员,十分优秀!