我正在开始一个项目来创建一个iOS应用程序,通过BLE与设备进行通信。作为一项新的努力,我试图做到这一点,如果可能的话,Swift。该接口使用GATT和一组现有的自定义消息结构。我得到了NSData
对象中来自BLE的数据。我想以相当通用的方式将其转换或直接转换为我的消息结构。
我知道我可以直接从NSData
对象的字节数组或使用NSInputStream
手动提取数据。虽然这有效,但它可能是一个维护问题,并且界面中有许多不同的消息。
有更简单的方法吗?
我愿意在Objective-C中创建消息结构并在那里进行转换,但是我对Objective-C的了解并不比我对Swift的知识好多了。
我在游乐场玩的一些示例代码如下所示。这一切都按预期工作。
func getBytesFromNSData(data: NSData, start: Int) -> [UInt8] {
let count = data.length / sizeof(UInt8)
let remaining = count - start
let range = NSMakeRange(start, remaining )
var dataArray = [UInt8](count: remaining, repeatedValue: 0)
data.getBytes(&dataArray, range: range)
return dataArray
}
class TestObject {
var a: Byte
var b: Byte
init() {
a = 0x01
b = 0x02
}
init(data: NSData) {
let dataBytes = getBytesFromNSData(data, 0)
a = Byte(dataBytes[0])
b = Byte(dataBytes[1])
}
func populateFromStream(data: NSData) {
var stream = NSInputStream(data: data)
stream.open()
var bytesRead = stream.read(&a, maxLength: 1)
println("\(bytesRead)")
bytesRead = stream.read(&b, maxLength: 1)
println("\(bytesRead)")
}
func toArray() -> [Byte] {
var result = [Byte](count: 2, repeatedValue: 0)
result[0] = a
result[1] = b
return result
}
}
let test = TestObject()
let testArray = test.toArray()
let length = testArray.count
let testData = NSData(bytes: testArray, length: length)
println("\(testData)")
let testIn = [ Byte(0x0d), Byte(0x0e) ]
let testDataIn = NSData(bytes: testIn, length: testIn.count)
println("\(testDataIn)")
let testConstructor = TestObject(data: testDataIn)
var testObject = TestObject()
testObject.populateFromStream(testDataIn)
答案 0 :(得分:0)
我发现了一种相当通用的方法,可能在某些情况下起作用。
Foo
的结构和一个名为rawData
的NSData对象:使用以下代码获取强制转换指针。
let structureSize = sizeof(Foo)
var myObject = UnsafeMutablePointer<Foo>.alloc(1).memory
rawData.getbytes(&myObject, length: structureSize)
这不适用于所有情况,不幸的是在我的特定情况下也可以。我发现的具体问题是:
如果碰巧使用您的特定消息格式,这是我发现的最简洁的方法。