サンプル
テキストメッセージをやりとりできる簡易なサンプルプログラムを組んでみた。
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