外设传输队列问题

2024-04-06

我正在开发一个围绕 CoreBluetooth 的简单包装器,用于将任何数据发送到任何设备。 在开发过程中,我在框架中遇到了很多错误,它们非常烦人,为了使我的包装器稳定,我必须缩短一些功能以提高可靠性。

现在我正在努力从外围设备发送数据。

好的,所以我有以下情况:

  • 客户要求动态特性值
  • 我在服务器端收到回调 - 外围设备:didReceiveReadRequest:。

Note:我需要在这个方法中响应这个 CBATTRequest - 我无法将其存储在其他地方并异步响应它。 (我只是放置一些块@“PrepareToReceiveValue”,这些块将在中央侧被忽略。所有发送都在队列中完成。)

  • 为了向各种设备提供数据,我构建了一个包含 BTMessage 的队列。 (因此,对于 readRequest,我创建消息并将其添加到发送队列中。如果块发送失败 - 我将从外围管理器收到有关readyToUpdateSubscribers 的回调,并要求队列重新发送失败的块)
  • 因此,当我立即请求大量动态特征值并同时从外围设备向中央设备发送数据时,有时它只会冻结发送进度并导致断开连接。

经过多次测试,我发现这都是关于传输队列的: 如果传输队列已满并且您将收到读取请求 - 它只是不会响应它。

所以我有潜在的不稳定系统状态:

  1. 外围设备正在向某个中央设备发送数据。
  2. 在我的发送方法 updateValue:forCharac... 中返回 NO,因为传输队列已满。
  3. 此时,中央请求特征和外围设备的动态值:didReceiveReadRequest:调用将被添加到当前运行循环中。
  4. 从发送方法返回后,它将使 Peripheral:didReceiveReadRequest: 方法出列,并且响应此请求将无效(传输队列已满)。
  5. 所以在这种情况下,respondToRequest: 被忽略,就像我根本没有调用它一样。
  6. 在我响应请求之前,CoreBluetooth 将无法发送/接收任何数据。这就是冻结任何发送/接收进度并伴随断开连接的原因。
  7. 正如我之前提到的 - 我必须以适当的方式响应请求 - 否则它也不会产生任何效果。 (我这么说是因为我试图在队列已满的情况下将这些请求放入数组中,并在队列有空间时响应它们,但没有运气)。

我正在等待您如何解决此问题的建议/建议,任何帮助将不胜感激。


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

外设传输队列问题 的相关文章

随机推荐