2010-05-20 104 views
3

我想通過使用GameKit框架的藍牙發送文件。我遇到的問題是,我一次只能發送一個NSData對象,但我需要將它保存在另一端。如果不知道文件名,這顯然是不可能的,但我不知道如何傳輸。我試圖將其轉換爲字符串NSData*data = [NSData dataWithContentsOfFile:urlAddress];,但我只能發送一個NSData對象,而不是兩個。GameKit藍牙傳輸問題

有沒有人遇到過這個問題呢?

回答

13

使用GameKit一段時間我發現每發送一個約90k的限制,所以如果你的文件大於90k,你將不得不分解它。這裏是我建議你打破上去:

月1日 - 發送你的文件的名稱

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

2日 - 發送塊的數目您要發送

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' 

3日 - 分解併發送你的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' 
} 

在接收端你要做到以下幾點:

月1日 - 接收的文件名

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

2日 - 接收你對塊的號碼接收

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

3rd - 接收大塊數據

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

如果一切正常, t現在您將擁有包含文件名的fileNameStr對象和包含文件內容的data對象。

希望這有助於 - AYAL

+0

感謝AYAL爲您詳細的答覆,我會很快走出檢查你的代碼,讓你知道如何去。 – Pripyat 2010-05-31 20:29:12

+0

很好的迴應! :) 非常感謝。 – Nick 2010-10-14 13:38:17

+0

有沒有人有這樣做的項目,只是不知道文件名位。我想發送圖片 – Burf2000 2011-07-10 18:34:30