蓝牙项目实现
蓝牙项目实现
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 {
猜你喜欢
转载自kbk730oe.iteye.com/blog/1359477
今日推荐
周排行