我正在研究一种通过蓝牙发送数据到自定义应用程序的产品。
当我得到通信链接工作时,我似乎找不到将原始数据转换为结构体的解决方案。
我通过蓝牙从ESP32发送数据,它发送一个结构体,看起来像:
struct dataStruct {
float value = 0.45;
int temp = 23;
byte filler[250];
} dataRCV;
,将其放入BLE特性中并通知"客户端";(电话连接到它)。
(填充符是未来值的占位符)
数据与characteristic.value!
检索,并给我一个256字节的数组,我想转换回一个快速结构体,看起来像:
struct dataStruct {
var value: Float
var temp: UInt16
var filler: [UInt8]
}
我发现了一些将结构体转换为原始字节的代码片段,以及一些晦涩的代码片段,将整数的原始字节数组转换回仅由UInt8组成的结构体,但不用于混合类型的数据…
有办法吗?或者有其他的方法吗?
编辑:
256字节数组;直接来自ESP32用pCharacteristic->setValue((byte*)&dataRCV, sizeof(dataRCV));
发送的数据,并且sizeof(dataRCV)
等于256(因为我这样定义结构体)。
在我的swift代码中,当我输入print(characteristic.value!)
时,它只在控制台中打印256 bytes
;而这个数据就是我想要转换回结构体的。
在C/c++中,可以像这里解释的那样使用memcpy,但是我找不到任何关于如何在Swift中完成它的信息,所以我还没有真正尝试过任何让我更接近我想要做的事情。
我成功了!
swift代码中的结构体定义为:
struct dataStruct {
var value = Float(0.0)
var temp = UInt16(0)
var filler = [UInt8](repeating: 0, count: 248)
}
,我创建了一个函数,该函数将接收到的Data
从特征转换为合适的结构体并返回它:(基于这里找到的代码)
func dataToStruct(data: Data) -> dataStruct {
let _data = data
let converted:dataStruct = _data.withUnsafeBytes { $0.load(as: dataStruct.self) }
return converted
}
}
我现在可以调用这个函数来将我收到的原始数据转换成可用的东西!:
var receivedParsed = dataToStruct(data: characteristic.value!)
print(receivedParsed.value)