能够通过蓝牙连接到多个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];
}
一个接一个地传输数据,一旦收到第一个外设数据,然后第二个外设获取数据并继续,就会出现延迟。
希望同时传输数据并同时反射到所有外围设备。
当您使用响应传输数据时,每次发送数据包时都必须等待确认其接收。当您在没有响应的情况下传输数据时,不会发回确认,因此吞吐量更高。但是,正如您正确指出的那样,在没有响应的情况下传输数据时,可能会丢失数据。发生此数据丢失的原因是内部iOS缓冲区溢出,该缓冲区保存了调用- writeValue:forCharacteristic:type:
与其实际离开之间的数据。如果要防止数据丢失,可以执行以下任一操作。
- 不要向缓冲区写入太多数据,因为如果缓冲区溢出,它将被静默丢弃。我的实验表明,在正常情况下,这个缓冲区的大小约为3kb(iPhone 6,iOS9,1外围设备)。对于其他设备,多个连接的外围设备和/或双向传输此尺寸可以更小。因此,如果您有例如 1 kb 的数据要发送到您的 4 个外围设备,并且您通过迭代调用
- writeValue:forCharacteristic:type:
来完成,您肯定会面临数据丢失。 - 实施一个协议,以便在数据丢失的情况下请求重新发送丢失的数据包,而不是用于无响应的写入的特征。
- 使用响应写入,但将数据拆分为尽可能大的块。正如我之前所说,确认在每个数据包之后都会发回,但这些数据包的大小可能不同。使用 iOS8/iOS9,您可以在单个数据包中发送多达 155 字节的有效负载。因此,如果您需要发送例如 300 字节,最好将它们分成 2 个 150 字节的块,而不是 15 个 20 字节的块。顺便说一句,当您想使用 response 写入并提交超过 155 字节的值时,iOS 会为您拆分它,但在这种情况下您不会收到回调"
- 外围设备:didWriteValueForCharacteristic:error:' 在数据交付后。