在Swift中发送带有BLE的PNG图像

在Swift中发送带有BLE的PNG图像,swift,bluetooth-lowenergy,core-bluetooth,cbperipheral,uiimagepngrepresentation,Swift,Bluetooth Lowenergy,Core Bluetooth,Cbperipheral,Uiimagepngrepresentation,在过去的两个小时里,我一直被这个问题困扰着,我打算放弃。我在谷歌上搜索了很多,就是找不到有用的东西。我正在使用最新版本的XCode 我想通过蓝牙低能量发送PNG图像,本例中的接收器为。我尝试过的方法包括将图像转换为Base64字符串,将图像转换为UInt8数组,并逐个发送数组中的每个条目 我所做的一切都不起作用,因此我唯一的“工作”代码是用于将图像转换为字节的,如下所示: let testImage = UIImage(named: "smallImage") let imageData = U

在过去的两个小时里,我一直被这个问题困扰着,我打算放弃。我在谷歌上搜索了很多,就是找不到有用的东西。我正在使用最新版本的XCode

我想通过蓝牙低能量发送PNG图像,本例中的接收器为。我尝试过的方法包括将图像转换为Base64字符串,将图像转换为UInt8数组,并逐个发送数组中的每个条目

我所做的一切都不起作用,因此我唯一的“工作”代码是用于将图像转换为字节的,如下所示:

let testImage = UIImage(named: "smallImage")
let imageData = UIImagePNGRepresentation(testImage!)
我已经有了BLE的所有连接代码,并且能够成功地向Bleno发送一个简单的短字符串。通过“peripheral.maximumWriteValueLength”,我还知道我一次可以发送的最大字节数是512字节,尽管我可以想象使用低能量会降低这个最大值。我正在尝试使用peripal.writeValue发送数据,目前看起来是这样的(数组是我尝试的UInt8数组):

我最常遇到的错误是
error Domain=CBATTErrorDomain code=13“该值的长度无效。”
,我认为这是因为我尝试发送的数据超过512字节。我尝试用小于512字节的包发送数据,但正如我所说,我就是无法让它工作

简而言之,我的问题是:如何通过BLE发送PNG图像(多个部分)

编辑:我有一些工作要做,尽管速度很慢,因为它没有充分利用每个数据包的20个字节:

let buffer: [UInt8] = Array(UIImagePNGRepresentation(testImage!)!)

            let start = "I:"+String(buffer.count)
            peripheral.writeValue(start.data(using: .utf8)!, for: char, type: CBCharacteristicWriteType.withResponse)

            buffer.forEach{b in
                let data = NSData(bytes: [UInt8(b)], length: MemoryLayout<UInt8>.size)
                peripheral.writeValue(data as Data, for: char, type: CBCharacteristicWriteType.withResponse)
            }
let buffer:[UInt8]=数组(UIImagePNGRepresentation(testImage!))
let start=“I:”+字符串(buffer.count)
peripheral.writeValue(start.data(使用:.utf8)!,for:char,键入:CBCharacteristicWriteType.withResponse)
buffer.forEach{b in
let data=NSData(字节:[UInt8(b)],长度:MemoryLayout.size)
peripheral.writeValue(数据作为数据,for:char,type:CBCharacteristicWriteType.withResponse)
}

提前谢谢

你需要编辑你的问题,以显示你正在发送数据块的代码。BLE数据包长度为20字节。嗨…你终于解决了你的问题吗?我也在尝试在一个演示应用程序中实现相同的逻辑,你能分享你的应用程序的一些示例代码吗?谢谢,我确实设法修好了,但可能没那么漂亮。我已经有一段时间没有看过代码了,所以我不知道我能不能帮你。看起来我从PNG图像创建了一个缓冲区,然后在“createBufferToSend”中创建了一个20字节的缓冲区,然后我发送一个带有缓冲区长度的起始字节,然后我将其发送到for循环中。您需要编辑您的问题,以显示以块形式发送数据的代码。BLE数据包长度为20字节。您好……您最终解决了问题吗?我也在尝试在一个演示应用程序中实现相同的逻辑,你能分享你的应用程序的一些示例代码吗?谢谢,我确实设法修好了,但可能没那么漂亮。我已经有一段时间没有看过代码了,所以我不知道我能不能帮你。看起来我从PNG图像创建了一个缓冲区,然后在“createBufferToSend”中创建了一个20字节的缓冲区,然后我发送一个带有缓冲区长度的起始字节,然后在for循环中发送它。
let buffer: [UInt8] = Array(UIImagePNGRepresentation(testImage!)!)

            let start = "I:"+String(buffer.count)
            peripheral.writeValue(start.data(using: .utf8)!, for: char, type: CBCharacteristicWriteType.withResponse)

            buffer.forEach{b in
                let data = NSData(bytes: [UInt8(b)], length: MemoryLayout<UInt8>.size)
                peripheral.writeValue(data as Data, for: char, type: CBCharacteristicWriteType.withResponse)
            }