2012-03-22 31 views
1

我尝试阅读和CoreBluetoothCoreBluetooth阅读的NSData

所以我的设备(外设)写的东西给我一个阵列 的lenght和阵列为一体。

我用这种方法

(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?

编辑: 问题解决

回答

-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]; 

希望这有助于

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

或提供CBCe的任何其他方法中心对象。

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