同时将数据传输到多个外设ios BLE

时间:2016-01-20 12:06:30

标签: ios bluetooth core-bluetooth cbcentralmanager cbperipheral

能够通过蓝牙连接到多个iOS设备,作为1个主设备和4个从设备。

通过以下代码从中央到外围设备的数据传输

[peripheral.peripheral writeValue:currentData forCharacteristic:peripheral.characteristic type:CBCharacteristicWriteWithoutResponse];

但这会让数据丢失,但速度更快。

然后使用以下代码尝试不丢失数据

[peripheral.peripheral writeValue:currentData forCharacteristic:peripheral.characteristic type:CBCharacteristicWriteWithResponse];

尝试同时(同时)将数据传输到多个外围设备

    for (Peripheral * peripheral in self.connectedPeripherals) {
 [peripheral.peripheral writeValue:currentData forCharacteristic:peripheral.characteristic type:CBCharacteristicWriteWithResponse];
}

数据一个接一个地传输,一旦第一个外设收到数据就会出现延迟,然后第二个外设获取数据并继续。

想要同时传输数据并同时反映到所有外围设备。

1 个答案:

答案 0 :(得分:0)

当您使用响应传输数据时,每次发送数据包时都必须等待确认收据。在没有响应的情况下传输数据时,不会发回确认,因此吞吐量更高。但是,正如您正确指出的那样,在没有响应的情况下传输数据时,可能会丢失数据。发生此数据丢失的原因是内部iOS缓冲区溢出,该缓冲区在您对- writeValue:forCharacteristic:type:的调用与其实际离开之间保存数据。如果要防止数据丢失,可以执行以下任一操作。

  1. 不要向缓冲区写入太多数据,因为如果缓冲区溢出,它会被静默丢弃。我的实验表明,在正常条件下,此缓冲区的大小约为3kb(iPhone 6,iOS9,1外设)。对于其他设备,这种尺寸的多个连接外围设备和/或双向传输可以更小。所以,如果你有例如要发送到4个外围设备的1 kb数据,并且通过反复调用- writeValue:forCharacteristic:type:来执行此操作,您肯定会面临数据丢失。
  2. 实现协议,以便在数据丢失的情况下重新发送丢失的数据包,而无需响应即可用于写入的特性。
  3. 使用响应进行写入,但将数据拆分为尽可能大的块。正如我之前所说,确认是在每个数据包之后发回的,但这些数据包可以有不同的大小。使用iOS8 / iOS9,您可以在单个数据包中发送最多155个字节的有效负载。所以如果你需要发送,例如300字节,最好将它们分成2个150字节的块而不是15个20字节的块。顺便说一下,当你想用响应写入并提交一个超过155字节的值时,iOS会为你分割它,但是在这种情况下你不会收到回调。
    • peripheral:didWriteValueForCharacteristic:error:`数据传递后。