Swift中如何用Core Bluetooth同时连接多个BLE设备并实现双向通信?
基于Core Bluetooth实现BLE一对多拓扑与并发数据收发
一、一对多设备连接的实现步骤
主设备(Central角色)侧操作
- 初始化
CBCentralManager并实现CBCentralManagerDelegate协议,监听蓝牙状态变化 - 调用
scanForPeripherals(withServices:options:)扫描周边设备,通过指定目标服务UUID缩小扫描范围,提升效率 - 发现目标设备后,调用
connect(_:options:)发起连接,iOS硬件层面通常支持同时连接7-8台BLE设备(不同机型有细微差异),需注意不要超出这个上限 - 连接成功后,通过
peripheral(_:didDiscoverServices:)发现从设备的服务,再遍历服务发现对应的数据特征,保存每个已连接CBPeripheral的实例用于后续通信
从设备(Peripheral角色)侧操作
- 初始化
CBPeripheralManager并实现CBPeripheralManagerDelegate协议 - 创建自定义BLE服务和数据特征,特征需配置合适的属性:比如同时开启
CBCharacteristicProperties.notify(用于向主设备回传数据)和CBCharacteristicProperties.writeWithoutResponse(用于接收主设备广播数据) - 调用
startAdvertising(_:)开启广播,广播包中携带自定义服务的UUID,让主设备能精准识别并连接
二、并发数据收发的实现方式
主设备的收发逻辑
- 发送广播数据:遍历所有已连接的
CBPeripheral实例,调用writeValue(_:for:type:)向对应特征写入数据。如果是无需可靠确认的广播类数据,优先用CBCharacteristicWriteType.withoutResponse,能提升并发传输效率;若需确保数据送达,使用withResponse - 接收回传数据:实现
peripheral(_:didUpdateValueFor:error:)代理方法,通过回调中的CBPeripheral实例区分不同从设备的回传数据,再解析特征值内容
从设备的收发逻辑
- 接收主设备数据:实现
peripheralManager(_:didReceiveWriteRequests:)代理方法,处理主设备的写入请求,解析请求中的数据内容 - 回传数据给主设备:调用
updateValue(_:for:onSubscribedCentrals:)发送数据,前提是主设备已订阅当前特征(主设备需调用setNotifyValue(_:for:)完成订阅)
三、核心注意事项
- 连接数限制:务必测试目标iOS机型的最大BLE连接数,超出上限会导致后续连接请求失败
- 异步操作处理:Core Bluetooth所有操作都是异步回调模式,需通过代理方法处理结果,建议用串行队列管理蓝牙操作避免竞态,UI相关操作切回主队列执行
- 数据分包处理:BLE单包数据最大为20字节(ATT协议限制),若传输数据超过此大小,需自行实现分包、重组逻辑
- 功耗优化:主设备扫描时尽量指定服务UUID过滤;从设备设置合理的广播间隔,避免过短导致功耗过高
内容的提问来源于stack exchange,提问作者Putter Asavarojkul
相关产品推荐
相关产品推荐

