NSString返回null

时间:2017-07-24 10:18:48

标签: ios swift core-bluetooth

我在Swift中使用CoreBluetooth库,我想读一下我在特性中从外设接收的内容。当我将特征值转换为NSString时,它总是返回nil。你知道为什么吗 ?我认为是因为编码,因为我有一个可以读写的特性,当我写一些内容时,我可以阅读我写的内容。当我写出特征的值是36时,如果我写6并且此代码有效。如果我只想阅读一个特性代码不起作用。

这就是我的特色所包含的

<CBCharacteristic: 0x1700a2a60, UUID = FFF2, properties = 0x2, value = <02>, notifying = NO>

这是代码

    func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {

        if error != nil {
            print("Error on updating value on characteristic: \(characteristic) - \(String(describing: error?.localizedDescription))")
            return
        }


        print(characteristic.value!)
        print(NSString(data: characteristic.value!, encoding: String.Encoding.utf8.rawValue)!).   //HERE IS NULL

        guard let stringFromData = NSString(data: characteristic.value!, encoding: String.Encoding.utf8.rawValue) else
        {
            print("Invalid data")
            return
        }

     //ALSO HERE stringFromData IS NULL

}

2 个答案:

答案 0 :(得分:3)

value的{​​{1}}属性可能包含以CBCharacteristic定义的数千种格式编码的二进制数据。例如,它可以是大小为8位,16位,32位或64位的有符号/无符号整数之一。或者7字节的日期和时间,或者以UTF-16(LE)字符串为前缀的长度,或......并且可以包含它们的组合。

(一个复杂的例子,解码权重测量(UUID = 2A9D)here。)

它可能不是一个简单的字符串,因此uuid(或NSString.init(data:encoding:)可能无效。

您需要为每个String.init(data:encoding:)获取value的字符串表示形式。 你可能需要写这样的东西:

uuid

答案 1 :(得分:2)

您应该按字节读取它:

var out: UInt16 = 0
let formattedData = NSMutableData(length: yourBufferCapacity)!

(characteristic.value as NSData).getBytes(&out, range: NSRange(location: 0,length: MemoryLayout<UInt16>.size))
out = out.bigEndian //optional, check if you really need it
formattedData.replaceBytes(in: NSRange(location: 0,length: 2), withBytes: &out)

然后您可以将formattedData转换为String