通过蓝牙 4.0 LE 发送图像文件 [英] Sending image file over Bluetooth 4.0 LE

查看:15
本文介绍了通过蓝牙 4.0 LE 发送图像文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试通过蓝牙 4.0 LE 将 .png 图像文件从一个 iOS 设备发送到另一个.

I am trying to send an .png image file from one iOS Device to another over Bluetooth 4.0 LE.

我可以简单地处理字符串等数据,但无法成功发送和使用图像文件.

I am able to simple pieces of data like strings, but unable to successfully send and utilize image files.

在外围设备中,我从这个开始

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

然后我将 myData 设为一个特征值.

Then I make myData a characteristic's value.

_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: 我能够成功发送一个单色 1by1 像素 .png 文件,该文件大约 5,600 字节大.我无法发送只有大约 2,000 字节的多色 20by20pixel .png 文件.我可以发送仅包含一种颜色和更少像素的较大文件,但无法发送包含多种颜色和更多像素的较小文件.

EDIT 8-27-13: I am able to send over a single color 1by1 pixel .png file successfully that file is about 5,600 bytes large. I am unable to send a multi-color 20by20pixel .png file that is only about 2,000 bytes. I am able to send over the larger file that contains only one color and less pixels, but unable to send the smaller file that contains many colors and more pixels.

编辑 8-30-13: 我绝对必须将数据解析成更小的块.在 Apple 的一个示例项目中,我发现了一种方法可以做到这一点.我似乎无法完全理解如何在我自己的代码中实现这一点,但我目前正试图弄清楚如何实现.代码如下:

EDIT 8-30-13: I definitely have to parse the data into smaller chunks. In one of Apple's example projects, I found a method that does just that. I can't seem to understand exactly how to implement this in my own code, but I am currently attempting to figure out how. Here's the code:

- (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 是黑色方块,它应该显示我发送过来的图像.

My imageView is the black square, which should be displaying the image I have sent over.

推荐答案

在 iOS 6 上,BLE 允许您发送大约 20 字节的数据块.有关如何分割要发送的数据以及如何使用基于通知的传输的示例,请下载 BTLE Transfer Apple 示例应用程序.

On iOS 6, BLE allows you to send around 20 byte chunks of data. For an example of how you can slice up the data to be sent and how to use notifications based transmission, download the BTLE Transfer Apple Example application.

为了更好地了解您可以达到的速度,我建议您分析此图表 http://www.scriptreactor.com/conn_interval-throughput.pdf 它显示了作为连接间隔函数的可实现速度.iOS 没有为您提供如此细粒度的控制,但此信息对您计算仍然很有价值.

To get a better understanding of what speeds you can achieve, I suggest you analyze this diagram http://www.scriptreactor.com/conn_interval-throughput.pdf It shows the achievable speeds as a function of connection interval. iOS does not give you such a fine grained control but this info is still valuable for you to calculate with.

这篇关于通过蓝牙 4.0 LE 发送图像文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆