【发布时间】:2021-01-05 20:28:16
【问题描述】:
我正在通过 CoreBluetooth 向 BLE 设备发送一个大型二进制文件,以更新设备上的固件。但是,我遇到了一个问题,即 CoreBluetooth 没有对写入进行速率限制,并且发送消息太快以至于设备无法接收所有消息。确保 CoreBluetooth 等待足够长的时间以确保所有消息都已发送(不冻结 UI 队列)的最佳方法是什么?
我当前的代码是:
private func sendOTAUpgrade(data: [UInt8], complete: @escaping () -> Void) {
let packets = makePackets(size: 20, arr: data)
var count = 0
for packet in packets {
firmwareUpgradePercentComplete = Double(count)/Double(packets.count)
print("Sent packet - \(firmwareUpgradePercentComplete*100)% complete")
let data = NSData(bytes: packet, length: 20)
self.connectedPeripheral?.writeValue(data as Data, for: self.otcDataCharacteristic!, type: CBCharacteristicWriteType.withoutResponse)
count += 1
}
complete()
}
【问题讨论】:
-
这个问题的答案是“写响应”,让固件在准备好接收更多数据时提供响应。如果你不能做到这一点,那么你将不得不限制自己。这意味着一定数量的
asyncAfter调用,或者sleep调用,如果你在自己的线程上,或者你想通过任何你喜欢的机制进行任何类型的暂停。但是,如果您的问题是如何使用 BLE 来处理这个问题,那么答案是“使用响应;这就是它们的用途。” (或者,如果您控制固件,则对 BLE 实施流量控制。) -
更好的是,如果您的设备支持它,请使用 L2Cap 通道。
标签: swift bluetooth-lowenergy core-bluetooth