终止连接 CBPeripheralManager 端

Posted

技术标签:

【中文标题】终止连接 CBPeripheralManager 端【英文标题】:terminate a connection CBPeripheralManager side 【发布时间】:2014-02-03 20:48:35 【问题描述】:

有没有推荐的方法让CBPeripheralManager 终止连接。到目前为止我发现的最好的方法就是不响应动态值,然后 BLE 堆栈似乎关闭了连接,但这似乎很粗糙。

一定有更好的办法吗?

【问题讨论】:

【参考方案1】:

不,您不能从外围设备以明确的方式强制关闭连接。它没有 API。

您可以通过不响应请求来突然断开连接,这会导致最多在 30 秒后断开连接。这是蓝牙规范 Vol.3 Part F 3.3.3 定义的标准行为

30 秒内未完成的事务将超时。这样一个 交易视为失败,当地上级 层应被告知此故障。没有更多的属性协议 请求、命令、指示或通知应发送至 此 ATT Bearer 上的目标设备。

【讨论】:

这是一个奇怪的情况,关闭外围端的连接并不是一个罕见的要求。即使它只是用于测试,就像我的情况一样。这是我们都经历过的事情!即使我们没有以编程方式请求它。 Apple 工程师说,在 ios 中,许多应用程序可以使用相同的外围设备。他们正在努力寻找一种有意义的方式来取消给定的连接,但一切都太模棱两可了。所以他们最终没有办法取消连接。您需要实现自己的协议来通知中心有关断开连接的请求。我为答案添加了另一种不太干净的解决方案。 感谢您的背景故事。我的问题是我想模拟意外!外围设备意外断开连接。我不得不问自己苹果是如何进行自己的回归测试的?我想我只需要继续使用我的副作用方法,它可以解决问题,而且可能更现实。 哦,好的。我刚刚意识到您在问题中描述了该方法。我在答案中添加了标准参考以使其完整。我不确定他们测试了多少,但我怀疑他们没有对我们应该如何做提供任何帮助。如果你想测试核心蓝牙功能,那么副作用的事情是可以的。但是,要测试您的业务逻辑,最好将其与框架分离并使用单元测试对其进行测试。即使不是不可能创建协调的多设备测试也很难。 创建一个自动化测试真的很难。不仅因为它是一个分布式系统,还因为在许多情况下,堆栈包含通常在压力下被激活的故障。创建处理这些情况的测试环境实际上是不可能的。拥有一个模拟实现可能是一个更好的选择。但是,如果你觉得有能力想出一些创造性的、简单的测试方法,那么我会全心全意地支持它。

以上是关于终止连接 CBPeripheralManager 端的主要内容,如果未能解决你的问题,请参考以下文章

获取 CBPeripheralManager 订阅的 Centrals

为啥我的 CBPeripheralManager 有广告但无法被发现?

CBPeripheralManager 延迟停止广告/位置管理器范围停止 iBeacon

CBPeripheralManager AddService 上的 iOS 崩溃断言失败:

CBPeripheralManager startAdvertising 在 OS X yosemite 上不起作用

ios设备app作为蓝牙外设端