同时将数据传输到多个外围设备IOS BLE



能够通过蓝牙连接到多个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:与其实际离开之间的数据。如果要防止数据丢失,可以执行以下任一操作。

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

最新更新