【问题标题】:Transfer Data to multiple peripheral simultaneously ios BLE将数据同时传输到多个外围设备 ios BLE
【发布时间】:2016-04-26 06:35:26
【问题描述】:

能够通过蓝牙连接多个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 bluetooth core-bluetooth cbcentralmanager cbperipheral


    【解决方案1】:

    当您传输带有响应的数据时,您必须在每次发送数据包时等待其收到确认。当您传输数据而没有响应时,确认不会被发回,因此吞吐量会更高。但是,正如您正确指出的那样,在没有响应的情况下传输数据时可能会丢失数据。发生这种数据丢失的原因是内部 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 会为你拆分它,但在这种情况下你不会收到回调 `
      • peripheral:didWriteValueForCharacteristic:error:` 数据下发后。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-30
      • 2017-04-23
      • 2016-09-26
      • 2019-04-30
      • 1970-01-01
      相关资源
      最近更新 更多