公司做玩具的,很多地方需要和硬件通信,这个项目用到的是蓝牙,先开一个坑,以后再继续介绍其他的通信方式。
刚开始接触通信真是完全懵逼了好吗…Core Audio,Core Bluetooth 什么的完全不熟好吗…其中还涉及很多 Core Image,Core Video,AVFoundation 真是头大啊。学习曲线陡陡的,压力很大大大大…和硬件沟通的时候,一上来就是音频正弦波什么的,只能在旁边“哦哦哦…”。
因为自己是渣,所以就从渣的角度来谈谈 Core Bluetooth 吧。
环境信息:
Mac OS X 10.11.3
iOS 9.2.1
Xcode 7.2.1
Bluetooth 4.0
正文
因为是按照 API 的流程来学习的,所以还是按照 API 的顺序来写吧。文档链接:
https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/AboutCoreBluetooth/Introduction.html #//apple_ref/doc/uid/TP40013257-CH1-SW1
当然,2013年的 WWDC 也讲到了 Core Bluetooth,更早期虽然也讲到了,但是并不建议去学习 API,因为 iOS9 真是弃用了一堆方法啊。WWDC 视频地址:
https://developer.apple.com/videos/play/wwdc2013/703/
Overview
随着可穿戴设备的普及,蓝牙通信也用得越来越多了。常常谈到的 BLE 技术则是 Bluetooth Low Energy 的简称(见名知意…
Central 与 Peripheral
蓝牙通信中,首先需要提到的就是 Central 和 Peripheral 两个概念。这是设备在通信过程中扮演的两种角色。直译过来就是 [中心] 和 [周边(可以理解为外设)] 。iOS 设备既可以作为 Central,也可以作为 Peripheral,这主要取决于通信需求(但不能同时充当两个角色)。官方 API 上举的例子能很容易的帮助我们理解这两个角色。
在和心率监测仪通信的过程中,监测仪作为 Peripheral,iOS 设备作为 Central。区分的方式即是这两个角色的重要特点:提供数据的是谁,谁就是 Peripheral;需要数据的是谁,谁就是 Central。就像是 Client 和 Server 之间的关系一样。
那怎么发现 Peripheral 呢?
在 BLE 中,最常见的就是广播。实际上,Peripheral 在不停的发送广播,希望被 Central 找到。广播的信息中包含它的名字等信息。如果是一个温度调节器,那么广播的信息应该还会包含当前温度什么的。
那么 Central 的作用则是去 scan,找到需要连接的 Peripheral,连接后便可进行通信了。
Peripheral 数据构成
虽然是说通信,但是苹果还是很贴心的先讲解了 Peripheral 的基本构成。因为后面很多的用法都涉及到这个构成,毕竟苹果的命名规范就是已长著称的不是吗。所以,如果了解了构成,那后面的类名真是很容易明白(这也是我不翻译关键词的原因)。
一个 Peripheral 包含一个或多个 Service ,或提供关于信号强度的信息。Service 是数据和相关行为的集合。例如,一个心率监测仪的数据就可能是心率数据。
Service 本身又是由 Characteristic 或者其他 Service 组成的。Characteristic 又提供了更为详细的 Service 信息。还是以心率监测仪为例,Service 可能会包含两个 Characteristic,一个描述当前心率带的位置,一个描述当前心率的数据。
相关类
当 Central 成功连上 Peripheral 后,它便可以获取 Peripheral 提供的所有 Service 和 Characteristic。通过对 Characteristic 的数据进行读写,便可以实现 Central 和 Peripheral 的通信。
设备作为 Central 时
当 Central 和作为外设的 Peripheral 通信时,绝大部分操作都在 Central 这边。此时,Central 被描述为 CBCentralManager
,这个类提供了扫描、寻找、连接 Peripheral (被描述为 CBPeripheral
)的方法。
下图标示了 Central 和 Peripheral 在 Core Bluetooth 中的表示方式:
当你操作 Peripheral 的时候,实际上是在和它的 Service 和 Characteristic 打交道,这两个分别由 CBService
和 CBCharacteristic
表示。
一个 Peripheral 包含多个 Service,而一个 Service 又可以包含多个 Characteristic,所以他们的关系大致可以表示为:
设备作为 Peripheral 时
在 OS X 10.9 和 iOS 6 以后,设备除了能作为 Central 外,还可以作为 Peripheral。也就是说,可以发起数据,而不像以前只能管理数据了。
那么在此时,它被描述为 CBPeripheralManager
,既然是作为 Peripheral,那么这个类提供的主要方法则是对 Service 的管理,同时还兼备着向 Central 广播数据的功能。Peripheral 同样会对 Central 的读写要求做出相应。
下图则是设备作为 Central 和 Peripheral 的示意图:
在充当 Peripheral 时, CBPeripheralManager
处理的是可变的 Service 和 Characteristic,分别由 CBMutableService
和 CBMutableCharacteristic
表示。
下图则是在设备 Peripheral 时,相关类的关系:
之后还会讲到更多的关于 Central 和 Peripheral 的细节。