swift3中的CB特征值
CBCharacteristic value in swift3
我是 swift 开发的初学者。我正在研究基于 BLE 的应用程序。
今天我更新了 Xcode 8,iOS 10 并将我的代码转换为 swift3。然后我的一些语法需要转换。修复此问题后,我在 CBCharacteristic 上发现了一个问题。
问题
在 didUpdateValueforCharacteristic 中,我可以获得更新的 CBCharacteristic 对象。
如果我打印出整个对象,它会正确显示。 -> 值 = <3a02>
当我从 CBCharacteristic 检索值时,characteristic.value -> 2bytes(此值的大小)
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)")
}
}
Log Result :
Characteristic - <CBCharacteristic: 0x1742a50a0, UUID = 2C14, properties = 0xE, value = <3a02>, notifying = NO>
Data for characteristic Wavelength - Optional(2 bytes)
PS : 此代码在以前的版本上完全可以正常工作。
感谢关注,希望有人能帮我解决这个问题。
您似乎一直依赖 NSData
的 description
返回 <xxxx>
形式的字符串来检索您的数据值。正如您所发现的,这是脆弱的,因为 description
函数仅用于调试,可以在没有警告的情况下更改。
正确的方法是访问包装在 Data
对象中的字节数组。这变得有点棘手,因为 Swift 2 会让您将 UInt8 值复制到单个元素 UInt16 数组中。 Swift3不会让你这样做,所以你需要自己算一下。
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([=10=]) }
wavelength = 256 * data16[1] + data16[0]
}
print(wavelength)
现在,您可以使用String(bytes: characteristic.value!, encoding: String.Encoding.utf8)
,获取特征的字符串值。
我是 swift 开发的初学者。我正在研究基于 BLE 的应用程序。 今天我更新了 Xcode 8,iOS 10 并将我的代码转换为 swift3。然后我的一些语法需要转换。修复此问题后,我在 CBCharacteristic 上发现了一个问题。
问题
在 didUpdateValueforCharacteristic 中,我可以获得更新的 CBCharacteristic 对象。 如果我打印出整个对象,它会正确显示。 -> 值 = <3a02> 当我从 CBCharacteristic 检索值时,characteristic.value -> 2bytes(此值的大小)
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)")
}
}
Log Result :
Characteristic - <CBCharacteristic: 0x1742a50a0, UUID = 2C14, properties = 0xE, value = <3a02>, notifying = NO>
Data for characteristic Wavelength - Optional(2 bytes)
PS : 此代码在以前的版本上完全可以正常工作。
感谢关注,希望有人能帮我解决这个问题。
您似乎一直依赖 NSData
的 description
返回 <xxxx>
形式的字符串来检索您的数据值。正如您所发现的,这是脆弱的,因为 description
函数仅用于调试,可以在没有警告的情况下更改。
正确的方法是访问包装在 Data
对象中的字节数组。这变得有点棘手,因为 Swift 2 会让您将 UInt8 值复制到单个元素 UInt16 数组中。 Swift3不会让你这样做,所以你需要自己算一下。
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([=10=]) }
wavelength = 256 * data16[1] + data16[0]
}
print(wavelength)
现在,您可以使用String(bytes: characteristic.value!, encoding: String.Encoding.utf8)
,获取特征的字符串值。