蓝牙对战

MultipeerConnectivity框架的使用

MultipeerConnectivity通过WiFi、P2P WiFi以及蓝牙个人局域网进行通信的框架,从而无需联网手机间就能传递消息。其原理是通过广播作为服务器去发现附近的节点,每个节点都以设备名称为标识。

   myPeer = MCPeerID.init(displayName: UIDevice.current.name)session = MCSession.init(peer: myPeer!, securityIdentity: nil, encryptionPreference: .none)session?.delegate = self

MCSession的几个代理方法必须实现,否则无法建立连接

    //监听连接状态func session(_ session: MCSession, peer peerID: MCPeerID, didChange state: MCSessionState) {switch state {case .notConnected:print("未连接")case .connecting:print("正在连接中")case .connected:print("连接成功")}}//发送Dada数据func sendData(_ messageVo: GPBMessage, successBlock:(()->())?,errorBlock:((NSError)->())?) {guard let session = session else {return}guard let data = NSDataTool.shareInstance().returnData(messageVo, messageId: 0) else {return}do {try session.send(data as Data , toPeers: session.connectedPeers, with: .reliable)}catch let error as NSError {errorBlock?(error)return}successBlock?()}//接收到的Data数据func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID) {// 解析出过来的data数据包NSDataTool.shareInstance().startParse(data) { (gpbMessage) inself.getMessageBlock?(gpbMessage)}}//接收到的流数据func session(_ session: MCSession, didReceive stream: InputStream, withName streamName: String, fromPeer peerID: MCPeerID) {print("streamName")}//接收到的文件类型数据func session(_ session: MCSession, didStartReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, with progress: Progress) {print("resourceName")}//接收到的文件类型数据,可将文件换路劲func session(_ session: MCSession, didFinishReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, at localURL: URL, withError error: Error?) {}

我们通过MCAdvertiserAssistant(广播)开启搜索服务

    advertiser = MCAdvertiserAssistant.init(serviceType: serviceStr, discoveryInfo: nil, session: session!)//发出广播advertiser?.start()advertiser?.delegate = self

MCBrowserViewControllerDelegate代理方法

 /// 发出广播请求func advertiserAssistantWillPresentInvitation(_ advertiserAssistant: MCAdvertiserAssistant) {print("advertiserAssistantWillPresentInvitation")}/// 结束广播请求func advertiserAssistantDidDismissInvitation(_ advertiserAssistant: MCAdvertiserAssistant) {print("advertiserAssistantDidDismissInvitation")} 

设置蓝牙连接页面,显示效果如图所示:

  func setupBrowserVC() {guard let session = session else {return}browser = MCBrowserViewController.init(serviceType: serviceStr,  session: session)browser?.delegate = self}

实现MCBrowserViewControllerDelegate代理方法

 func browserViewControllerDidFinish(_ browserViewController: MCBrowserViewController) {print("蓝牙连接完成")browser?.dismiss(animated: true, completion: { [weak self] inself?.browserBlock?()})}func browserViewControllerWasCancelled(_ browserViewController: MCBrowserViewController) {print("取消蓝牙连接")browser?.dismiss(animated: true, completion: nil)}

小结

使用蓝牙技术进行传输数据,尽管不需要连接网络服务,但是真实因为这样存在着许多安全隐患,为此我们引入Google Protobuf框架进行数据传输。下一篇文章会对该技术的运用进行详解。

最后

代码具体实现地址
代码中具体实现了两个棋类游戏,包括在线对战,人机对战(算法不错哦),蓝牙对战。
代码编写不易,喜欢的请点赞,谢谢!

ios 蓝牙对战实现相关推荐

  1. iOS简易蓝牙对战五子棋游戏设计思路之一——核心蓝牙通讯类的设计

    iOS简易蓝牙对战五子棋游戏设计思路之一--核心蓝牙通讯类的设计 一.引言 本系列博客将系统的介绍一款蓝牙对战五子棋的开发思路与过程,其中的核心部分有两个,一部分是蓝牙通讯中对战双方信息交互框架的设计 ...

  2. iOS简易蓝牙对战五子棋游戏设计思路之二——核心棋盘逻辑与胜负判定算法

    2019独角兽企业重金招聘Python工程师标准>>> iOS简易蓝牙对战五子棋游戏设计思路之二--核心棋盘逻辑与胜负判定算法 一.引言 上一篇博客我们介绍了在开发一款蓝牙对战五子棋 ...

  3. android蓝牙对战,支持蓝牙对战 跑跑卡丁车登陆Android

    与PC版相同,Android版跑跑卡丁车也分为道具.竞速两种模式,游戏初始玩家仅配备最基础的装备,即皮蛋与平板卡丁车,玩家可以通过游戏成绩来解锁更多的任务以及卡丁车来扩充自己的装备. 遭遇水泡道具 成 ...

  4. iOS蓝牙开发---CoreBluetooth[BLE 4.0] 初级篇[内附Demo地址]

    一.蓝牙基础知识 (一)常见简称 1.MFI  make for ipad ,iphone, itouch 专们为苹果设备制作的设备,开发使用ExternalAccessory 框架(认证流程貌似挺复 ...

  5. iOS蓝牙原生封装,助力智能硬件开发

    代码地址如下: http://www.demodashi.com/demo/12010.html 人工智能自1956年提出以来,一直默默无闻,近年来人工智能的发展得到重视逐渐发展起步,智能硬件.智能手 ...

  6. iOS蓝牙BLE4.0通信功能

    概述 iOS蓝牙BLE4.0通信功能,最近刚学的苹果,为了实现蓝牙门锁的项目,找了一天学习了下蓝牙的原理,亲手测试了一次蓝牙的通信功能,结果成功了,那么就把我学习的东西分享一下. 详细 代码下载:ht ...

  7. iOS 蓝牙开发 BabyBluetooth蓝牙库介绍

    BabyBluetooth 是一个最简单易用的蓝牙库,基于CoreBluetooth的封装,并兼容iOS和Mac OS X. 特色: 基于原生CoreBluetooth框架封装的轻量级的开源库,可以帮 ...

  8. 今日分享-ios蓝牙

    1. ios蓝牙库的基本介绍-CoreBluetooth 2. CoreBluetooth使用详解 3. 相关问题 1. ios蓝牙库的基本介绍-CoreBluetooth 首先熟悉相关名词:Cent ...

  9. iOS - 蓝牙开门智能门锁

    蓝牙的实现原理网上很多 在此就不一一描述了 有需要的可以看以下的文章学习 在ios 的开发中iBeacon和BLE的区别 iBeacon介绍 iOS蓝牙空中升级(固件升级) 本文主要是写实现过程: g ...

最新文章

  1. suse linux不能识别u盘,SUSE Linux mount u盘
  2. pandas.Series.multiply()含义解释
  3. java多线程------实现Runnable接口创建多进程,实现资源共享
  4. 岗位内推 | 微软亚洲互联网工程院自然语言处理组招聘算法研究实习生
  5. 云原生数据库_数据标签竞赛云原生地理空间冲刺
  6. linux 文件理解,对linux中文件系统的理解
  7. 没有光驱怎样从硬盘上安装Windows XP系统
  8. Visio中图进行任意区域进行颜色填充
  9. python基于svm的异常检测_[scikit learn]:异常检测-OneClassSVM的替代方案
  10. hashmap put过程_面试官:HashMap 为什么线程不安全?
  11. PS网页设计教程——小贴士:在PS中创建复古的页面
  12. C语言文件读写操作总结
  13. php 不返回 数据,php – file_get_contents没有返回任何数据
  14. PXE工作流程(PXE启动报错处理)
  15. 未来杯总结1--cuda8.0+cuDnnv6+anavonda+tensorflow-gpu+keras+ubuntu16.04
  16. windows phone8.1开发书籍,教程,资源汇总
  17. 想要学习丙烯画,这些地方要注意了~
  18. vue前端进阶之SSR篇 --- 搭建简单的SSR框架
  19. office2016安装失败,或者需要卸载,如何彻底卸载
  20. uTorrent 高级设置方法

热门文章

  1. php做网站步骤_php建一个网站步骤
  2. 《程序员》2012年2期精彩内容:大数据
  3. MATLAB中AVP例子学习
  4. HP 5200dtn 打印机错误排错思路
  5. 基于python的步态分析_Python 实现步态能量图
  6. 用Python制作一个动态爱心效果!
  7. POJ3322bloxorz
  8. RK 3229 android 7.0系统修改DDR频率
  9. 完美解决 bash: /dev/fd/63: No such file or directory
  10. SectigoDV通配符证书与OV通配符证书的区别