分阶段了解:
- 扫描
- 连接
- 发现服务和特征,写入或读取数据
连接类
BTConnectionPool
此类是基于CBCentralManager连接外设的方法connect和CBCentralManagerDelegate的代理方法.在调用connect方法之后,系统会通过下面的代理方法自动回调结果,我们可以根据结果来确认中心设备与外围设备连接的状态.
centralManager.connect(peripheral, options: nil)
/// 中心设备与外设已连接上
func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral)
/// 中心设备连接外设失败
func centralManager(_ central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Error?)
/// 中心设备与外设连接已断开
func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?)
我们需要做的工作是在中心设备依次连接多台外围设备时,可以清楚了解每台外围设备是否连接成功,以及避免同一台外围设备在已经连接后重复连接的情况.首先声明两个数组类型的成员变量,来分别管理多台外设,其中:
- connectPeripherals管理所有已经连接上的外设,当设备已被中心设备连接,会加入到此数组中,当设备与中心设备断开连接后,再将这台外设从数组中移除掉
- connectAttempts管理所有等待连接的外设,当设备已被中心设备连接或连接失败,都会将这台外设从数组中移除掉
centralManager在执行connect方法后,它的代理方法是异步执行的,并不会立即返回结果,为避免中心设备连接外设长时间无响应,我们需要创建一个定时器,这样在超时时间过后,如发现连接的代理方法没走,就调用方法centralManager.cancelPeripheralConnection(peripheral)手动取消对此外设的连接.