我正在设计一个处理多个蓝牙低功耗设备的iOS框架(所有设备都是相同类型)。目前一切都运行得非常好,只有一个问题:
客户需要一个可用设备列表。但是当以前发现的设备不再可用时,我该如何检测到呢?
另一个问题是,当我尝试连接不再可用的设备时会出现问题。文档说:连接尝试永远不会超时,并且
是的,我从未通过didFailToConnectPeripheral收到错误。
我做了一些研究,但无法弄清楚如何通过CoreBluetooth正确处理这些问题。因此,我开发了自己的解决方案,但我不确定这是否是正确的方式(或者至少是一种好的方式,因为可能有几种方法可以实现它)。
1. 检测不再可用的设备
我使用下面的代码进行扫描:
[_centralManager scanForPeripheralsWithServices:services options:@{CBCentralManagerScanOptionAllowDuplicatesKey: @(TRUE)}];
只要设备没有连接,我就会一直收到广告。我使用定时器检查广告是否在给定的时间间隔内(足够大,相应于设备的广告时间间隔)重新出现。如果广告未在该时间间隔内重复出现,则将该设备从列表中移除。
2. 检测连接超时 我认为这是非常简单的。我使用自己的超时函数,并且如果计时器过期,就取消连接请求。
如果有人碰到这些问题,我很感兴趣听听您的意见和/或解决方案。
更新2014-12-17:
与此同时,我正在开发自己的解决方案,使用定时器,看起来效果不错。
连接超时很直接,只需设置一个5秒钟或您认为合适的计时器。如果计时器超时并且设备未连接,则简单地取消连接并告诉用户存在问题。
检测超出范围的设备有点棘手。对于每个发现的设备,我启动一个计时器,它在设备发送广告的两倍时间后触发。如果设备在计时器超时之前未发送其他广告,则可能已超出范围、关闭或连接到另一个设备。
我不想回答自己的问题,因为我希望也许有一天苹果会解决这些问题。