我是快速发展的初学者。我正在研究基于BLE的应用程序。 今天我更新了Xcode 8,iOS 10并将我的代码转换为swift3。然后我的一些语法需要转换。解决这个问题后,我发现了一个关于CBC特性的问题。
问题
在didUpdateValueforCharacteristic中,我可以获得更新的CBC特性对象。 如果我打印出整个对象,它会正确显示。 - >值=< 3a02> 当我从CBCharacteristic中检索值时,characteristic.value - > 2字节(此值的大小)
func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?)
{
if (characteristic.uuid.description == LED_WAVELENGTH_CHARACTERISTIC_UUID)
{
print("Characteristic - \(characteristic)")
print("Data for characteristic Wavelength - \ (characteristic.value)")
}
}
日志结果:
Characteristic - <CBCharacteristic: 0x1742a50a0, UUID = 2C14, properties = 0xE, value = <3a02>, notifying = NO>
Data for characteristic Wavelength - Optional(2 bytes)
PS:此代码在以前的版本上完全正常。
感谢您的关注并希望有人可以帮我解决这个问题。
答案 0 :(得分:5)
您似乎一直依赖于description
NSData
返回<xxxx>
形式的字符串,以便检索您的数据值。正如您所发现的那样,这很脆弱,因为description
函数仅用于调试,可以在没有警告的情况下进行更改。
正确的方法是访问包含在Data
对象中的字节数组。这已经变得有点棘手了,因为Swift 2会让你将UInt8值复制到单个元素UInt16数组中。 Swift 3不允许你这样做,所以你需要自己做数学。
var wavelength: UInt16?
if let data = characteristic.value {
var bytes = Array(repeating: 0 as UInt8, count:someData.count/MemoryLayout<UInt8>.size)
data.copyBytes(to: &bytes, count:data.count)
let data16 = bytes.map { UInt16($0) }
wavelength = 256 * data16[1] + data16[0]
}
print(wavelength)
答案 1 :(得分:0)
现在,您可以使用String(bytes: characteristic.value!, encoding: String.Encoding.utf8)
来获取特征的字符串值。