我正在围绕 CoreBluetooth 开发一个简单的包装器,以将任何数据发送到任何设备。在开发过程中,我遇到了很多框架中的错误,它们非常烦人,为了使我的包装器稳定,我不得不缩短一些功能以提高可靠性。
现在我正在从外围设备发送数据。
好的,所以我有以下案例:
- 客户要求动态特性的值
- 我在服务器端收到回调 - peripheral:didReceiveReadRequest:。
注意:我需要在这个方法中响应这个 CBATTRequest - 我不能将它存储在其他地方并异步响应它。(我只是把一些 @“PrepareToReceiveValue” 块放在中央将被忽略。所有发送都在队列中完成。)
- 为了为各种设备提供数据,我构建了一个包含 BTMessage 的队列。(所以对于 readRequest 我创建消息并将其添加到发送队列。如果块发送失败 - 我将从外围管理器获得有关 readyToUpdateSubscribers 的回调,并要求队列重新发送失败的块)
- 因此,当我立即请求大量动态特征值并同时从外围设备向中央发送数据时,有时它只会冻结发送进度并导致断开连接。
经过几次测试,我发现这都是关于传输队列的:如果传输队列已满,您将收到读取请求 - 它只是不会响应它。
所以我有潜在的不稳定系统状态:
- 外围设备正在向某个中心发送数据。
- 在我的发送方法中,updateValue:forCharac... 返回 NO,因为传输队列已满。
- 此时,中心请求特性和外围设备的动态值:didReceiveReadRequest:调用将添加到当前运行循环。
- 从发送方法返回后,它将使 peripheral:didReceiveReadRequest: 方法出列并且响应此请求将无效(传输队列已满)。
- 所以在这种情况下,respondToRequest: 被忽略,就像我根本没有调用它一样。
- 在我响应请求之前,CoreBluetooth 将无法发送/接收任何数据。这就是冻结任何发送/接收进度并伴随断开连接的原因。
- 正如我之前提到的 - 我必须以适当的方法响应请求 - 否则它也将无效。(我这么说是因为如果队列已满,我试图将这些请求放入数组中,并在它有一些空间但没有运气时响应它们)。
我正在等待您的建议/建议如何解决这个问题,任何帮助将不胜感激。