使用 CoreBluetooth CBL2CAPChannel 移动数据

2024-03-30

我已经设置了一些数据传输功能,使用CoreBluetooth CBL2CAPChannel, in a Swift iOS应用程序。这是发送数据的函数:

func sendData(_ outStream: OutputStream) -> Bool {
    let data = tranferBlock! // tranferBlock holds some .utf8 data.
    let bytesWritten = data.withUnsafeBytes {outStream.write($0, maxLength: data.count)}

    if bytesWritten > 0 {
        tranferBlock = nil
        return true
    }

    return false
}

这是接收数据的函数:

func receiveData(_ inStream: InputStream) {
    let bufLength = 1024
    let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: bufLength)
    let bytesRead = inStream.read(buffer, maxLength: bufLength)

    if let string = String(bytesNoCopy: buffer,
                           length: bytesRead,
                           encoding: .utf8,
                           freeWhenDone: false) {
        print("READ-L2CAPData:\(bytesRead):\(string)")
        if bytesRead != 0 {
            receiveBuffer = string // receiveBuffer holds the received data.
            let ntfc = NotificationCenter.default
            ntfc.post(name:Notification.Name(rawValue: "DATACAMEIN"),
                      object: nil, userInfo: nil)
        }
    }
}

我可以说,它正在工作,因为这允许我传输数据。但有一个问题:我接收数据的方式与发送数据的方式不同。例如,假设我以 3 个数据包发送数据,如下所示:

.......
tranferBlock = Data("aaaAAAaaa".utf8)
sendData(outStream)
tranferBlock = Data("bbbBBBbbb".utf8)
sendData(outStream)
tranferBlock = Data("cccCCCccc".utf8)
sendData(outStream)
.......

在这种情况下,我希望以 3 个数据包的形式接收数据,其速度与我发送数据包的速度大致相同:

aaaAAAaaa
bbbBBBbbb
cccCCCccc

但我收到了一个数据包:

aaaAAAaaabbbBBBbbbcccCCCccc

很多时候,由于某种我不知道的原因,只有当我杀死发送应用程序时。

我想知道我需要进行哪些更改才能以我期望的方式接收数据。


基于流的协议不支持您所追求的框架。您不能依赖底层协议层中合并为一个逻辑数据包的字节数。如果需要框架,请在应用层定义一个框架。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 CoreBluetooth CBL2CAPChannel 移动数据 的相关文章

随机推荐