lanya2

如何使用GameKit

第一部分
Peer-to-Peer的连接

Session:会话iPhone通过Session互相发送数据读取数据
Peer:每一部网络中的设备算一个节点

第一节 发现其他的节点:
会话要么把自己当成 服务器/客户端 中的一种,要么做一个节点即当服务器又当客户端

1. 实现一个Server
initWithSessionID:displayName:sessionMode:GKSessionModeServer|GKSessionModePeer
服务器收到客户请求后,回调 session:didReceiveConnectionRequestFromPeer:
委托类 接受请求
   acceptConnectionFromPeer:error:
委托类 拒绝请求
   denyConnectionFromPeer:
成功建立连接后:回调委托类函数:session:peer:didChangeState
2. 连接到一个服务
initWithSessionID:displayName:sessionMode: GKSessionModeClient|GKSessionModePeer
发现可用的服务后,回调委托类函数:session:peer:didChangeState: 提供自己的PeerID
发送请求:connectToPeer:withTimeout
成功建立连接:回调:session:peer:didChangeState

第二节 交换数据
1. 发送:
sendDataToAllPeers:withDataMode:error:
sendData:toPeer:withDataMode:error
2. 接受:
receiveData:fromPeer:inSession:context:
setDataReceivehandler:withContext:

第三节
断开节点:
disconnectPeerFromAllPeers:
回调:session:peer:didChangeState:
第四节 清理:
移除数据处理器并释放会话


第二部分
添加一个节点选择器

1. 创建并初始化一个GKPeerPicerController
picker = [[GKPeerPickerController alloc] init];
2. 附加委托
picker.delegate = self;
3. 配置可选网络 ( 默认蓝牙 )
picker.connectionTypesMask = GKPeerPickerConnectionTypeNearby |
GKPeerPickerConnectionTypeOnline;
4. 若选择因特网连接,实现:
- (void)peerPickerController:(GKPeerPickerController *)picker
   didSelectConnectionType:(GKPeerPickerConnectionType)type{
    if (type == GKPeerPickerConnectionTypeOnline) {
     picker.delegate = nil;
     [picker dismiss];
     [picker autorelease];
     //implement your own internet user inter face here
    }
}
5. 实现委托的节点选择器
peerPickerController:(GKPeerPickerControlller *)picker
sessionForConnectionType:(GKPeerPickerConnectionType)type
{
GKSession* session = [[GKSession alloc]] initWithSessionID:myExampleSessionID displayName:myName sessionMode:GKSessionModePeer] ;

[session autorelease];
}
//在覆盖节点选择器的原有方法时实现此方法。
6. 实现委托的peerPickerController:didConnectPeer:toSession:方法获得对配置好的session的所有权。
- (void)peerPickerController:(GKPeerPickerController *)picker didConnectPeer:( NSString *)peerID toSession: (GKSession *)season{
// 使用Retain过的属性拥有这个session
self.gameSession = self;
// 假设我们的对象同样是委托类
session.delegate = self;
[session setDataReceiveHandler: self withContext:nil];
//除掉picker
picker.delegate = nil;
[picker dismiss];
[picker autorelease];
//开始你的游戏
}
7.实现取消连接的代理方法

- (void) peerPickerControllerDidCancel:(GKPeerPickerController *)picker
{
picker.delegate = nil;
//控制器自动取消对话界面
[picker autorelease];
}
8. 显示对话
[picker show];


第三部分
使用Sessions

1. 实现 会话代理的方法:session:didChangeState:
- (void) session:(GKSession *)session peer:(NSString *)peerID
didChangeState:(GKPeerConnectionState)state
{
   switch ( state)
   {
    case GKPeerStateConnecte:
   // 相关代码
    break;
    case GKPeerStateDisconnected:
   //相关代码
    break;
   }
}
2. 发送数据到其他Peer

- (void) mySendDataToPeers: (NSData *)data
{
   [session sendDataToAllPeers: data withDataMode: GKSendDataReliable error: nil];
}
3. 从其他节点接收数据
- (void) receiveData:(NSData *)data fromPeer: (NSString *)peer inSession:
(GKSession *)session context:(void *)context
{
   //读取数据
}
4. 清除会话
[session disconnectFromAllPeers];
session.availabel = NO;
[session setDataReceiveHandler: nil withContext: nil];
session.delegate = nil;
[session release];


摘自:http://hi.baidu.com/b_a_d_b_u_k/blog/item/f326051152c85f75cb80c4d8.html


iphone蓝牙通信GameKit框架

GameKit框架中蓝牙传输主要用到的2个类
GKPeerPickerController
GKSession
通过GKPeerPickerController 提供了UI界面picker,我们也可以自定义界面。
如同其它的框架一般,APPLE提供了功能强大的代理。
蓝牙传输需要使用的2个代理是:
GKPeerPickerControllerDelegate
GKSessionDelegate
iPhone OS 3.0的最佳功能是GameKit框架,这个框架包括了允许基于蓝牙网络进行通信的API,你可以更轻松地创建点到点的游戏和应用程序。与其它移动平台不一样,在iPhone中使用蓝牙作为一个通信信道比预期的要容易得多,因此,本文将向你展示如何构建一个简单的应用程序,实现iPhone和iPod之间的相互通信。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是检查和优化后的代码: 1. 检查: a. 代码中使用了Serial3.read()两次,这意味着每次循环都会尝试读取两次数据。在第一次读取后,第二次读取可能会返回一个不正确的值或无效值。因此,建议将Serial3.read()的结果存储在一个变量中并在代码中多次使用该变量。 b. while循环中使用了!=运算符,这可能会导致无限循环。建议使用一个计数器来限制循环次数,以避免无限循环。 2. 优化: a. 为了避免重复读取数据,建议在while循环之前读取一次数据并将其存储在一个变量中。然后在while循环中使用该变量进行比较。 b. 为了更好地控制while循环的执行次数,建议使用一个计数器来限制循环次数。如果循环次数超过计数器的最大值,则退出循环并引发一个错误。 c. 为了更好地处理异常情况,建议在while循环之后添加一些错误处理代码,例如在读取数据时发生超时或错误时引发一个错误。 以下是优化后的代码: // 声明变量 char data; // 存储读取的数据 char lanya[20]; // 存储蓝牙数据 int i = 0; // 蓝牙数据计数器 int max_loops = 100; // 循环计数器最大值 int loops = 0; // 循环计数器 // 读取蓝牙数据 while (Serial3.available() > 0) { data = Serial3.read(); if (data == 'N') { break; // 数据读取完成,退出循环 } lanya[i] = data; // 存储数据 i++; // 增加计数器 if (i >= 20) { break; // 数据长度超出,退出循环 } loops++; // 增加循环计数器 if (loops >= max_loops) { // 循环计数器超出,引发一个错误 Serial.println("Error: Bluetooth data read timeout."); break; } } // 处理异常情况 if (loops >= max_loops || i >= 20) { // 引发一个错误并重置计数器 i = 0; loops = 0; return; } // 处理蓝牙数据 // ... // 重置计数器 i = 0; loops = 0;

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值