『CoreBluetooth』1. 初识

公司做玩具的,很多地方需要和硬件通信,这个项目用到的是蓝牙,先开一个坑,以后再继续介绍其他的通信方式。

刚开始接触通信真是完全懵逼了好吗…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/

在看完整个官方文档之后,受益匪浅,这个系列的其他文章列表:

CoreBluetooth2 作为 Central 时的数据读写
CoreBluetooth3 作为 Central 时的数据读写(补充)
CoreBluetooth4 作为 Central 时的数据读写(最佳实践)
CoreBluetooth5 作为 Central 时的数据读写(OTA 固件升级与文件传输)
CoreBluetooth6 作为 Peripheral 时的请求响应
CoreBluetooth7 作为 Peripheral 时的请求响应(最佳实践)
CoreBluetooth8 后台运行蓝牙服务

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 打交道,这两个分别由CBServiceCBCharacteristic表示。

一个 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,分别由CBMutableServiceCBMutableCharacteristic表示。

下图则是在设备 peripheral 时,相关类的关系:

之后还会讲到更多的关于 central 和 peripheral 的细节。

《『CoreBluetooth』1. 初识》有10个想法

      1. 文中”service 本身又是由 characteristic 或者其他 service 组成的。characteristic 又提供了更为详细的 service 信息”这句话,前半句意思是characteristic还可以由service组成不是吗??? 后半句的意思是characteristic 提供的就是 service 信息.

        1. 前半句:service 可以包含 service 或者 characteristic。
          后半句:service 本身的信息很少,更为详细的 service 信息意思就是,它里面包含哪些 characteristic,然后 characteristic 的信息就作为 service 信息的补充。

  1. 麻烦问下连接蓝牙设备后弹出的系统配对框,手机端能不能控制呢,或者获取这个Alert的用户行为…
    现在做的蓝牙项目,如果用户不点击配对,只能是伪连接,影响后续的操作….

发表评论

电子邮件地址不会被公开。