Envío de file de image a través de Bluetooth 4.0 LE

Estoy intentando enviar un file de image .png de un dispositivo iOS a otro a través de Bluetooth 4.0 LE.

Soy capaz de datos simples como cadenas, pero no puedo enviar y utilizar con éxito los files de image.

En el dispositivo periférico, empiezo con esto

pictureBeforeData = [UIImage imageNamed:@"myImage.png"]; NSData *myData = UIImagePNGRepresentation(pictureBeforeData); 

Luego hago de myData el valor de una característica.

 _myCharacteristic = [[CBMutableCharacteristic alloc] initWithType:_myCharacteristicUUID properties:CBCharacteristicPropertyRead value:myData permissions:CBAttributePermissionsReadable]; 

En el dispositivo central, tengo esto cuando se actualiza el valor de la característica

 - (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error { if ([characteristic.UUID isEqual:[CBUUID UUIDWithString:_myCharacteristicUUID]]) { NSLog(@"PICTURE CHARACTERISTIC FOUND"); // This successfully gets logged NSData *dataFromCharacteristic = [[NSData alloc] initWithData:characteristic.value]; UIImage *imageFromData = [[UIImage alloc]initWithData:dataFromCharacteristic]; // This correctly logs the size of my image NSLog(@"SIZE: %f, %f", imageFromData.size.height, imageFromData.size.width); // This causes the imageView to turn completely black _sentPictureImageView.image = imageFromData; if (!([_myImagesArray containsObject:imageFromData])) { NSLog(@"DOES NOT CONTAIN"); // This is successfully logged [_myImagesArray addObject:imageFromData]; // This runs but is apparently not adding the image to the array } NSLog(@"COUNT: %u", _contactsImagesArray.count); // This always logs 0 - The array is empty } 

EDIT 8-27-13: Puedo enviar un file .png de 1by1 píxel de un solo color con éxito, ese file tiene unos 5.600 bytes de tamaño. No puedo enviar un file .png de 20by20 píxeles en varios colors que solo tiene unos 2.000 bytes. Puedo enviar el file más grande que contiene solo un color y less píxeles, pero no puedo enviar el file más pequeño que contiene muchos colors y más píxeles.

EDIT 8-30-13: Definitivamente tengo que analizar los datos en trozos más pequeños. En uno de los proyectos de ejemplo de Apple, encontré un método que hace exactamente eso. No puedo entender exactamente cómo implementar esto en mi propio código, pero actualmente estoy tratando de averiguar cómo. Aquí está el código:

 - (void)sendData { // First up, check if we're meant to be sending an EOM static BOOL sendingEOM = NO; if (sendingEOM) { // send it BOOL didSend = [self.peripheralManager updateValue:[@"EOM" dataUsingEncoding:NSUTF8StringEncoding] forCharacteristic:self.transferCharacteristic onSubscribedCentrals:nil]; // Did it send? if (didSend) { // It did, so mark it as sent sendingEOM = NO; NSLog(@"Sent: EOM"); } // It didn't send, so we'll exit and wait for peripheralManagerIsReadyToUpdateSubscribers to call sendData again return; } // We're not sending an EOM, so we're sending data // Is there any left to send? if (self.sendDataIndex >= self.dataToSend.length) { // No data left. Do nothing return; } // There's data left, so send until the callback fails, or we're done. BOOL didSend = YES; while (didSend) { // Make the next chunk // Work out how big it should be NSInteger amountToSend = self.dataToSend.length - self.sendDataIndex; // Can't be longer than 20 bytes if (amountToSend > NOTIFY_MTU) amountToSend = NOTIFY_MTU; // Copy out the data we want NSData *chunk = [NSData dataWithBytes:self.dataToSend.bytes+self.sendDataIndex length:amountToSend]; // Send it didSend = [self.peripheralManager updateValue:chunk forCharacteristic:self.transferCharacteristic onSubscribedCentrals:nil]; // If it didn't work, drop out and wait for the callback if (!didSend) { return; } NSString *stringFromData = [[NSString alloc] initWithData:chunk encoding:NSUTF8StringEncoding]; NSLog(@"Sent: %@", stringFromData); // It did send, so update our index self.sendDataIndex += amountToSend; // Was it the last one? if (self.sendDataIndex >= self.dataToSend.length) { // It was - send an EOM // Set this so if the send fails, we'll send it next time sendingEOM = YES; // Send it BOOL eomSent = [self.peripheralManager updateValue:[@"EOM" dataUsingEncoding:NSUTF8StringEncoding] forCharacteristic:self.transferCharacteristic onSubscribedCentrals:nil]; if (eomSent) { // It sent, we're all done sendingEOM = NO; NSLog(@"Sent: EOM"); } return; } }} 

My imageView es el cuadrado negro, que debería mostrar la image que he enviado. introduzca la descripción de la imagen aquí

En iOS 6, BLE le permite enviar alnetworkingedor de 20 bytes de bits de datos. Para ver un ejemplo de cómo puede dividir los datos que se enviarán y cómo utilizar las notifications basadas en la transmisión, descargue la aplicación BTLE Transfer Apple Example .

Para get una mejor comprensión de las velocidades que puede lograr, le sugiero que analice este diagtwig http://www.scriptreactor.com/conn_interval-throughput.pdf Muestra las velocidades alcanzables como una function del intervalo de connection. iOS no le otorga un control de grano tan fino, pero esta información sigue siendo valiosa para que la calcule.

BTLE está significativamente limitado en términos de la cantidad de datos que se pueden enviar tanto en las características como en cualquier package de datos. Debe hacer la connection entre los dispositivos y luego dividir los datos de la image y enviar múltiples packages pequeños. Los videos WWDC de 2013 le proporcionarán una buena descripción y muestras de código.