CoreBluetooth:检测设备超出范围/连接超时

ben*_*wig 14 ios bluetooth-lowenergy

我正在设计一个iOS框架来处理多个BLE设备(所有类型).除了一件事之外,目前一切都运转良好:

客户端需要包含可用设备的列表.但是,我怎样才能检测到过去发现的设备何时不再可用?

当我尝试连接到不再可用的设备时,会出现另一个问题.文档说:连接尝试永远不会超时

是的,我从来没有通过didFailToConnectPeripheral收到错误.

我做了一些研究,但无法弄清楚如何通过CoreBluetooth正确处理这些问题.所以我开发了自己的解决方案,但我不确定这是否是正确的方法(或者至少是一种好方法,因为可能有几种方法可以做到这一点).

1.检测不再可用的设备

我用扫描

[_centralManager scanForPeripheralsWithServices:services options:@{CBCentralManagerScanOptionAllowDuplicatesKey: @(TRUE)}];
Run Code Online (Sandbox Code Playgroud)

所以只要设备没有连接,我就会一直收到广告.我用计时器检查广告在给定的时间间隔内重新固化(足够大,对应于设备广告间隔).如果在间隔中没有出现广告,我将从列表中删除该设备.

2.检测连接超时 嗯,我觉得这很容易.我使用自己的超时功能,并在计时器到期时取消连接请求.

如果有人遇到过这些问题,我会对您的意见和/或您的解决方案非常感兴趣.

更新2014-12-17:

与此同时,我使用计时器开发了我自己的解决方案,它看起来效果很好.

连接超时是直接的.只需将计时器设置为5秒或您认为对您有益的任何东西.如果计时器到期且设备未连接,只需取消连接并告诉用户存在问题.

检测超出范围的设备有点棘手.对于每个发现的设备,我启动一个计时器,在两倍的时间后触发,设备发送广告.如果设备确实发送了另一个广告,直到计时器到期,它可能超出范围或被关闭或连接到另一个设备.

我不想回答我自己的问题,因为我希望苹果有朝一日可以解决这些问题.

Air*_*Ltd 6

确定设备是否可用的正确方法是存储外设identifier值.在尝试重新连接之前,请致电retrievePeripheralsWithIdentifiers.但是,这仍然不能保证在您尝试连接时设备将在范围内!

连接尝试不会在操作系统级别超时,这是明确记录的.

某些应用可能需要使用Core Bluetooth框架在后台执行长期操作.例如,假设您正在为iOS设备开发一个家庭安全应用程序,该应用程序与门锁(配备蓝牙低功耗技术)通信.当用户离开家时,应用程序和锁相互作用以自动锁定门,当应用程序在后台时,当用户返回时解锁门.当用户离开家时,iOS设备最终可能会超出锁定范围,从而导致与锁定的连接丢失.此时,应用程序可以简单地调用CBCentralManager类的connectPeripheral:options:方法,并且由于连接请求没有超时,iOS设备将在用户返回主页时重新连接.