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/

相关文章:

ios - 蓝牙 LE 请求许可?

iOS 到 Mac OS X [核心] 蓝牙数据传输

ios - 从后台应用程序拍摄前置摄像头照片

ios - 数组打印 API 调用的相同结果

ios - Xcode : Event not created in Calendar : issue With Timezone?

ios - 如何截取uiview特定区域的屏幕截图

xcode - 为什么当我修改项目中的任何 swift 文件时,所有 objective-c 源文件都会重新编译?

swift - 将前导零添加到将与文本一起打印在字符串中的数字

swift - 我应该如何在同一操作中设置按钮的图像?

ios - 当服务不是 nil 在 iPhone 中运行时,BLE 特征为 nil