iOS蓝牙传输有时会得到不完整的数据

时间:2013-11-14 00:38:45

标签: ios iphone objective-c bluetooth

ios客户端获取不完整的数据当数据以非常短的间隔发送时。但如果以足够的间隔发送到ios客户端的数据没有问题。这是我的代码,有什么建议吗?谢谢:-)

- (void)handleIncoming:(NSInputStream *)stream
{
    while ([stream hasBytesAvailable])
    {
        unsigned char buf[DATA_CHUNK_SIZE];
        NSUInteger len;
        NSLog(@"hasBytesAvailable...............");
        len = [stream read:buf maxLength:DATA_CHUNK_SIZE];
        if(len > 0)
        {
            OppoDLog(@"raw len: %d", len);
            [appDelegate receivedData:buf length:len];
        }
    }
}

2 个答案:

答案 0 :(得分:0)

有时持续时间可能会成为一个问题,如果你的文件大于90k,你就必须将其分解。以下是我建议你解决问题的方法:

1st - 发送文件名

NSData* fileNameData = [fileNameStr dataUsingEncoding: NSASCIIStringEncoding];
// send 'fileNameData'

第二 - 发送您要发送的块数

NSUInteger fiftyK = 51200;
NSUInteger chunkCount = (((NSUInteger)(srcData.length / fiftyK)) + ((srcData.length % fiftyK) == 0 ) ? 0 : 1))
NSString chunkCountStr = [NSString stringWithFormat:@"%d",chunkCount];
NSData* chunkCountData = [chunkCountStr dataUsingEncoding: NSASCIIStringEncoding];
// send 'chunkCountData'

3rd - 分解并将你的NSData对象发送到一组每个小于50k的NSObject(只是为了安全大小)

NSData *dataToSend;
NSRange range = {0, 0};
for(NSUInteger i=0;i<srcData.length;i+=fiftyK){
  range = {i,fiftyK};
  dataToSend = [srcData subdataWithRange:range];
  //send 'dataToSend'  
}
NSUInteger remainder = (srcData.length % fiftyK);
if (remainder != 0){
  range = {srcData.length - remainder,remainder};
  dataToSend = [srcData subdataWithRange:range];
  //send 'dataToSend'  
}

在接收方,您需要执行以下操作:

1st - 接收文件名

// Receive data
NSString* fileNameStr = [[NSString alloc] initWithData:receivedData encoding:NSASCIIStringEncoding]

2nd - 接收您即将接收的块数

// Receive data
NSString* chunkCountStr = [[NSString alloc] initWithData:receivedData encoding:NSASCIIStringEncoding]
NSUInteger chunkCount = [chunkCount intValue];

3 - 接收数据块

NSMutableData data = [[NSMutableData alloc]init];
for (NSUInteger i=0; i<chunkCount;i++){
  // Receive data
  [data appendData:receivedData];
}

如果一切正常,您现在将拥有一个包含文件名的fileNameStr对象和一个包含文件内容的数据对象。

答案 1 :(得分:0)

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

来源:Sending image file over Bluetooth 4.0 LE