基于蓝牙对等网络通信就是使用Game Kit中的GKSession、GKSessionDelegate、 GKPeerPickerController和GKPeerPickerControllerDelegate来实现。开发过程分为3个步骤:连接、发 送数据和接收数据。
专注于为中小企业提供成都做网站、成都网站建设服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业青龙免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了1000多家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。下面我们通过一个实例介绍一下基于蓝牙对等网络通信过程。用户点击“连接”按钮,建立连接过程中会出现连接对话框,根据具体情况也会弹出其它的对话 框。这些都是针对蓝牙对等网络标准对话框,而Wifi对等网络没有标准对话框可以使用,需要开发者自己实现。当两个设备连接好之后,两个玩家就可以连续轻 点“点击”按钮,点击的次数会传递给对方,倒计时时间是30秒。
1、连接
由于对等网络连接过程有点复杂,贯穿了这些协议和类,我们绘制了连接过程的流程图。
下面我们通过代码直接介绍连接流程,其中ViewController.h代码如下:
- #import
- #import
- #define GAMING 0 //游戏进行中
- #define GAMED 1 //游戏结束
- //清除UI画面上的数据
- void
- //更新计时器
- void
使用Game Kit需要引入头文件
ViewController.m中创建GKPeerPickerController对象的代码如下:
- - (IBAction)connect:(id)sender {
用户点击的连接按钮时,触发connect:方法。在该方法中创建GKPeerPickerController对象。创建完成不要忘记设置 GKPeerPickerController委托为self,第②行代码所示。在第③行代码中connectionTypesMask属性是设置对等网 络连接类型,其中有两种类型选择:GKPeerPickerConnectionTypeNearby和 GKPeerPickerConnectionTypeOnline,GKPeerPickerConnectionTypeNearby用于蓝牙通讯也 是默认的通讯方法,GKPeerPickerConnectionTypeOnline用于Wifi通讯的局域网通讯,这种方式麻烦,需要开发人员自己设 计UI画面,自己使用Bonjour服务发现管理连接,以及自己编写输入输出流实现通讯。如果给用户一个选择对话框,代码可以如下编写:
_picker.connectionTypesMask = GKPeerPickerConnectionTypeNearby | GKPeerPickerConnectionTypeOnline;
其中“在线”就是GKPeerPickerConnectionTypeOnline类型,“附近”就是GKPeerPickerConnectionTypeNearby类型。
连接成功之后回调ViewController.m中的回调委托方法peerPickerController:didConnectPeer:toSession:代码:
- - (void
- "断开连接"
- //开始计时
上述代码第①行_session = session将委托方法中返回的会话参数赋值给成员变量,这样我们就获得了一个会话对象。这种方式中,会话 ID是应用程序的包ID,如果想自己分配会话ID,可以实现下面委托方法,在方法中使用GKSession的构造方法 initWithSessionID:displayName: sessionMode:,自己创建会话对象。
- - (GKSession *)peerPickerController:(GKPeerPickerController *)picker
- return
有的时候会话的状态会发生变化,我们要根据状态的变化做一些UI的清理和资源的释放。监测状态变化在委托方法session:peer:didChangeState:中实现,方法代码如下:
- - (void
- if
- "断开连接"
- elseif
其中GKPeerStateConnected常量是已经连接状态,GKPeerStateDisconnected常量是断开连接状态。
2、发送数据
发送数据的代码如下:
- - (IBAction)onClick:(id)sender {
- int
- "%i"
- "{\"code\":%i,\"count\":%i}"
- if
3、接收数据
为了接收数据首先需要在设置会话时候通过[_session setDataReceiveHandler:self withContext:nil]语句设置接收数据的处理程序是self。这样当数据到达时候就会触发下面的方法特定:
- - (void
- void
- "code"
- if
- "count"
- "%@"
- elseif
上面的代码是接收到数据之后,进行JSON解码,取出游戏状态和点击次数。
主要的程序代码就是这些,根据具体的业务情况还可以能有所变化,读者可以下载完整代码在两台之间设备或是一个设备一个模拟器之间进行测试。
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。