如何使用Swift 2.2设置BLE

BLE与iPhone配合使用时,需要遵循一个特定的顺序。 Apple的文档被截断了,似乎没有为这些步骤提供清晰的流程。 在线上有摘要,您可以参考其他人的应用程序,但没有任何内容可以解释我所看到的每个步骤中正在发生的事情。 希望这篇文章可以帮助解释它,并避免您遇到与我同样的问题。 与往常一样,有不同的实现方式,所以请让我知道是否存在更有效的处理方式。

步骤1:将CoreBluetooth添加到您的应用程序

首先,为了使用蓝牙,您需要向您的应用程序添加CoreBluetooth库。 要添加CoreBluetooth,您需要选择父Xcode文件。

在“使用库链接二进制文件”部分中,单击“ +”按钮,搜索CoreBluetooth,选择并添加它。

现在,在您的ViewController中,您需要导入CoreBluetooth。 与“导入UIKit”一起添加“导入CoreBluetooth”。

步骤2:利用CoreBluetooth的CBCentral和CBPeripheral

您想从CoreBluetooth中在类中使用CBCentralManagerDelegate和CBPeripheralDelegate协议,因为这将允许您使用委托必须采用的方法,从而可以管理充当蓝牙连接的中心和外围设备的对象。 将CBCentralManagerDelegate和CBPeripheralDelegate添加到“ ViewController”类后,您需要将委托的对象存储在变量中,以便可以调用每个对象的方法。 到目前为止看起来应该像这样:

步骤3:运行CBCentralManager

您的电话将充当中心。 要启动您的中央管理器,您可以将其放置在viewDidLoad()函数中并将其委派给自己。 但是,我将其放置在其自己的功能(“ startManager”)中,以便我们可以控制手机何时启动其顺序,稍后我将对此进行解释。

步骤4:检查BLE是否开启,然后开始扫描

接下来,在我们开始扫描之前,我们需要确保设备的蓝牙电源已打开。 为此,您可以使用预设函数,如果状态已更新,则该函数将被调用并传入CBCentralManager对象。 一旦确定它已开机,就可以调用该函数以开始扫描(scanForPeripheralsWithServices)。

步骤5:找到您的BLE设备并连接到它

要查看所有可用的设备(外围设备),您可以使用didDiscoverPeripheral监听发现的外围设备。 如果这样,它将返回可以存储的每个外围对象。 与其存储每台设备,我只专注于我想要的设备。 找到后,您应该将该外围设备保存到变量中,以备后用。 要连接到发现的外围设备,可以使用centralManager的connectPeripheral方法并引用外围设备。 我添加了该选项以通知我是否断开连接。

连接后,您将要停止扫描。 添加CentralManager侦听器didDisconnectPeripheral非常重要,这样如果断开连接就可以重新启动扫描(这就是为什么我将开始扫描分为一个单独的函数)。

步骤6:获取服务,特征并向设备发送价值

连接到外围设备后,即可找到其服务和特性。 对于外围设备,可以有很多服务,对于服务可以有很多特征。 如果要在BLE设备上写一个值或进行任何更改,则需要确保您正在写正确的服务或特性。 对于我想做的事情,我需要写出我们在BLE设备上拥有的服务的特定特征。 因此,现在使用的是保存的外围对象中的功能,而不是使用centralManager对象中的功能。 要找到服务,您可以在连接后调用discoverServices。 然后,查看didDiscoverServices侦听的外围设备上的服务。

发现后,您可以在该服务上调用discoverCharacteristics。 进行didDiscoverCharacteristicsForService侦听后,将与特征对象一起返回。 我循环浏览这些特征以找到所需的特征,然后可以将其保存在变量中以供以后写入。 在下面,我立即将其写入特征,但在完整的应用程序中将其保存并稍后使用。 要写入外设,您可以在外设对象上调用方法writeValue并传入编码后的值,并调出要写入的特征。

奖励:RSSI

对于我想与该应用程序一起做的事情,我想大致了解一下我离该设备有多远,外围设备的RSSI读取非常适合。 Apple已弃用RSSI功能,因此您需要创建解决方法。 为此,我使用了一个计时器(如果您找到更好的方法来处理此问题,请告诉我)。 当您找到外围设备时,它将为您提供一次RSSI;当您连接到外围设备时,它将再次为您提供RSSI。 为了保持流式传输,您需要继续调用相同的函数。 要读取RSSI,可以在外围对象上调用函数readRSSI。

如果它读取RSSI,则将其保存到变量以显示在情节提要上。 然后计时器继续调用readRSSI函数。

与外围设备断开连接时,您将要确保停止阅读RSSI。

以下是完整的应用程序,包括读取RSSI和在RSSI达到一定数值后立即编写