2
3 didConnectPeer:(NSString *)peerID
4
5 toSession:(GKSession *) session {
6
7 self.currentSession = session;
8
9 session.delegate = self;
10
11 [session setDataReceiveHandler:self withContext:nil];
12
13 picker.delegate = nil;
14
15 [picker dismiss];
16
17 [picker autorelease];
18
19 }
20
21
当用户已经连接到对等蓝牙设备后,可以将GKSession对象保存到currentSession属性中,这样你可以使用GKSession对象与远程设备通信。
如果用户取消了蓝牙选择器,调用peerPickerControllerDidCancel:方法,其定义如下:
1 - (void)peerPickerControllerDidCancel:(GKPeerPickerController *)picker2
3 {
4
5 picker.delegate = nil;
6
7 [picker autorelease];
8
9 [connect setHidden:NO];
10
11 [disconnect setHidden:YES];
12
13 }
14
15
如果要从一个设备断开连接,使用来自GKSession对象的disconnectFromAllPeers方法,btnDisconnect:方法的实现如下:
1 -(IBAction) btnDisconnect:(id) sender {2
3 [self.currentSession disconnectFromAllPeers];
4
5 [self.currentSession release];
6
7 currentSession = nil;
8
9 [connect setHidden:NO];
10
11 [disconnect setHidden:YES];
12
13 }
14
15
连接设备或断开连接时,调用session:peer:didChangeState:方法,其实现如下:
1 - (void)session:(GKSession *)session2
3 peer:(NSString *)peerID
4
5 didChangeState:(GKPeerConnectionState)state {
6
7 switch (state)
8
9 {
10
11 case GKPeerStateConnected:
12
13 NSLog(@"connected");
14
15 break;
16
17 case GKPeerStateDisconnected:
18
19 NSLog(@"disconnected");
20
21 [self.currentSession release];
22
23 currentSession = nil;
24
25 [connect setHidden:NO];
26
27 [disconnect setHidden:YES];
28
29 break;
30
31 }
32
33 }
34
35
处理这个事件你将知道连接是什么时候建立的,或断开是什么时候发生的。例如,当建立一个连接时,你可能想要立即向对方发送数据。
发送数据
为了向连接的蓝牙设备发送数据,需要使用到GKSession对象的sendDataToAllPeers:方法,你发送的数据是通过NSData对象 传输的,因此你可以自定义你的应用程序协议和发送的数据类型(如二进制数据),mySendDataToPeers:方法的定义如下:
1 - (void) mySendDataToPeers:(NSData *) data2
3 {
4
5 if (currentSession)
6
7 [self.currentSession sendDataToAllPeers:data
8
9 withDataMode:GKSendDataReliable
10
11 error:nil];
12
13 }
14
15 再定义btnSend:方法,以便用户输入的数据能够发送到远程设备:
16
17 -(IBAction) btnSend:(id) sender
18
19 {
20
21 //---convert an NSString object to NSData---
22
23 NSData* data;
24
25 NSString *str = [NSString stringWithString:txtMessage.text];
26
27 data = [str dataUsingEncoding: NSASCIIStringEncoding];
28
29 [self mySendDataToPeers:data];
30
31 }
32
33
接收数据
当设备接收到数据时,调用receiveData:fromPeer:inSession:context:方法,其实现如下:
1 - (void) receiveData:(NSData *)data2
3 fromPeer:(NSString *)peer
4
5 inSession:(GKSession *)session
6
7 context:(void *)context {
8
9 //---convert the NSData to NSString---
10
11 NSString* str;
12
13 str = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
14
15 UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Data received"
16
17 message:str
18
19 delegate:self
20
21 cancelButtonTitle:@"OK"
22
23 otherButtonTitles:nil];
24
25 [alert show];
26
27 [alert release];
28
29 }
30
31
这里接收到的数据是NSData格式,为了使用UIAlertView类显示它,你需要将其转换为NSString对象。
测试应用程序
就是这么简单!现在可以开始测试了,在Xcode中按下Command-R,将程序部署到iPhone/iPod上,本文假设你有两部iPhone或两部iPod,为了运行刚刚创建的程序,这两台设备上都需要运行iPhone OS 3.0。
部署好程序后,在两台设备上启动好程序,在任一设备上点击连接按钮,GKPeerPickerController将会显示标准的UI发现其它设备,如图4所示。
图 4 GKPeerPickerController查找其它设备
等待一会儿后,两边的程序应该都能够发现对方,如图5所示,当你在发现的设备名称上轻轻点击,程序就会开始连接。
图 5 显示发现的设备名称
注意:如果你在iPhone模拟器上测试这个程序,应该会检测到两个设备,但却无法连接到任何设备。
当其它设备试图连接到你的设备时,你将会看到如图6所示的弹出提示,点击“接受”允许其连接,点击“拒绝”拒绝其连接。
图 6 其它设备试图连接到你时的提示
如果成功与你建立了连接,你就可以输入一些文本信息发给对方了,从其它设备接收到数据将会以一个警告视图显示,如图7所示。
图 7 接收到其它设备发来的数据