如何将struct发送到BLE writevalue中?

时间:2018-10-29 21:05:03

标签: ios swift

我尝试用快速的CoreBluetooth库将结构参数发送到远程设备,但是我将其复制到数组中复制结构参数。其实在Windows应用程序中用c#做了同样的事情,但是快速的语法和代码风格却大不相同,我做不到。

您可以在下面找到我的代码

struct Test_Struct {
    var value1 : UInt32
    var value2 : UInt32
    var value3 : UInt8

}

    var data : [Test_Struct]=[]

    data.append(Test_Struct(value1: 1000, value2: 2000, value3: 02))

我也尝试了以下类似的方法

    var data = Test_Struct.init(value1: <UInt32>, value2: <UInt32>, value3: <UInt8>)

    data.value1 = 1000
    data.value2 = 1000
    data.value3 = 1000

两个代码都没有给我任何错误,但是当我尝试将“ my var”添加到 pheral.writeValue(数据,用于:myChractaristic,类型:CBCharacteristicWriteType.withoutResponse) 我得到一个错误。我还尝试将“ var data”添加到Data或NSData中,但从未为我工作。

对于摘要,我需要复制以构造一些数组,例如Byte [] array = data_struct,然后使用BLE写值命令发送数组值。

谢谢。

1 个答案:

答案 0 :(得分:0)

您需要将结构转换为数据。您有几个选择:使结构可编码,并使用JSONEncoder()编码数据,甚至更好地创建自己的编码方法,以确保以所需的最小字节数发送数据:

struct TestStruct {
    let value1: UInt32
    let value2: UInt32
    let value3: UInt8
}

要将数字属性转换为数据,请检查this

extension Numeric {
    var data: Data {
        var source = self
        return Data(bytes: &source, count: MemoryLayout<Self>.size)
    }
}
extension TestStruct {
    var data: Data {
        return value1.data + value2.data + value3.data
    }
}

要从数据初始化结构,可以检查此answer以供参考:

extension TestStruct {
    init(data: Data) {
        value1 = data[0...3].withUnsafeBytes { $0.pointee }
        value2 = data[4...7].withUnsafeBytes { $0.pointee }
        value3 = data[8...8].withUnsafeBytes { $0.pointee }
    }
}

let test = TestStruct(value1: 10, value2: 20, value3: 30)

let data = test.data
print(data)            // "9 bytes\n"
print(data as NSData)  // "<0a000000 14000000 1e>\n"

let objectFromData = TestStruct(data: data)

print(objectFromData.value1) // 10
print(objectFromData.value2) // 20
print(objectFromData.value3) // 30