通过BLE iOS发送图像

时间:2015-01-20 00:56:55

标签: ios image bluetooth-lowenergy core-bluetooth

我在两个iOS设备之间通过BLE发送大小约为7KB的图像。我正在使用Core蓝牙框架。在apple开发人员给出的BTLE Transfer示例中,有一个sendData方法,它将数据分成20个字节的较小块并通过蓝牙发送。但这不保持任何顺序。我该如何处理每个较小块发送的顺序。此外,如果丢弃了一个块,我该如何处理它。我不能错过任何一块。

- (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 >= imageData.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 = imageData.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:imageData.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 >= imageData.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;
        }
    }
}

0 个答案:

没有答案