您的位置:首页 > 移动开发 > IOS开发

【IOS】蓝牙通信示例

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

头文件BlueToothViewController.h:

[pre]

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

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

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

@property (nonatomic,retain) NSString *opponentID;

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

-(void) updateTapCountLabels {
playerTapCountLabel.text = [NSString stringWithFormat:@"%d", playerTapCount];
opponentTapCountLabel.text = [NSString stringWithFormat:@"%d", opponentTapCount];
} -(void) initGame {
playerTapCount =
0; opponentTapCount =
0;
} -(void) hostGame {
[self initGame]; NSMutableData *message = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:message];
[archiver encodeBool:YES forKey:START_GAME_KEY]; [archiver finishEncoding];
NSError *sendErr =
nil; [gkSession sendDataToAllPeers: message
withDataMode:GKSendDataReliable error:&sendErr]; if (sendErr)
NSLog (@"send greeting failed: %@", sendErr); // change state of startQuitButton
startQuitButton.text = @"Quit"; [message release];
[archiver release]; [self updateTapCountLabels];
} -(void) joinGame {
[self initGame]; startQuitButton.text = @"Quit";
[self updateTapCountLabels]; }

//一下是代理方法

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

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

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

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

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

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

[startQuitButton release]; [gkSession release];
[super dealloc]; }

[/pre]小结:iPhone开发GameKit蓝牙实例讲解的内容介绍完 ,希望通过本文的学习能对你有所帮助!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: