我正在尝试通过蓝牙4.0 LE将.png图像文件从一个iOS设备发送到另一个.
我能够简单的数据,如字符串,但无法成功发送和利用图像文件.
在Peripheral设备中,我从此开始
pictureBeforeData = [UIImage imageNamed:@"myImage.png"]; NSData *myData = UIImagePNGRepresentation(pictureBeforeData);
然后我将myData作为一个特征的价值.
_myCharacteristic = [[CBMutableCharacteristic alloc] initWithType:_myCharacteristicUUID properties:CBCharacteristicPropertyRead value:myData permissions:CBAttributePermissionsReadable];
在中央设备中,当特征的值更新时,我有这个
- (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 }
编辑8-27-13:我能够发送一个单一的彩色1比1像素.png文件成功的文件大约5,600字节.我无法发送只有大约2,000字节的多色20by20像素.png文件.我可以发送包含只有一种颜色和较少像素的较大文件,但无法发送包含多种颜色和更多像素的较小文件.
编辑8-30-13:我绝对必须将数据解析成较小的块.在苹果的示例项目之一中,我发现了一种方法.我似乎无法明白如何在我自己的代码中实现这一点,但是我正在试图找出如何.以下是代码:
- (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; } }}
我的imageView是黑色的方块,它应该显示我发送的图像.
解决方法
在iOS 6中,BLE允许您发送大约20字节的数据块.有关如何分割要发送的数据以及如何使用基于通知的传输的示例,请下载
BTLE Transfer Apple Example application.
为了更好地了解您可以实现哪些速度,我建议您分析这个图表http://www.scriptreactor.com/conn_interval-throughput.pdf它显示可实现的速度作为连接间隔的函数. iOS不会给你这样一个细粒度的控制,但是这个信息对你来说仍然是有价值的.