[转]iPhone开发:蓝牙项目总结
连接的相关数据传送,需要从两个(或两个以上的)角度来进行设计和思考服务端和客户端(或者称为接收数据端和发送端来思考更合适,虽然两端都包含数据接收和发送两种思想,但设计的时候分开想好了再来写容易些),不管是蓝牙联还是通过网络服务器实现多人联,程序的构架思想是一样的。
(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) id<GKPeerPickerControllerDelegate>delegate
该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 << 0,
GKPeerPickerConnectionTypeNearby = 1 << 1
}
typedef NSUInteger GKPeerPickerConnectionType;
Constants
GKPeerPickerConnectionTypeOnline
在GKPeerPickerController.h.GKPeerPickerConnectionTypeNearby文件里定义
蓝牙连接到另外一个设备
GKSession类参考
继承于NSObject
Framework:GameKit
定义: GKSession.h里定义
相关参考代码 GKTank
概要:
一个GKSession object给iPhone提供用蓝牙发现和连接到附近iPhones上的能力。
Sessions基本靠peers来工作。一个peer能在iPhone上通过生成和设置GKSession object可见。每个peer通过独一无二的id来识别,叫做peerID string。你的app能够用一个peerID string来获得一个用户可读的名字,作为一个扩展点来试着连接一个peer。类似的,你的session peerID是可以被附近其他点识别的。一旦一个连接证实有效,你的app会用peerID来确定想要发送的数据包的对象。
peers通过用unique string来确认他们发现的session ID。Sessons能够设置成的session ID(作为服务器)另一个ID成client。
你的app控制session行为,通过一个GKSessionDelegate协议的delegate。当远程peer发现后,该delegate方法会被被调用,当这些peers试图连上session,而且当远程peer发生变化时候也会被调用。
你的程序也提供一个数据包到session那,以便session能从远程peers转化。数据能被一个单独的object处理或者作为代理的一个相同object处理。
GKSession类参考
Tasks
生成一个session
-initWithSessionID:displayName:sessionMode:
初始化和返回一个新的分配空间
设置和获得delegate
delegate属性
session object的delegate
搜索其他peers
available属性
一个boolean值决定session是否想要连接到新的peers
获得关于其他peers的信息
-peersWithConnectionState:
-displayNameForPeer:
连接到一个远程peer
-connectToPeer:withTimeout:
-cancelConnectToPeer:
接受远程peer连接
-acceptConnectionFromPeer: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
Modesthatdeterminehowasessioninteractswithotherpeers.
typedef enum {
GKSessionModeServer,
GKSessionModeClient,
GKSessionModePeer,
} GKSessionMode;
ConnectionStates
typedef enum {
GKPeerStateAvailable,
GKPeerStateUnavailable,
GKPeerStateConnected,
GKPeerStateDisconnected,
GKPeerStateConnecting
} GKPeerConnectionState;
GKSessionClassReference
- (void)peerPickerController:(GKPeerPickerController *)picker
didSelectConnectionType:(GKPeerPickerConnectionType)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 = [[GKSessionalloc] initWithSessionID:kTankSessionIDdisplayName: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 {
转载自:ctsnowcold的专栏