iOS蓝牙LE - 没有响应的正确写入方式

时间:2015-10-30 18:15:21

标签: ios iphone bluetooth bluetooth-lowenergy core-bluetooth

使用iOS CoreBluetooth,在发送相对大量的数据时,将其分解为20个字节的块然后将它们一次写入外围对象是很重要的。使用WriteWithResponse特性时,这很容易做到:写20个字节,等待回调,写下20个字节,依此类推。

但是WriteWithoutResponse特性呢?我需要尽可能快地通过BLE发送1-2kB的数据。 WriteWithResponse在执行此操作时效率非常低,因为它会响应每个20字节的数据包。我的应用层负责纠错和可靠性,所以我不需要BLE来处理数据。

问题是WriteWithoutResponse没有给你一个回调,因为CoreBluetooth无法知道数据的实际写入时间。所以问题是:我们如何使用WriteWithoutResponse正确分隔发送大量数据?

我所考虑的唯一解决方案是执行以下操作:

  1. 获取连接间隔和链路每个连接间隔能够的数据包数。
  2. 立即写入每个20字节的X数据包,等待Y时间,然后重复,直到没有数据为止。 (X =每个连接间隔的数据包数,Y =连接间隔)
  3. 这种方法存在两个明显的问题:

    1. CoreBluetooth不向我们公开连接间隔(为什么??)。所以有两种选择。第一个是:猜测。可能是更坏的情况或平均情况,取决于您的首选连接参数,我认为iOS喜欢选择30ms。但这是个坏主意,因为中心有权完全忽略建议的参数。第二个是您可以拥有外围存储并将商定的CI传输到iOS设备。这样做的问题是,在iOS设备完成发现服务和特征并订阅适当的通知之前,您无法发送CI。因此,在发送CI之前,您必须在连接后输入一些任意的固定延迟,或者从iOS设备发送少量数据,通知外围设备它已准备就绪。两者都会产生延迟并且是非常差的解决方案。
    2. 我们不知道每个连接间隔可以支持多少个数据包。理论上最大值为6.但平均情况可能为4或更小。它还取决于外围设备。
    3. 当然,发送大量数据的一个很好的选择是将MTU大小增加到大于20个字节以容纳我们的大量数据。但似乎很少有外围设备支持这一点;我们没有。

      任何人都对如何解决这个问题有任何见解?

1 个答案:

答案 0 :(得分:1)

如果您支持iOS 11: iOS Website

@property(readonly) BOOL canSendWriteWithoutResponse;

此属性使您知道Buffer是否已满,并且可以传输更多而无响应。 每次传输后,请留意此变量并进行回调:Peripheral Delegate

peripheralIsReadyToSendWriteWithoutResponse:

什么时候足以让您知道何时发送更多数据。