我想通过CoreBluetooth特征发送一个字节数组[UInt8]
。我已经能够通过执行以下操作发送字符串:
let data: String = "1"
let valueString = (data as NSString).data(using: String.Encoding.utf8.rawValue)
connectedPeripheral.writeValue(valueString!, for: fileBlockCharacteristic, type: CBCharacteristicWriteType.withResponse)
但不知道如何为[UInt8]
执行此操作。以下是我迄今为止基于this post尝试的操作,但回调不会在接收设备上打印:
let array: [UInt8] = Array(fileData!.dropFirst(startIndex).prefix(byteCount))
connectedPeripheral.writeValue(Data(array), for: fileBlockCharacteristic, type: CBCharacteristicWriteType.withResponse)
和
let array: [UInt8] = Array(fileData!.dropFirst(startIndex).prefix(byteCount))
let data = NSData(bytes: array, length: array.count)
connectedPeripheral.writeValue(Data(data), for: fileBlockCharacteristic, type: CBCharacteristicWriteType.withResponse)
和
let array: [UInt8] = Array(fileData!.dropFirst(startIndex).prefix(byteCount))
let data = Data(bytesNoCopy: UnsafeMutableRawPointer(mutating: array), count: array.count, deallocator: .none)
print("data: \(data)")
我按照下面的评论,并尝试在this post的解决方案转换UInt 8数组到字节,但这似乎不是我的问题.我尝试了以上两种解决方案在任何情况下,但数据仍然没有得到传递到蓝牙设备,当字符串出错时,它不会出错(或者我不知道如何在CoreBluetooth中捕获错误)并且我确实要求withResponse
。我有withoutResponse
并且我得到错误消息(没有指定“无响应写入”属性-忽略无响应写入),所以我很确定调用本身是正确的...字符串版本也可以工作。
在设备上,我有一个回调函数,它适用于字符串,而不是Data(数组):
void onFileBlockWritten(BLECentral& central, BLECharacteristic& characteristic) {
Serial.println("writing file block...");
}
更新
还有一些事情正在发生。我发送了一个2个UInt 8值的固定数组,它工作了。byteCount
被设置为128,所以我尝试了一些值。在20时它工作了,在21时它没有。
我把对方能接受的值增加到150,又试了21,还是不行。
let array: [UInt8] = Array(fileData!.dropFirst(startIndex).prefix(20))
let data = NSData(bytes: array, length: array.count)
connectedPeripheral.writeValue(Data(data), for: fileBlockCharacteristic, type: CBCharacteristicWriteType.withResponse)
1条答案
按热度按时间qojgxg4l1#
首先,Characteristic中唯一可以写入的东西是“一个字节数组”。你可以称之为UInt 8的序列,或Data,或
[UInt8]
。这些都是Swift的概念,但在网络上,它总是只是一个字节数组。这正是你对String所做的。你将它转换为Data(一个字节数组),然后发送它。您的问题是MTU(最大传输单位)。此设备可能没有高级BLE功能,因此限制为20字节。这种大小在旧设备或低成本设备(甚至一些新设备和昂贵设备)中非常常见。BLE是为非常短的消息设计的。
您的设备可能确实支持所需的扩展,这些扩展允许更大的有效载荷(~250字节)。查找Data Length Extension。设备至少需要支持蓝牙4.2,但并非所有蓝牙4.2设备都支持DLE。特别是,iPhone 6s不支持。
您可以通过调用
maximumWriteValueLength(for:)
来获取特征的最大长度。您可能需要将数据分块到多个写入中。