zoukankan      html  css  js  c++  java
  • [ios2]蓝牙通信【转】

    iPhone开发应用中关于GameKit蓝牙实例讲解是本文要介绍的内容,主要是来了解并学习GameKit蓝牙实例。介绍一下这个实例实现的是两个带有蓝牙设备的touch之间的一个小游戏,在界面上有个可以响应事件的UIView(之前说过)可以点击,然后看谁新达到WINNING_TAP_COUNT (游戏中一常量可以自己设置)谁先达到谁就赢了,然后通知对方。还要引入GameKit.framework框架
    头文件BlueToothViewController.h:
    [pre]

      //  
    1. //  // BlueToothViewController.h  
    2. // BlueTooth  //  
    3. // Created by mingchun liu on 09-11-24.  // Copyright sdie 2009. All rights reserved.  
    4. //  
    5. #import <UIKit/UIKit.h> #import <GameKit/GameKit.h>

    6. #define START_GAME_KEY @"startgame"  
    7. #define END_GAME_KEY @"endgame"  #define TAP_COUNT_KEY @"taps"  
    8. #define WINNING_TAP_COUNT 50  
    9. #define AMIPHD_P2P_SESSION_ID @"amiphdp2p2"//这个是蓝牙协议  
    10. @interface BlueToothViewController : UIViewController<GKPeerPickerControllerDelegate,GKSessionDelegate>{          BOOL actingAsHost;//是否提供服务,客户端还是服务器端  
    11.         int playerTapCount;//记录玩家点击次数          int opponentTapCount;//对方点击次数  
    12.         IBOutlet UILabel *playerTapCountLabel;//显示玩家点击次数          IBOutlet UILabel *opponentTapCountLabel;//显示对手点击次数  
    13.         NSString *opponentID;//对方标识符          GKSession *gkSession;  

    14.         IBOutlet UILabel *startQuitButton;//开始退出按钮  
    15. }  
    16. @property BOOL actingAsHost;  @property int playerTapCount;  
    17. @property int opponentTapCount;  @property (nonatomic,retain) GKSession *gkSession;  

    18. @property (nonatomic,retain) NSString *opponentID;  

    19. @property (nonatomic,retain)UILabel *playerTapCountLabel;  
    20. @property (nonatomic,retain)UILabel *opponentTapCountLabel;  
    21. @property (nonatomic,retain)UILabel *startQuitButton;  
    22. -(IBAction) handleStartQuitTapped;//处理开始退出操作  -(IBAction) handleTapViewTapped;//处理点击UIView的操作  
    23. -(void) updateTapCountLabels;//更新显示  -(void) initGame;//初始化游戏  
    24. -(void) hostGame;  -(void) joinGame;//加入游戏  
    25. -(void) endGame;//结束游戏  -(void) showEndGameAlert;//弹出结束游戏对话框  
    26. @end  
    27. #import "BlueToothViewController.h"  
    28. @implementation BlueToothViewController  
    29. @synthesize actingAsHost;  @synthesize playerTapCount;  
    30. @synthesize opponentID;  @synthesize playerTapCountLabel;  
    31. @synthesize opponentTapCountLabel;  
    32. @synthesize startQuitButton;  @synthesize gkSession;  
    33. @synthesize opponentTapCount;  
    34. -(IBAction) handleStartQuitTapped {//建立链接操作,弹出链接窗口显示在线          if (! opponentID) {//如果对手ID为空就建立服务端提供服务  
    35. actingAsHost = YES;                  GKPeerPickerController *peerPickerController =[[GKPeerPickerController alloc] init];  
    36. peerPickerController.delegate = self;  peerPickerController.connectionTypesMask =  
    37. GKPeerPickerConnectionTypeNearby;                  [peerPickerController show];  
    38.         }  }  
    39. -(IBAction) handleTapViewTapped {//点击操作          playerTapCount++;  
    40.         [self updateTapCountLabels];          // did we just win?  
    41.         BOOL playerWins = playerTapCount >= WINNING_TAP_COUNT;//当点击达到一定次数时          // send tap count to peer  
    42.         NSMutableData *message = [[NSMutableData alloc] init];//传的数据类型为nsdata类型的          NSKeyedArchiver *archiver =  
    43.         [[NSKeyedArchiver alloc] initForWritingWithMutableData:message];          [archiver encodeInt:playerTapCount forKey: TAP_COUNT_KEY];  
    44.         if (playerWins)                  [archiver encodeBool:YES forKey:END_GAME_KEY];  
    45.         [archiver finishEncoding];//打包传数据          GKSendDataMode sendMode =  
    46. playerWins ? GKSendDataReliable : GKSendDataUnreliable;//判断用可靠的链接还是不可靠的链接          [gkSession sendDataToAllPeers: message withDataMode:sendMode error:NULL];//发送数据  
    47.         [archiver release];          [message release];  
    48.         // also end game locally          if (playerWins)  
    49.                 [self endGame];  }  

    50. -(void) updateTapCountLabels {  
    51. playerTapCountLabel.text =          [NSString stringWithFormat:@"%d", playerTapCount];  
    52. opponentTapCountLabel.text =          [NSString stringWithFormat:@"%d", opponentTapCount];  
    53. }  -(void) initGame {  
    54. playerTapCount = 0;  opponentTapCount = 0;  
    55. }  -(void) hostGame {  
    56.         [self initGame];          NSMutableData *message = [[NSMutableData alloc] init];  
    57.         NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]                                                                   initForWritingWithMutableData:message];  
    58.         [archiver encodeBool:YES forKey:START_GAME_KEY];          [archiver finishEncoding];  
    59.         NSError *sendErr = nil;          [gkSession sendDataToAllPeers: message  
    60.                                          withDataMode:GKSendDataReliable error:&sendErr];          if (sendErr)  
    61.                 NSLog (@"send greeting failed: %@", sendErr);          // change state of startQuitButton  
    62. startQuitButton.text = @"Quit";          [message release];  
    63.         [archiver release];          [self updateTapCountLabels];  
    64. }  -(void) joinGame {  
    65.         [self initGame];  startQuitButton.text = @"Quit";  
    66.         [self updateTapCountLabels];  }  

    67. //一下是代理方法  

    68. -(GKSession *) peerPickerController: (GKPeerPickerController*) controller  
    69.                   sessionForConnectionType: (GKPeerPickerConnectionType) type {          if (!gkSession) {//如果没有链接时建立连接  
    70. gkSession = [[GKSession alloc]                                           initWithSessionID:AMIPHD_P2P_SESSION_ID//根据此值判断用的是什么链接  
    71.                                          displayName:nil//在线用户名                                           sessionMode:GKSessionModePeer];  
    72. gkSession.delegate = self;          }  
    73.         return gkSession;  }  

    74. - (void)peerPickerController:(GKPeerPickerController *)picker didConnectPeer:(NSString *)peerID toSession:(GKSession *)session  
    75. {//当picker接收到数据后将其释放掉,否则进入不了界面          [picker dismiss];  
    76. picker.delegate = nil;          [picker autorelease];  
    77. }  - (void)session:(GKSession *)session  
    78. didReceiveConnectionRequestFromPeer:(NSString *)peerID {//已接受连接请求的代理方法  actingAsHost = NO;//设为客户端  
    79. }  
    80. - (void)session:(GKSession *)session peer:(NSString *)peerID  didChangeState:(GKPeerConnectionState)state {//状态改变时触发的代理方法  
    81.         switch (state)          {  
    82.                 case GKPeerStateConnected:                          [session setDataReceiveHandler: self withContext: nil];  
    83. opponentID = peerID;//改变opponentID的值                          actingAsHost ? [self hostGame] : [self joinGame];//  
    84.                         break;          }  
    85. }  
    86. - (void) receiveData: (NSData*) data fromPeer: (NSString*) peerID                     inSession: (GKSession*) session context: (void*) context {//接受数据时的代理操作  
    87.         NSKeyedUnarchiver *unarchiver =          [[NSKeyedUnarchiver alloc] initForReadingWithData:data];  
    88.         if ([unarchiver containsValueForKey:TAP_COUNT_KEY]) {  opponentTapCount = [unarchiver decodeIntForKey:TAP_COUNT_KEY];  
    89.                 [self updateTapCountLabels];          }  
    90.         if ([unarchiver containsValueForKey:END_GAME_KEY]) {                  [self endGame];  
    91.         }          if ([unarchiver containsValueForKey:START_GAME_KEY]) {  
    92.                 [self joinGame];          }  
    93.         [unarchiver release];  }  
    94. //以上是代理方法  
    95. -(void) showEndGameAlert {          BOOL playerWins = playerTapCount> opponentTapCount;  
    96.         UIAlertView *endGameAlert = [[UIAlertView alloc]                                                                   initWithTitle: playerWins ? @"Victory!" : @"Defeat!"  
    97.                                                                  message: playerWins ? @"Your thumbs have emerged supreme!":                                                                   @"Your thumbs have been laid low"  
    98.                                                                  delegate:nil                                                                   cancelButtonTitle:@"OK"  
    99.                                                                  otherButtonTitles:nil];          [endGameAlert show];  
    100.         [endGameAlert release];  }  
    101. -(void) endGame {  opponentID = nil;  
    102. startQuitButton.text = @"Find";          [gkSession disconnectFromAllPeers];  
    103.         [self showEndGameAlert];  }  

    104. /*  
    105. // The designated initializer. Override to perform setup that is required before the view is loaded.  - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {  
    106.     if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {          // Custom initialization  
    107.     }      return self;  
    108. }  */  

    109. /*  
    110. // Implement loadView to create a view hierarchy programmatically, without using a nib.  - (void)loadView {  
    111. }  */  

    112. /*  
    113. // Implement viewDidLoad to do additional setup after loading the view, typically from a nib.  - (void)viewDidLoad {  
    114.     [super viewDidLoad];  }  
    115. */  
    116. /*  // Override to allow orientations other than the default portrait orientation.  
    117. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {      // Return YES for supported orientations  
    118.     return (interfaceOrientation == UIInterfaceOrientationPortrait);  }  
    119. */  
    120. - (void)didReceiveMemoryWarning {          // Releases the view if it doesn't have a superview.  
    121.     [super didReceiveMemoryWarning];  
    122.         // Release any cached data, images, etc that aren't in use.  }  

    123. - (void)viewDidUnload {  
    124.         // Release any retained subviews of the main view.          // e.g. self.myOutlet = nil;  
    125. }  
    126. - (void)dealloc {          [opponentID release];  
    127.         [playerTapCountLabel release];          [opponentTapCountLabel release];  

    128.         [startQuitButton release];          [gkSession release];  
    129.     [super dealloc];  }

    [/pre]小结:iPhone开发GameKit蓝牙实例讲解的内容介绍完 ,希望通过本文的学习能对你有所帮助!

  • 相关阅读:
    Intelij根据数据库表生成实体类
    RabbitMQ(二):入门案例
    RabbitMQ(一):简介和基本概念
    Python 第十课,面向对象补足,异常处理
    Python 第九课,面向对象进阶
    Python 第七课,模块
    Python 第六课,装饰器,生成器,迭代器,其他
    Python 第五课,正则表达式
    Python 第四课,内置函数,I/O操作。
    Python 第三课,函数。
  • 原文地址:https://www.cnblogs.com/jinjiantong/p/3141389.html
Copyright © 2011-2022 走看看