在 iOS 中,蓝牙是基于 4.0 标准的,设备间低功耗通信。

其中 Peripheral 外设相当于 Socket 编程中的 Server 服务端,Central 中心相当于 Client 客户端。

本地中心 -> 远程外设
本地外设 -> 远程中心

使用流程:
建立中心角色 —> 扫描外设(discover)—> 发现外设后连接外(connect) —> 扫描外设中的服务和特征(discover) —> 与外设做数据交互(explore and interact) —> 断开连接(disconnect)。

1. 建立中心角色

上面的 delegate 为 CBCentralManagerDelegate,后续蓝牙相关的回调都会在此。

queue 代表蓝牙在哪个队列里面操作,如果传入 nil 默认为主队列,值得注意的是后续的回调也是在传入的队列中调用的,所以如果传入的是非主线程的队列,在 delegate 中需要操作 UI 时需要手动切换到主线程。

CBCentralManager 对象创建后会回调到 centralManagerDidUpdateState 方法来检测蓝牙可用状态,这时我们可以提醒用户设备是否支持蓝牙,是否打开了蓝牙。

2. 扫描外设

如果 serviceUUIDS 为 nil 则会扫描周围所有的设外设,反之只会扫描 UUID 匹配的外设。

CBCentralManagerScanOptionAllowDuplicatesKey 默认为 false,此次扫描中发现过设备则跳过不回调,我们这里传入 true,因为下面做外设掉线的处理时需要用到。

传入的 serviceUUIDS 数组元素为 CBUUID 类型,千万不要传入 String,后面的操作也是如此,不然会碰到很多奇葩问题。

发现外设后会回调到 centralManager(central:didDiscoverPeripheral:advertisementData:RSSI:)其中,perpheral 则代表着外设,我们需要保存起来,后续的对外设的操作都是基于 perpheral对象的。

3. 连接外设

传入上面保存的外设对象,如果连接失败后会回调到centralManager(central:didFailToConnectPeripheral:,error:),连接成功后会回调到 centralManager(central:didConnectPeripheral:),这个时候我们只是连接上外设而已,还需要发现外设中的服务与特征。

4. 发现服务与特征

5. 发送数据

6. 读取数据

7. 断开连接

在蓝牙交互的二种角色中,通常 APP 端扮演中央 Central 的角色,设备扮演外设 Peripheral 的角色创建 CBCentralManager 对象时传入的 queue 决定了后续 CBCentralManagerDelegate、CBPeripheralDelegate 等回调的所在线程一个外设设备可包含一个或多个服务,一个服务可包含一个或多个特征,读写操作最终是针对特征。

蓝牙的缓冲大小只有 20bytes,在发送数据时最多只能发送 20bytes,所以得分多次发送,数据的一体性可以用 EOM 标识符表标识。

iOS面试 - 蓝牙的基本使用相关推荐

  1. iOS面试准备 - ios篇

    iOS面试准备 - ios篇 ios面试准备 - objective-c篇 ios面试准备 - 网络篇 IOS面试准备 - C++篇 iOS面试准备 - 其他篇 运行时 https://juejin. ...

  2. 关于IOS的蓝牙(转)

    关于IOS的蓝牙 首先,你要了解你的目的是什么,一般的IOS蓝牙开发有以下三种目的: 1. IOS设备和IOS设备之间交互 好消息是:ios6.0可以把iPhone手机当从设备了,可以两台iPhone ...

  3. 「iOS 面试之道」勘误(二)

    本文是「iOS 面试之道」勘误系列的第二篇. Swift 初始化方法描述的漏洞 书中 105 页的描述是:Swift 初始化方法必须保证所有非 Optional 的成员变量都完成初始化. 这个表述是不 ...

  4. android 无appid分享_App ID 和Bundle ID 有什么不同?ios面试攻克篇(六)

    '写在前面的话' 这些是我对iOS面试时会碰到的问题的解决方法,整理出来分享给大家,有些错误不要 笑了,希望对大家有所帮助.大家有更好的解决办法也欢迎沟通交流. 一直以来都有写点儿东西的想法,就从笔记 ...

  5. ios kvo 要引入_腾讯社招iOS面试记录

    毕业好几年了,上周发送了简历给腾讯,参加了腾讯面试.具体部门这边就不说了.这次面试还是收获到了很多. 一面电话面试: 面试官主要是针对iOS相关的基础问题. 先简单自我介绍一下自己 对mrc和arc的 ...

  6. iOS面试中经常问的点 - RunTime

    一. RunTime简介 我将iOS的一些学习视频书籍资料总结在"码农Style"公众号里,需要的小伙伴可以自行获取 想要一起探讨学习iOS底层原理,架构的可以加我Q_233668 ...

  7. 分割view窗口不响应onmousewheel_什么是响应者链?ios面试攻克篇(三)

    '写在前面的话' 这些是我对iOS面试时会碰到的问题的解决方法, 整理出来分享给大家,有些错误不要 太好笑,希望对大家有所帮助. 大家有更好的解决办法也欢迎沟通交流. 一直以来都有写点儿东西的想法, ...

  8. [转] 上级向的十个iOS面试问题

    上级向的十个iOS面试问题 转自 http://onevcat.com/2013/04/ios-interview/ 不管对于招聘和应聘来说,面试都是很重要的一个环节,特别对于开发者来说,面试中的技术 ...

  9. 最新iOS面试必看题视频教程(附大神简历要素)

    2019独角兽企业重金招聘Python工程师标准>>> 本文是由尚学堂iOS学院总结的ios开发者在求职时会遇到的一些面试题 ,并通过实际代码演练将课程详尽的讲解出来,希望对学习io ...

最新文章

  1. 第八届“数学、计算机与生命科学交叉研究” 青年学者云论坛(5月15日9:00-16:40)...
  2. oracle em登陆不了,账户密码过期
  3. 【Paper】An Experiment Comparing Double Exponential Smoothing and Kalman Filter-Based Predict
  4. COMPUTER HARDWARE OPENCART 主题模板 ABC-0059
  5. LDAP之三:利用开源框架LDAPTemplate和JLDAP访问LDAP
  6. artTemplate模板引擎的源码拜读
  7. CSDN - 屏蔽百度广告
  8. win10开启文件共享服务器,墨涩网 - Windows10开启局域网文件共享功能——墨涩网...
  9. 如何在软件里显示编译时间
  10. 串级控制系统的计算机控制原理图,串级PID控制原理
  11. USB调试助手功能完善
  12. 国产linux操作系统深度系统20.3发布(推荐)
  13. 2022年SCI期刊最新影响因子正式发布
  14. Python 伪开发者对于搜狐云景的测评
  15. mybatis百度云盘分享
  16. 百分号编码和汉字的转换
  17. 搞定动画之 JQuery 中的自定义动画
  18. 安徽省支持科技创新政策通知,兑现项目奖补详情
  19. matlab等于本身是什么命令,matlab中的m=size是什么意思
  20. How to access SMTP/POP server using telnet - 用 Telnet 如何访问邮件服务器

热门文章

  1. 固态硬盘win7优化指南:九个Win7固态硬盘优化方法
  2. NOI网站OpenJudge1.4.1判断数正负
  3. 奇怪的知识增加了!声呐图像的成像原理及目标检测baseline
  4. 企业数字化转型之道--数字信号与模拟信号的区别
  5. F28335_ECAP使用
  6. PHP——你应该知道的面试题
  7. 图片怎样优化的8个小技巧
  8. 帝国理工学院的计算机专业怎样,帝国理工学院计算机专业介绍
  9. Excel基本操作常用总结
  10. java 计算时差_如何在Java中计算时差?