Core蓝牙入门

核心蓝牙

核心蓝牙是Apple提供的iOS框架,允许使用低功耗蓝牙技术开发应用程序。 该框架抽象了Bluetooth LE内部工作的一些技术方面,使开发人员可以专注于其实际使用。

中央x外围设备

蓝牙LE标准中的通信由两个主要角色构成:中央和外围设备。

外围设备是提供信息的元素:在客户端-服务器方法中,将是谁拥有其他设备所需的信息。

中央利用外围设备提供的信息来运行其任务,如下所示:

为了使中央可以看到外围设备,它发送广告数据包,指示其存在并将传输数据。 该数据包的尺寸很小,仅包含基本信息,例如外围设备的名称和所传送数据的类型。 中心进行扫描,换句话说,它“侦听” BLE广告数据包,以决定是否应从特定设备读取数据。

设备可以具有各种不同的服务,而不仅限于发送一种类型的信息。 温控器可以发送其实际温度及其最近的每小时读数。

外围设备提供的每个服务可以具有许多信息类型,称为特征:

如前所述,由于性能原因,广告包故意很小,它们没有列出外围设备可用的所有功能和信息。 由中心来询问外围设备具有的服务和特性的列表。

这些特征可以分为3种类型:读取,写入或通知。 在此示例中,我们将使用可写特征将数据发送到外围设备,而不仅仅是从外围设备读取信息。 这将颠覆我们先前将外围设备视为服务器而将中央设备视为客户端的概念,但将向您展示事物的灵活性。

让我们在Pratice中看到它

首先,创建一个新的单视图项目:

给它一个名称和项目的包ID,在下一个屏幕上选择“在Mac上创建Git存储库”,到此为止。

使用以下属性创建一个名为Constants.swift的新swift文件:

您可以在终端上使用命令“ uuidgen”创建一个UUID。 Core Bluetooth将使用此标识符来快速有效地找到您的服务。

为了简单起见,我们将有两个视图控制器,一个用于发送数据(外围),另一个用于获取数据(中心)。 您可以通过更改Main.storyboard中的视图控制器基类来选择要在每个设备上运行的设备。

PeripheralViewController(接收器)

在项目中添加一个名为PeripheralViewController.swift的新视图控制器。 在UIKit语句下,将Core Bluetooth导入其中:

另外,创建一个名为peripheralManager的属性来保存CBPeripheralManager的实例,并在viewDidLoad下对其进行初始化。

核心蓝牙几乎可以使用了。 为了能够处理外围设备响应(并停止XCode的警告消息),请将其添加到PeripheralViewController.swift文件的末尾:

我们的代码仅应在用户打开蓝牙无线电时运行。 外围设备管理器代表有一种方法,该方法在每次蓝牙状态更改时运行。 将其添加到最近创建的扩展中:

现在,当状态更改为开机时,很好地打印一条消息并调用一个名为startAdvertising()的方法,如下所示:

startAdvertising()最初调用createPeripheralService(),后者创建一个可写服务以用于接收消息,该消息将由另一台设备的中央设备写入。 外围设备管理器收到写调用时,将触发didReceiveWrite委托:

CentralViewController(发送方)

在项目中添加一个名为CentralViewController.swift的新视图控制器。 在UIKit语句下,将Core Bluetooth导入其中:

另外,创建一个名为centralManager的属性来保存CBCentralManager的实例,并在viewDidLoad下对其进行初始化。 我们需要一个集合来保存对我们发现的外围设备的引用,因为如果Core Bluetooth没有强大的引用,它们会自动取消分配它们。

在外围示例之后,在CentralViewController.swift的末尾添加此扩展名:

这次,当蓝牙状态更改为打开时,中央管理器将开始使用与外围设备管理器中使用的SERVICE_UUID相同的外围设备进行扫描。 这样,中心将仅扫描具有该特定服务的设备,而不扫描附近所有可用的蓝牙设备,这将导致不必要的电池消耗。

当中心发现一个新的外围设备时,它将其添加到我们的createdPeripherals集合中并尝试连接到它:

之后,如果外围设备已连接,我们将尝试发现其服务,并出于与发现外围设备相同的原因指定SERVICE_UUID。 我们还将CentralViewController设置为新发现的外围设备的委托,以从中接收回调。

对于最后一部分,将此另一个扩展添加到CentralViewController.swift的末尾:

找到服务后,我们将尝试通过在Constants.swift中找到的RX_UUID来找到其特征。 找到特征后,我们将测试它是否可写(以防万一),并可以在其中写入任何消息或数据,如示例中所示。 该消息可以动态地来自UITextField,并且您可以轻松启动Bluetooth聊天应用程序😉

包起来

本文只是对该主题的超薄介绍。 如果您想了解更多信息,请访问以下网址的《核心蓝牙编程指南》:https://developer.apple.com/library/content/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/AboutCoreBluetooth/Introduction.html

Core Bluetooth可能非常有用且易于使用,但其起始曲线不是很平滑。 希望这项工作能为您提供深入的简单指南。 可以在以下位置找到该完整项目:https://github.com/marcosxray/bledemo

我还有一个名为BTMesh的实验项目,该项目通过Bluetooth Low Energy创建了一个网状网络。 BTMesh是一个抽象上述概念的框架,从而使使用BLE开发应用程序变得非常容易。 这项工作仍在进行中,但由于它是开源软件,因此欢迎对其进行测试并为您提供帮助。 可以在以下位置找到该代码:https://github.com/marcosxray/BTMesh