前回に続き、Bluetoothの通信についての内容。
前回記載した対応で、通信の確立を行い、簡単なデータの送受信(短い文字列)の確認まで出来ていた。
ここから、今回開発するデータの形式にあわせてカスタマイズしていくのだが、また引っかかってしまった。
ある程度、送受信するデータの整形を実装し、何度かテストを行っていると、直に接続が切れてしまう事があった。
特に、切断理由が出る訳でもないため、意味が分からなかった。
何度かパターンをかえながらテストを行っている時に今回の実装の為に調べた中で思い出した事があった。
GameKitのGKSessionやGKPeerPickerControllerを使った場合、データサイズが1000バイトまでが推奨サイズらしい。
さらに、87Kbの制限があるとの記載まである。
しかし、このサイズを超えても、動作したと報告もあったので、その時にはあまり気にしなかった。
しかし、今回確認した内容を考えた場合、データサイズの制限に引っかかっている可能性が高い。
仕方なく、データを分割して通信を行う事にした。
何とも面倒な事だが仕方がない。
まず始めに、推奨サイズに指定されている1000バイトで実装を進める。
(当然、サイズはデファイン化し、最終的には、バランスのよいサイズを探る予定)
まずは、送信側でNSData型にまとめたデータを分割する。
NSRange dataRange;
NSInteger dataSize = pinData.length;
NSInteger dataSplitCount = dataSize/DATA_SPLIT_SIZE;
dataRange.length = DATA_SPLIT_SIZE;
dataRange.location = 0;
NSMutableArray *dataArray = [NSMutableArray array];
for(NSInteger cnt = 0;cnt<dataSplitCount;cnt++)
{
[dataArray addObject:[sendData subdataWithRange:dataRange]];
dataRange.location += DATA_SPLIT_SIZE;
}
// 最後のデータは、レングスを調整してから処理を行う
dataRange.length = dataSize%DATA_SPLIT_SIZE;
[dataArray addObject:[pinData subdataWithRange:dataRange]];
このようにして、データの分割を行う。
そして、受信側は、これの反対の処理を行う
NSMutableData *receiveData;
これで、保存エリアを確保した状態で、下記のように受信データをつなげていく。
// 受信データを保存する
[receiveData appendData:data];
これでを繰り返す事で、大きなデータに戻す事が出来る。
この、「NSMutableData 」は、NSDataとしてそのまま使用する事が可能。
その為、最後のデータを受信してから下記処理を行う事で元のデータ構造に戻す事が出来る。
DataObject *receiveObject = [NSKeyedUnarchiver unarchiveObjectWithData: receiveData];
この実装で動作確認をすると、問題なくデータの送受信が出来た。
何とも面倒な処理を書く必要があった。
しかし、逆に大きなデータの転送を行う場合には、分割したいくつ目まで送受信を行ったのかを監視するとこで、進捗状況を表示する事が出来る。
この辺りをうまく整理して実装する事で、見た目のよいものを作る事が出来ると思う。
あとは、最初の方に書いているように、1回のデータ送受信のサイズを、安定性、スピード等を考えて、いろいろ試しながら調整する必要があると思われる。
[0回]
PR