Core Bluetooth框架可让我们的 iOS 和 Mac 应用与低功耗蓝牙设备进行通信。例如,你的应用可以发现、探索低能耗外围设备(如心率监测器、数字恒温器,甚至其他 iOS 设备)并与之交互。
该框架是蓝牙 4.0 规范的抽象,用于低功耗设备。也就是说,它对我们(开发人员)隐藏了规范的许多底层细节,使我们可以更轻松地开发与低功耗蓝牙设备交互的应用程序。由于该框架基于规范,因此采用了规范中的一些概念和术语。本章向我们介绍开始使用Core Bluetooth框架开发出色应用时需要了解的关键术语和概念。
重要提示:在 iOS 10.0 上或之后链接的 iOS 应用必须在其 Info.plist 文件中包含它需要访问的数据类型的使用说明键,否则它将崩溃。要专门访问蓝牙外设数据,它必须包括 NSBluetooth外围设备使用说明。
所有低功耗蓝牙通信都涉及两个主要参与者:中央和外围设备。基于某种传统的客户端-服务器体系结构,外围设备通常具有其他设备所需的数据。中央通常使用外围设备提供的信息来完成某些特定任务。例如,如图 1-1 所示,心率监测器可能包含我们的 Mac 或 iOS 应用程序可能需要的有用信息,以便以用户友好的方式显示用户的心率。
图1-1 中央及外围设备
外围设备以广播包的形式广播它们拥有的一些数据。广播数据包是一个相对较小的数据包,可能包含有关外设必须提供的内容的有用信息,例如外设的名称和主要功能。例如,数字恒温器可能会宣传它提供房间的当前温度。在低功耗蓝牙中,广播是外围设备宣传其存在的主要方式。
另一方面,中心可以扫描和侦听任何外围设备,这些外围设备正在宣传它感兴趣的信息,如图 1-2 所示。中心可以要求连接到它发现广播的任何外围设备。
图1-2 广播和发现
连接到外围设备的目的是开始探索它必须提供的数据并与之交互。但是,在执行此操作之前,了解外围设备的数据的结构方式会有所帮助。
外设可能包含一个或多个服务,或提供有关其连接信号强度的有用信息。服务是用于完成设备(或该设备的某些部分)的功能或特性的数据和相关行为的集合。例如,心率监测器的一项服务可能是从监测器的心率传感器公开心率数据。
服务本身由特征或包含的服务(即对其他服务的引用)组成。特征提供有关外围设备服务的更多详细信息。例如,刚才描述的心率服务可能包含一个描述设备心率传感器预期身体位置的特征和另一个传输心率测量数据的特征。图 1-3 说明了心率监测器服务和特性的一种可能结构。
在中心成功建立与外围设备的连接后,它可以发现外围设备必须提供的全部服务和特征(广播数据可能只包含可用服务的一小部分)。
中心还可以通过读取或写入外围设备特征的值来与外围设备的服务进行交互。例如,你的应用可能会从数字恒温器请求当前室温,或者它可以为恒温器提供一个值来设置室温。
低功耗蓝牙通信中涉及的主要参与者和数据以简单、直接的方式映射到酷睿蓝牙框架上。
当我们使用本地中心与远程外设交互时,我们将在蓝牙低功耗通信的中央端执行操作。除非我们设置本地外围设备并使用它来响应中心的请求,否则我们的大部分蓝牙交易都将在中央端进行。
有关如何在应用中实现中心角色的信息,请参阅执行常见的中心角色任务和与远程外围设备交互的最佳做法
在中央端,本地中央设备由 CBCentralManager 对象表示。这些对象用于管理发现或连接的远程外围设备(由 CBPeripheral 对象表示),包括扫描、发现和连接到广播外围设备。图 1-4 显示了如何在核心蓝牙框架中表示本地中央和远程外设。
图 1-4 中央侧的核心蓝牙对象
远程外设的数据由 CBService 和 CBCharacteristic 对象表示
当我们与远程外设(由 CBPeripheral 对象表示)上的数据进行交互时,我们正在处理其服务和特征。在核心蓝牙框架中,远程外围设备的服务由 CBService 对象表示。同样,远程外围设备服务的特征由 CBCharacteristic 对象表示。图 1-5 说明了远程外设服务和特性的基本结构。
图 1-5 远程外设的服务和特征树
从 macOS 10.9 和 iOS 6 开始,Mac 和 iOS 设备可以用作低功耗蓝牙外围设备,为其他设备(包括其他 Mac、iPhone 和 iPad 设备)提供数据。设置设备以实现外围角色时,我们将在低功耗蓝牙通信的外围端执行操作。
在外设端,本地外设由CBPeripheralManager对象表示。这些对象用于管理本地外围设备的服务和特征数据库中的已发布服务,并将这些服务通告到远程中央设备(由 CBCentral 对象表示)。外围管理器对象还用于响应来自这些远程中心的读取和写入请求。图 1-6 显示了本地外设和远程中心在核心蓝牙框架中的表示方式。
图1-6 外设侧的核心蓝牙对象
当我们在本地外围设备(由 CBPeripheralManager 对象表示)上设置数据并与之交互时,我们正在处理其服务和特征的可变版本。在核心蓝牙框架中,本地外设的服务由CBMutableService对象表示。同样,本地外围设备服务的特征由 CBMutableSignature 对象表示。图 1-7 说明了本地外围设备的服务和特征的基本结构。
图 1-7 本地外设的服务和特征树