如何使用 for 循环通过 BLE 发送数据

How to send Data via BLE using a for loop

我是 BLE 的新手,我正在制作一个需要 Data 对象通过 BLE 快速连续传输的应用程序。到目前为止,我已经尝试了 for 循环来根据索引更改特征。它成功地更改了第一个值的特征,但在其余值上失败了。我目前正在开发一个 POC,它的代码如下所示。

guard let characteristic = self.transferCharacteristic else { return }

for x in "Hello there" {
    let data = Data("\(x)".data(using: .utf8)!)
    let didSend = self.peripheralManager.updateValue(data, for: characteristic, onSubscribedCentrals: nil)
    if didSend {
        print("Sent: \(x)")
    } else {
        print("Couldn't send: \(x)")
    }
}

这个的输出是,

Sent: H
Couldn't send: e
Couldn't send: l
Couldn't send: l
.
.
.
Couldn't send: e
Couldn't send: r
Couldn't send: e

我怎样才能实现我想要的? 有没有更好的方法?

我知道交易需要几毫秒,但不知道如何将特征变化与交易速度同步,如果可能的话。

提前致谢。

如果此调用收到 false,则需要存储其余数据包并等待调用 peripheralManagerIsReady(toUpdateSubscribers:)。然后您可以对其他更改进行排队,直到 return 再次为 false。你不能在不处理背压的情况下循环执行此操作。

根据您的用例,您可能会发现在管理器准备好之前丢弃中间数据包会更好,或者您可以将它们排队,或者如果丢弃的数据太多,您可能会 return 出错,或许多其他策略。哪种背压策略有意义取决于您的问题。

请记住,您也有可能随时断开连接。 BLE 是一种可靠的传输方式,因此您永远不会收到数据包乱序、跳过或损坏的数据包,但这并不意味着数据包会被传送。

也就是说,这是发送大量数据的一种非常低效的方式。通常,您应该将数据包组合成块(最多 maximumUpdateValueLength)并以更少的写入次数发送它们。发送数据包有很多开销。成为可靠的交通工具需要付出巨大的代价。