Fork me on GitHub

[转]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的专栏

posted @ 2013-05-23 15:07  木狼君  阅读(210)  评论(0编辑  收藏  举报