在蓝牙低功耗通信中实现核心角色的设备执行许多常见任务,例如发现并连接到可用外设,以及探索外设必须提供的数据并与之交互。实现外设角色的设备还执行许多常见但不同的任务 - 例如发布和广告服务,以及响应来自连接中央设备的读取,写入和订阅请求。
在本章中,您将学习如何使用Core Bluetooth框架从中央端执行最常见的蓝牙低功耗任务。以下基于代码的示例将帮助您开发应用程序,以在本地设备上实现中心角色。具体来说,你将学习如何:
- 启动一个中央管理器对象
- 发现并连接到广告的外围设备
- 连接到外围设备后,看外围设备上的数据
- 将读或写的请求发送到外围设备服务的特征值
- 订阅特征值,以便在更新时得到通知
启动中央管理器
因为CBCentralManager对象是本地中央设备的Core Bluetooth面向对象表示,所以您可以在执行任何蓝牙低功耗事务之前应创建和初始化中央管理器实例。您通过调用其initWithDelegate:queue:options:方法来初始化您的中央管理器:
myCentralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil options:nil];
在这个例子中,self
被设置为委托来接收任何中心角色事件。通过指定调度队列nil
,中央管理器使用主队列调度中心角色事件。
当您创建中央管理器时,中央管理器将调用centralManagerDidUpdateState:其委托对象的方法。您必须实现此代理方法,以确保蓝牙低功耗在中央设备上得到支持并可用。有关如何实现此委托方法的更多信息,请参阅CBCentralManagerDelegate协议参考。
发现广告的外围设备
初始化后,中央管理器的首要任务就是发现外围设备。正如Centrals发现并连接到广告外设中所提到的,外设通过广告宣传他们的存在。您的应用程序通过调用中央管理器的scanForPeripheralsWithServices:options:方法发现正在广告的附近外围设备:
[myCentralManager scanForPeripheralsWithServices:nil options:nil];
注意: 如果您nil
为第一个参数指定,则中央管理器会返回所有发现的外围设备,而不管其支持的服务是什么。在真实应用程序中,您通常会指定一组CBUUID对象,其中每个对象表示外围设备正在宣传的服务的通用唯一标识符(UUID)。当您指定一组服务UUID时,中央管理器仅返回公布这些服务的外围设备,允许您仅扫描您可能感兴趣的设备。
UUID以及CBUUID代表它们的对象在UUID标识的服务和特征中有更详细的讨论。
每当中央管理器发现一个外围设备时,它都会调用centralManager:didDiscoverPeripheral:advertisementData:RSSI:其委托对象的方法。新发现的外围设备作为CBPeripheral对象返回。如果您打算连接到发现的外设,请对其进行强引用,以便系统不会释放它。以下示例显示了使用类属性维护对已发现外围设备的引用的情况:
未完成