Iphone蓝牙通信

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值