蓝牙,相信大家都知道是什么,有了它,两台具有蓝牙功能的设备,只要距离相近就可以通信。最近我们游戏需要这个功能,因此这段时间我很大部分时间都在学习这一技术,对于Iphone开发,我们使用GameKit这个库,就可以使用蓝牙功能的API了,这里有一篇不错的文档,里面详细地介绍了怎样使用GameKit的蓝牙API,这是链接:http://tech.it168.com/a2010/0114/837/000000837727.shtml
这里的主题不仅是介绍蓝牙通信,更主要介绍两种方式的获取设备方式,一种是使用系统UI,第二种是使用自定义UI的,前者网上介绍比较多,这里不多介绍了,所以具体介绍第二种:使用自定义的UI来获取蓝牙设备。
1.我们的主角是GKSession* currentSession,通过他,我们可以简单地获取旁边的蓝牙设备。
currentSession = [[GKSession alloc] initWithSessionID:sessionID displayName:name sessionMode:GKSessionModePeer];
currentSession.delegate = self;
[currentSession setDataReceiveHandler:self withContext:nil];
currentSession.available = YES;
2.创建好了GKSession我们需要处理几个回调函数,主要有:
1)接到对方申请连接邀请,这里我们可以弹出一个对话框进行确认.
- (void)session:(GKSession *)_session didReceiveConnectionRequestFromPeer:(NSString *)_peerID
这里如果我们同意邀请,可以
if (![currentSession acceptConnectionFromPeer:peerID error:&error]) {
NSLog(@"%@",[error localizedDescription]);
return false;
}
如果我们拒绝邀请,可以
[currentSession denyConnectionFromPeer:peerID];
2)连接失败的通知
- (void)session:(GKSession *)_session connectionWithPeerFailed:(NSString *)_peerID withError:(NSError *)_error
3)// The running session ended, potentially due to network failure.
- (void)session:(GKSession *)_session didFailWithError:(NSError*)_error
4)最重要是下面的回调函数,他处理了搜索到哪些设备,通过一个状态可以区分
- (void)session:(GKSession *)_session peer:(NSString *)_peerID didChangeState:(GKPeerConnectionState)_state
switch (_state) {
case GKPeerStateAvailable:{
// A peer became available by starting app, exiting settings, or ending a call.
if (!isSystemUI) {
if (![peerList containsObject:_peerID]) {
[peerList addObject:_peerID];
}
if (cppDelegate)
{
cppDelegate->BlueToothPeerListDidChange();
}
}
}
break;
case GKPeerStateUnavailable:{
// Peer unavailable due to joining a call, leaving app, or entering settings.
if (!isSystemUI) {
[peerList removeObject:_peerID];
if (cppDelegate)
{
cppDelegate->BlueToothPeerListDidChange();
}
}
}
break;
case GKPeerStateConnected:
NSLog(@"connected! %@", _peerID);
if (!isSystemUI) {
if (oneToN) {
[self addPeerID:_peerID];
[peerList removeObject:_peerID];
}
else {
if (_peerID == peerID) {
NSLog(@"connect main peer!");
self.peerID = _peerID;
self.peerName = _peerName;
currentSession.available = NO;
state = StateConnected;
}
}
}
if (cppDelegate) {
cppDelegate->BlueToothPeerConnectSuccess(pszPeerID, pszPeerName);
}
break;
case GKPeerStateDisconnected:
。。。
这样我们就可以获取到一个设备列表,下面就是我们需要连接哪一个的时候了。
3.连接到特定设备
[currentSession connectToPeer:peerID_ withTimeout:10.0];
这样我们就完成了从创建一个连接,搜索一个设备,连接一个设备的过程,主要都是处理上面的几个回调函数。