iOS 蓝牙连接要点整理
过滤方式
先简单通过名字过滤(aaaa、bbbb),再通过advertisementData取出mac地址(前提是设备商先将mac地址按照规则传进去)
CBCentralManager
CBCentralManager:扫描Peripheral -> 发现Peripheral(外设) -> 连接Peripheral
CBPeripheral
CBPeripheral:发现Service(服务UUID) --> 发现Character(读/写特征UUID) --> 读写数据回调 --> 写入成功,要再等待返回的数据判断
重连机制
重连机制:①retrievePeripheralsWithIdentifiers -> ②retrieveConnectedPeripheralsWithServices -> ③scanForPeripheralsWithServices
官方蓝牙重连机制.jpg
注意:传入参数时,优先传入值,次要方案传入nil
特别通用方法 scanForPeripheralsWithServices
,将发现服务时的服务UUID保存,留作下次扫描时(或者retrieveConnectedPeripheralsWithServices
)读取使用
而 retrievePeripheralsWithIdentifiers
,则保存发现Peripheral
时的Identifier
注意无线电的使用和功耗
低功耗蓝牙通信会共享设备的无线电以通过空中传输信号,由于其他形式的无线通信可能需要使用设备的无线电(例如 Wi-Fi、经典蓝牙,甚至其他使用低功耗蓝牙的应用程序),因此开发您的应用程序以最大程度地减少无线电的使用量。
在为 iOS 设备开发应用程序时,尽量减少无线电的使用尤其重要,因为无线电的使用会对 iOS 设备的电池寿命产生不利影响
仅在需要时扫描设备
除非您需要发现更多设备,否则请在找到要连接的设备后停止扫描其他设备,通过CBCentralManager.stopScan
停止扫描
仅在必要时指定 CBCentralManagerScanOptionAllowDuplicatesKey 选项
当使用 scanForPeripheralsWithServices:options:
方法扫描设备时,该方法的默认行为是将广告外围设备的多个发现合并为单个发现事件
如果要更改默认行为,可以指定CBCentralManagerScanOptionAllowDuplicatesKey=true
,即每次中央设备从外围设备接收到广告数据包时都会生成一个发现事件
设置 CBCentralManagerScanOptionAllowDuplicatesKey
对某些情况很有帮助,例如外设的接近度(RSSI值)启动与外设的连接
明智地探索外设的数据
以下方法,优先传入特定的UUID值。应该仅寻找和发现您的应用程序所需的相关特征
discoverServices:
discoverCharacteristics:forService:
订阅经常变化的特征值
有两种方法检索特征的值
- 每次需要值时调用
readValueForCharacteristic:
方法来显式轮询特征值 - 调用一次
setNotifyValue:forCharacteristic:
方法来订阅特征值,以便在值发生变化时接收外设的通知。
当您拥有所需的所有数据时,断开与设备的连接
当不再需要连接时,通过断开与外围设备的连接来帮助减少应用程序的无线电使用量。满足以下两种情况,请断开与外围设备的连接
- 订阅的特征值已经停止发送通知
- 外围设备获得了所有数据
参考
https://cloud.tencent.com/developer/article/2374918
https://developer.baidu.com/article/details/2834421
https://developer.apple.com/library/archive/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/AboutCoreBluetooth/Introduction.html
https://developer.apple.com/library/archive/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/BestPracticesForInteractingWithARemotePeripheralDevice/BestPracticesForInteractingWithARemotePeripheralDevice.html