ios - Corebluetooth 在不终止蓝牙连接的情况下终止大数据传输

标签 ios swift core-bluetooth

我正在开发一个需要在 iPhone 和设备之间发送大量数据的应用程序(发送数据大约需要 10 秒)。但我希望能够随时取消数据通信。我知道我可以随时断开与设备的连接

centralManager.cancelPeripheral(peripheral)

但这不是我真正想要的,因为我想停止发送数据但不终止蓝牙连接。

有没有办法在不断开与设备的连接的情况下终止数据传输?

发送数据的代码如下:

for (var Hex: UInt8 = 0x01; Hex <= 0x14; Hex+=1){
            var outbuffer = [UInt8](count: 16, repeatedValue: 0x00)
            outbuffer[0] = (0x68)
            outbuffer[1] = (Hex)
            let data = NSData(bytes: outbuffer, length: 7)
            print("data\(data)")
            connectingPeripheral.writeValue(data, forCharacteristic: connectingCharacteristicPassword , type: CBCharacteristicWriteType.WithResponse)

最佳答案

我想我会继续并就此发表我的意见。 CoreBluetooth 无法停止传输已写入输出缓冲区的数据包。出现这种情况的原因很简单,因为不需要它,而且它是一个无用的功能。你遇到这个问题的唯一原因是我认为你的方法是错误的。不要将所有内容都放在 for 循环中并一次推送所有数据。相反,您应该实现某种流量控制机制。

在 Bluetooth LE 中,将数据写入外设的主要方式有两种:“写入命令”和“写入请求”。你可以把它看成有点像 TCP 和 UDP 协议(protocol)。使用写命令,您只是在发送数据,而不知道蓝牙链接另一端的应用程序是否接收到数据。通过写入请求,您正在发送数据并让外设知道您希望收到通知(确认)数据实际上已收到。这两种类型在 CoreBluetooth 中称为 CBCharacteristicWriteWithResponseCBCharacteristicWriteWithoutResponse。当使用 CBCharacteristicWriteWithResponse 写入数据时(就像您在代码中所做的那样),您将获得一个 peripheral:didWriteValueForCharacteristic:error: 回调,用于验证数据是否已到达另一个边。此时,如果您愿意,您现在可以选择继续发送下一个数据包,但如果您出于某种原因想要停止发送数据,那么您也可以这样做。通过这种方式,您可以控制整个流程,而不仅仅是通过 for 循环插入一切。

但是等等,那你为什么要使用写命令?好吧,因为写请求需要接收方响应发送方,这意味着数据必须双向发送。这种情况下,由于ack是应用层发送的,所以要等到下一个连接间隔,ack才能发送。这意味着当发送大量数据时,您只能每两个连接间隔发送一个数据包,这将使您的整体比特率非常低。

使用写命令,因为它们没有被确认,你可以在一个连接事件窗口内发送尽可能多的数据包。在大多数情况下,每个连接窗口应该能够发送大约 10-20 个数据包。但是请注意,如果您发送太多数据包,那么您将填满传出缓冲区并且数据包将会丢失。因此,您可以尝试直接发送 9 个 WriteWithoutResponse 类型的数据包,然后发送 1 个 WriteWithResponse 类型的数据包。完成此操作后,您可以等待 peripheral:didWriteValueForCharacteristic:error: 回调,然后您可以在其中以相同的方式再发送 10 个数据包。这样,您将设法每 2 个连接间隔发送 10 个数据包,同时仍然能够更好地控制流量。

您当然可以尝试一下该比率,但请记住,缓冲区是在 iOS 设备上的多个应用程序之间共享的,因此您不希望太接近限制。

关于ios - Corebluetooth 在不终止蓝牙连接的情况下终止大数据传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38616819/

相关文章:

swift - 带有原生 Swift 应用程序的 Apple Watch 和 Fitbit watch

ios - 获取自己的蓝牙唯一标识

ios - 在标签IOS之间跳转时ViewController变为空白

ios - 在 Realm 之间复制对象时需要迁移

ios - 如何以编程方式将 SubView 添加到水平 StackView 以创建条纹?

ios - 如何在 Swift 3 中制作嵌套的 JSON

ios - 切换到横向时,Tableview 将约束更改为全屏

ios - CoreBluetooth和iBeacon : any conflicts?

ios - 在 Swift 中从中心动画一个圆

ios - xcode UICollectionView 打开另一个 View Controller