【问题标题】:Corebluetooth - maintain connection on iOS14Corebluetooth - 在 iOS14 上保持连接
【发布时间】:2021-07-29 12:20:48
【问题描述】:

总结一下,我有一个设备通过 ble 与我的应用程序通信。该应用程序使用 Corebluetooth 来处理连接和通信。

问题:

当设备超出范围时,它将断开连接 -> 它调用 diddisconnect() 函数,我在其中检查它是否超时并再次调用 central.connect。

然后它会立即开始连接并立即在某些设备(仅限 iOS14)上,它会转到 didfailtoconnect 并显示错误消息:

"Error Domain=CBErrorDomain Code=15 "连接加密失败,连接意外超时。" UserInfo={NSLocalizedDescription=连接加密失败,连接意外超时。"

据我所见,似乎只存在于 iOS14 设备上。

我还测试了阻塞信号,如果我阻塞来自设备的信号,问题并不明显。如果我阻止来自手机的信号,问题就很明显了。不知道这是怎么回事,感觉他们都触发了超时。

其他地方也可能有问题,但在我的 iOS13 设备上似乎处理得很好。(主要在 4 部手机上测试,每个版本 2 部)

另外澄清一下,应用程序充当中心,设备充当外围设备。

【问题讨论】:

  • 你搞错了。一旦您的设备超出范围,您应该只在设备在范围内而不直接连接到设备时宣传它。连接产生错误 bcz 设备不可用。
  • @Kudos 感谢您的回复,但据我了解,调用连接会在系统级别排队连接,直到找到设备(或蓝牙/电话已关闭)。你有什么好的例子来说明你的意思,当设备进入范围时保持连接?
  • 是的,就像您正在使用荣誉乐队 5。如果超出范围,您将被断开连接。然后你就可以开始扫描设备,直到它被扫描。
  • @Kudos 是的,我应该尝试在设备断开连接时启动扫描。据我在苹果文档中看到的,有 3 种方法。其中两个是从系统中获取已知或连接的外围设备并尝试连接。第三就像你说的,你用服务扫描。我只是不明白为什么它在 iOS14 之前可以正常工作。

标签: ios swift core-bluetooth ios-bluetooth


【解决方案1】:

如果我从 CBErrorEncryptionTimedOut (15) 正确解释错误消息,则意味着设备启动了连接,然后,在 iOS 设备启动加密过程后,连接突然中断。

所以应该和 CBErrorConnectionTimeout (6) 一样对待它。

如果这种情况一直发生,您应该使用 BLE 嗅探器来查看发生了什么;可能是 iOS 的一些 bug。

【讨论】:

  • 是的,当设备超出范围且 iPhone iOS 版本为 14.xx 时,断开连接似乎非常一致。有趣的是,我测试了使用微波炉干扰信号(不是打开),结果是,如果我把手机放在微波炉里,等一分钟再拿出来,问题就存在了。如果我也这样做,但将设备放在微波炉中 - 不是问题。正如您提到的,也测试了该方法,将其视为超时并重新连接。它循环了函数几次,但最终保持连接。
猜你喜欢
  • 1970-01-01
  • 2018-06-06
  • 1970-01-01
  • 2018-09-29
  • 2012-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
相关资源
最近更新 更多