Iphone蓝牙通信

来源:互联网 发布:淘宝开店要交保证金吗 编辑:程序博客网 时间:2024/05/16 17:38

          蓝牙,相信大家都知道是什么,有了它,两台具有蓝牙功能的设备,只要距离相近就可以通信。最近我们游戏需要这个功能,因此这段时间我很大部分时间都在学习这一技术,对于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];
 
     这样我们就完成了从创建一个连接,搜索一个设备,连接一个设备的过程,主要都是处理上面的几个回调函数。
原创粉丝点击