[ios2]蓝牙通信【转】

时间:2023-11-18 14:02:26

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. ;  ;
  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蓝牙实例讲解的内容介绍完 ,希望通过本文的学习能对你有所帮助!