`
kbk730oe
  • 浏览: 19928 次
社区版块
存档分类
最新评论

蓝牙项目实现

阅读更多

蓝牙项目实现
2012年01月17日
                                蓝牙联机总结
  连接的相关数据传送,需要从两个(或两个以上的)角度来进行设计和思考服务端和客户端(或者称为接收数据端和发送端来思考更合适,虽然两端都包含数据接收和发送两种思想,但设计的时候分开想好了再来写容易些),不管是蓝牙联还是通过网络服务器实现多人联,程序的构架思想是一样的。
  (Apple api)
  GKPeerPickerController 类(说明)
  继承自 NSObject 类(在Frameworks中添加GameKit)
  在3.0b以后版本中有效
  在GKPeerPickerController.h中定义
  参考指南:GameKit 编程指南
  参考代码例子:GKTank
  概要:
  GKPeerPickerController类给用户提供一个标准接口,该接口允许用户的iPhone发现并连接上另外一个iPhone。结果是配置两个连接设备的GKSession object。使用GKPeerPickerController object后,你的程序生成一个控制器,增加一个delegate,配置允许连接的类型,然后显示picker。当用户选择连接一个picker的时候,代理会自动调用。
  在iPhone os 3.0中,peer picker能够配置选择类型,在蓝牙和网络连接之间选择。
  注意:虽然用户能够在peer picker里选择网络连接,GKPeerPickerController不会提供用户接口来设置他们。如果你的app设置peer picker允许网络连接,你的app必须(dismiss)去掉peer picker的点连接功能,而且这个时候它配置成网络连接。
  if(Type=GKPeerPickerConnectiionTypeNearby)采用此语句会直接选择蓝牙模式,
  if(Type=GKPeerPickerConnectionTypeOnline)采用此语句iphone会调用wifi功能
  如果使用online类型则可以用手机和电脑进行联机程序测试!
  picker初始化后,可以设定连接类型
  picker.connectionTypesMask =GKPeerPickerConnectionTypeNearby|
  GKPeerPickerConnectionTypeOnline;
  [picker show];
  相关任务
  设置和获得代理
  delegate属性
  peer picker controller的代理
  GKPeerPickerController类
  显示picker对话框
  -show(给用户显示picker对话框)
  -dismiss(隐藏peer picker对话框)
  visible属性(一个bool值,表明是否显示有visible对话框)
  设置连接选项
  一个mask决定当前连接类型,这个mask显示给用户
  属性
  connectionTypesMask
  一个mask显示当前连接的对话框,用户能看到
  @property(nonatomis,assign) GKPeerPickerConnectType connectionTypesMask
  注意: 你的app允许在显示peer picker之前设置连接。如果你允许超过一个以上的连接类型,peer picker提供用户选择一个连接。默认连接是GKPeerPickerConnectionTypeNearby
  在3.0中,GKPeerPickerConnectionTypeNearby是允许连接的类型中的一个。
  在GKPeerPickerController.h文件中定义
  delegate
  @property(nonatomic,assign) iddelegate
  该delegate必须适合GKPeerPickerControllerDelegate格式协议
  visible
  是一个boolean值(只读属性)
  @property(readonly, getter=isVisible) BOOL visible
  在GKPeerPickerController.h文件中定义
  实例方法
  dismiss
  隐藏peer picker 对话框
  -(void)dismiss
  Declared In 
  GKPeerPickerController.h 
  show给用户显示picker对话框
  官方相关代码
  GKTank
  constants
  GKPeerPickerConnectionType
  enum{
  GKPeerPickerConnectionTypeOnline = 1 :error:
  -denyConnectionFrompeer:
  连接点的数据传送相关
  -setDataReceiveHandler:withContext:
  -sendData:toPeers:withDataMode:error:
  -sendDataToAllPeers:withDataMode:error:
  disconnectTimeout
  关于session的信息
  displayName
  peerID
  sessionID
  sessionMode
  peerID只读属性
  @property(readonly)NSString *peerID
  sessionID
  @property(readonly)NSString *sessionID
  sessionMode
  @property(readonly)GKSessionMode sessionMode     acceptConnectionFromPeer:error: -(BOOL)acceptConnectionFromPeer:(NSString*)peerID error:(NSError*)error
  参数peerID
  error
  返回Yes,or NO
  cancelConnectToPeer:
  -(void)cancelConnectToPeer:(NSString*)peerID
  initWithSessionID:displayName:sessionMode: 
  Initializesandreturnsanewlyallocatedsession. 
  - (id)initWithSessionID:(NSString *)sessionIDdisplayName:(NSString *)name 
  sessionMode:(GKSessionMode)mode 
  peersWithConnectionState: 
  Returnsalistofpeersinthespecifiedconnectionstate. 
  - (NSArray *)peersWithConnectionState:(GKPeerConnectionState) state 
  sendData:toPeers:withDataMode:error: 
  Transmitsacollectionofbytestoalistofconnectedpeers . 
  - (BOOL)sendData:(NSData *)datatoPeers:(NSArray *)peers 
  withDataMode:(GKSendDataMode)modeerror:(NSError **)error 
  参数:
  data
  发送的字节
  peers
  An array of NSString objects identifying the peers that should receive the data.
  一个NSString数组确认应该接受数据的点
  mode
  用来发送数据的方法
  - (void) receiveData:(NSData *)data fromPeer:(NSString *)peer inSession: 
  (GKSession *)session context:(void *)context; 
  typedef enum { 
  GKSendDataReliable, 
  GKSendDataUnreliable, 
  } GKSendDataMode;GKSessionClassReference
  SessionModes 
  Modesthatdeterminehowasessioninteractswithotherpee rs. 
  typedef enum { 
  GKSessionModeServer, 
  GKSessionModeClient, 
  GKSessionModePeer, 
  } GKSessionMode; 
  ConnectionStates 
  typedef enum { 
  GKPeerStateAvailable, 
  GKPeerStateUnavailable, 
  GKPeerStateConnected, 
  GKPeerStateDisconnected, 
  GKPeerStateConnecting  } GKPeerConnectionState;    GKSessionClassReference   - (void)peerPickerController:(GKPeerPickerController *)picker  didSelectConnectionType:(GKPeerPickerConnectionTyp e)type {      if(type == GKPeerPickerConnectionTypeOnline) {          [picker dismiss];          [picker autorelease];  // Display your own user interface here.  }    蓝牙联机涉及到的8个方法:
  1,show picker
  // show the Peer Picker
  -(void)startPicker 
  2,//user did cancel 
  - (void)peerPickerControllerDidCancel:(GKPeerPickerController *)picker 
  3,//Provide session id
  - (GKSession *)peerPickerController:(GKPeerPickerController *)picker sessionForConnectionType:(GKPeerPickerConnectionType)type { 
  GKSession *session = [[GKSession alloc] initWithSessionID:kTankSessionID displayName:nilsessionMode:GKSessionModePeer]; 
  return [session autorelease]; // peer picker retains a reference, so autorelease ours so we don't leak.
  }
  4,// dismiss the picker
  - (void)peerPickerController:(GKPeerPickerController *)picker didConnectPeer:(NSString *)peerID toSession:(GKSession *)session { 
  5,// invalidate session
  - (void)invalidateSession:(GKSession *)session {
  6,//receive data
  - (void)receiveData:(NSData *)data fromPeer:(NSString *)peer inSession:(GKSession *)session context:(void*)context { 
  }
  7,//send packet
  - (void)sendNetworkPacket:(GKSession *)session packetID:(int)packetID withData:(void *)data ofLength:(int)length reliable:(BOOL)howtosend {
  8,// we've gotten a state change in the session
  - (void)session:(GKSession *)session peer:(NSString *)peerID didChangeState:(GKPeerConnectionState)state { 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics