蓝牙

来源:互联网 发布:淘宝买家版 编辑:程序博客网 时间:2024/05/01 22:23

iphone 蓝牙开发 总结  

你看看GAME KIT框架里面的GKPeerPickerController、GKSession,通过这两个类我们可以将两台iPhone使用蓝牙给连接起来并使相互之间可以发送/接收消息.
GKPeerPickerController:提供一套系统界面最终使多台设备之间的蓝牙连接起来,如果机器未开启蓝牙功能时,会提示是否要打开蓝牙功能.最终我们将通过一个回调函数
- (void)peerPickerController:(GKPeerPickerController *)picker didConnectPeer:(NSString *)peerID toSession:(GKSession *)session;
来得到与某个蓝牙连接成功事件.
GKSession:提供将多个蓝牙连接在一起之后的会话处理,如发送消息,接收消息,某个蓝牙设备断开等.
连接过程:
1.    GKPeerPickerController建立蓝牙连接界面
2.    peerPickerController(sessionForConnectionType) 回调获取GKSession的实体
3.    GKSession alloc建立一个自定义的GKSession(可以设置sessionID与type:s/c/peer)
4.    peerPickerController(didConnectPeer)一个设备连接成功的通知
5.    session(didChangeState=GKPeerStateConnected)一个设备加入到session的通知
发送与接收:
•    GKSession sendData通过这个函数来发送数据给指定的peer(可以是多个)
•    GKSessionDelegate receiveData通过这个回调函数来接收其它peer发送过来的数据


蓝牙联机总结

连接的相关数据传送,需要从两个(或两个以上的)角度来进行设计和思考服务端和客户端(或者称为接收数据端和发送端来思考更合适,虽然两端都包含数据接收和发送两种思想,但设计的时候分开想好了再来写容易些),不管是蓝牙联还是通过网络服务器实现多人联,程序的构架思想是一样的。

 

(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 = [[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 { 


原文http://blog.csdn.net/ctsnowcold/article/details/5029944

原创粉丝点击