我尝试在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?
编辑: 问题解决了
答案 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];
希望这个帮助