[iOS] GameKit - Bluetoothを使った iOSデバイス間の通信

2010年12月9日木曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

GameKit を使い端末間の Bluetooth通信を試してみた。

サンプル


テキストメッセージをやりとりできる簡易なサンプルプログラムを組んでみた。
2つの iOS端末でプログラムを立ち上げて両方で "Connect" を押す。すると近くの端末を探し始める。

Bluetooth がオフに鳴っている場合はオンにするか尋ねられる。
通信可能な端末が見つかるとリストアップされる。
選択すると相手側で受け入れの確認がある。
受け入れる(Accept)と接続が成立する。
 テキストを入れて "send" ボタンを押すと相手側の端末にそのテキストが表示される。


解説


Bluetooth を使った端末間通信を行うのに今回は GameKit.framework を使った。最初にこのフレームワークをプロジェクトへ加えておく。

実装のポイントは2つ。
1. GKPeerPickerController を使い接続を確立する
2. 接続後は GKSession を使いデータの送受信を行う

まず 1. の接続確立から。
- (IBAction)connect:(id)sender
{
 GKPeerPickerController* picker = [[GKPeerPickerController alloc] init];
 picker.delegate = self;
 picker.connectionTypesMask = GKPeerPickerConnectionTypeNearby;
 [picker show];
}
インスタンスを作り、-[show] を投げると接続に必要なダイアログが表示される。
この後は接続の確立もしくはキャンセルのタイミングで GKPeerPickerControllerDelegate のメソッドが呼ばれる。
接続が確立すると -[peerPickerController:didConnectPeer:] が呼ばれる。接続してしまえば GKPeerPickerController は不要になるので閉じておく。接続後に渡される GKSession を取っておく。この GKSession をこの後のデータ送受信で使う。
- (void)peerPickerController:(GKPeerPickerController *)picker
 didConnectPeer:(NSString *)peerID toSession:(GKSession *)session
{
 self.peerID = peerID;
 self.session = session;
 session.delegate = self;
 [session setDataReceiveHandler:self withContext:nil];
 picker.delegate = nil;
 [picker dismiss];
 [picker autorelease];
}

続いて 2. のデータ送受信を行う。まず送る側から。UITextField 内の文字列を UTF8エンコードして NSDateに変換し、これを送信する。
- (IBAction)sendText:(id)sender
{
 NSData* data = [self.sendText.text dataUsingEncoding:NSUTF8StringEncoding];

 NSError* error = nil;
 [self.session sendData:data
       toPeers:[NSArray arrayWithObject:self.peerID]
     withDataMode:GKSendDataReliable
      error:&error];
 if (error) {
  NSLog(@"%@", error);
 }
 self.sendText.text = @"";
}
次に受け側。receiveData:fromPeer:inSession:context: を実装する。ここでは渡ってきた NSData を UTF8でデコードして NSStringに戻し、画面上の UITextView へ表示している。
- (void) receiveData:(NSData *)data fromPeer:(NSString *)peer
 inSession: (GKSession *)session context:(void *)context
 NSString* msg = [[[NSString alloc] initWithData:data
   encoding:NSUTF8StringEncoding] autorelease];
 NSString* text = [self.textView.text stringByAppendingFormat:@"%@\n", msg];
 self.textView.text = text;
}

最低限のコードはこれだけ。実に簡単に Bluetooth 通信が実現できる。


ソースコード


GitHub からどうぞ。
BluetoothSample at 2010-12-09 from xcatsan/iOS-Sample-Code - GitHub


備考


Mac Book Pro 上で動かしている iPhoneシミュレータでは Bluetooth の接続確認は行えなかった。Bluetooth自体は有効になるのだが iPhoneを見つけてくれない。シミュレータでテストできるとかなり楽なのだが。今は iPhone 3GS, iPad 両方にいちいちインストールしてテストしている。WiFi接続に切り替えられるようにするとシミュレータでも動くかもしれないので後で試してみよう。

Responses

Leave a Response

人気の投稿(過去 30日間)