Я пытаюсь отправить NSData
больше Bluetooth
через GameKit
.
Хотя у меня GameKit
настроен и я могу отправлять небольшие сообщения, теперь я хотел бы расширить и отправить по целым файлам.
Я читал, что вам нужно разбить большие файлы на пакеты, прежде чем отправлять их по отдельности.
Поэтому я решил создать struct
, чтобы упростить декодирование пакетов, когда они получены на другом конце:
typedef struct {
const char *fileName;
NSData *contents;
int fileType;
int packetnumber;
int totalpackets;
} file_packet;
Однако для небольших файлов (8 КБ и меньше) я думал, что одного пакета будет достаточно.
Итак, для одного пакета я подумал, что смогу создать file_packet, установить его свойства и отправить его через -sendDataToAllPeers: withDataMode: error:
NSData *fileData;
file_packet *packet = (file_packet *)malloc(sizeof(file_packet));
packet->fileName = [filename cStringUsingEncoding:NSASCIIStringEncoding];
packet->contents = [NSData dataWithContentsOfFile:selectedFilePath];
packet->packetnumber = 1;
packet->totalpackets = 1;
packet->fileType = 56; //txt document
fileData = [NSData dataWithBytes:(const void *)packet length:sizeof(file_packet)];
free(packet);
NSError *error = nil;
[self.connectionSession sendDataToAllPeers:fileData withDataMode:GKSendDataReliable error:&error];
if (error) {
NSLog(@"An error occurred: %@", [error localizedDescription]);
}
Однако я не думаю, что какая-то правильная настройка fileData - и error
ничего не отображает.
Когда файл получен, я делаю следующее:
file_packet *recievedPacket = (file_packet *)malloc(sizeof(file_packet));
recievedPacket = (file_packet *)[data bytes];
NSLog(@"packetNumber = %d", recievedPacket->packetnumber);
...
Однако на консоли выводится packetNumber = 0
, даже если я установил packetNumber равным 1.
Я упускаю очевидное? Я мало что знаю о NSData
или GameKit
.
Итак, мой вопрос: могу ли я добавить file_packet
в NSData
, и если да, то как мне это сделать успешно и как разделить файлы на несколько пакетов?