2016-01-20 76 views
0

能够通过蓝牙连接到多个iOS设备,作为1个主设备和4个从设备工作。从中央同时向多个外设传输数据BLE

数据传输通过下面的代码

[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]; 
} 

数据传输的一个数据到多个外围传递由一个好像一旦第一个外设接收到数据后第二个外设得到数据进行延时。

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

回答

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:数据交付后。