CoreBluetooth читает NSData - PullRequest
       16

CoreBluetooth читает NSData

1 голос
/ 22 марта 2012

Я пытаюсь что-то прочитать и написать в 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; -

Но когда я получаю массив из периферийного устройства, я не знаю, как их читать

характеристика.value is 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 ]

1 голос
/ 25 октября 2014

Боюсь, что разархивированный объект NSData с периферийного устройства является неполным.CoreBluetooth ограничивает максимальный размер характеристики, который может обновляться каждый раз, что устанавливается центральным устройством.Превышенная часть будет обрезана при передаче.Вероятно, размер вашего массива превышает ограничение размера, поэтому центральное устройство не получило конкурирующее, что приводит к исключению.

Ограничение максимальной длины варьируется от устройства к устройству, ограничение размера можно получить изсвойство maximumUpdateValueLength объекта CBCentral, предоставляемое методами CBPeipheralManagerDelegate:

- (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 Центральная периферийная передача

0 голосов
/ 04 июня 2012

Вероятно, уже ответил бы на ваш вопрос.

На всякий случай: вы можете прочитать содержимое 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];

Надеюсь, эта помощь

...