CoreBluetooth读取NSData

时间:2012-03-22 08:06:52

标签: nsarray nsdata converter

我尝试在CoreBluetooth中读取和写入内容

所以我的设备(外围设备)发送给我一个数组的长度 和数组一样。

我用这个方法读取了值

(void)readValueForCharacteristic:(CBCharacteristic *)characteristic; 

当我从外围设备那里得到答案时

(void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error;

正在打电话 当我读取一个值时,这不是问题

char arrayLength;

charakteristik.value getBytes:&arrayLength lenght:SERVICE_ARRAYLENGTH_LEN]

self.MyArrayLenght=(float)arrayLength; -

但是当我从外围设备获得阵列时,我不知道如何阅读它们

charakteristik.value是NSData

当我试图

NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithData:charakteristik.value]

我收到了错误

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '[NSKeyedUnarchiver initForReadingWithData:]: incomprehensible archive (0x4e, 0x49, 0x42, 0x41, 0x72, 0x63, 0x68, 0x69)'

十六进制(0x4e,0x49,0x42,0x41,0x72,0x63,0x68,0x69 .......)是我想读的数据,后来显示

我如何阅读NSData?或者我如何将NSData转换为NSArray?

编辑: 问题解决了

2 个答案:

答案 0 :(得分:1)

我担心来自外围设备的未归档NSData对象是不完整的。 CoreBluetooth限制每次更新的特征的最大大小,这是由中央设备设置的。转移时,超出部分将被截断。可能您的阵列大小超出了大小限制,因此中央设备没有收到竞争对手,这导致异常。

最大长度限制因设备而异,您可以从CBPeipheralManagerDelegate方法给出的CBCentral对象的 maximumUpdateValueLength 属性中获取大小限制:

- (void)peripheralManager:(CBPeripheralManager *)peripheral central:(CBCentral *)central didSubscribeToCharacteristic:(CBCharacteristic *)characteristic

- (void)peripheralManager:(CBPeripheralManager *)peripheral didReceiveReadRequest:(CBATTRequest *)request

- (void)peripheralManager:(CBPeripheralManager *)peripheral didReceiveWriteRequests:(NSArray *)requests

或提供CBCentral对象的任何其他方法。

如果要发送超大数据,则应将数据分段并将其发送几次。在中央设备上,您可以通过将各个部分组合在一起来重建原始数据对象。 Apple提供了一个示例代码来说明如何发送超大数据。 BTLE Central Peripheral Transfer

答案 1 :(得分:-1)

现在可能已经回答了你的问题。

以防万一:您可以使用以下方法读取NSData内容:

char *data = [NSData data];

使用

检索数据的长度
[NSData length];

要检查它是否包含您的数据,您可以执行以下操作:

strncmp(blah, [NSDataObject data], [NSDataObject length]);

话虽如此,您可以定义要发现的服务,并且只能定义该服务。然后,您可以进一步限制只听取您感兴趣的特定特征

- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error

呼叫

[peripheral discoverCharacteristics:[NSArray arrayWithObject:[CBUUID UUIDWithString:@"ABCD"]] forService:service];

希望这个帮助