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

时间:2014-09-17 08:02:48

标签: ios bluetooth-lowenergy

我正在设计一个iOS框架来处理多个BLE设备(所有类型)。目前一切都很顺利,除了一件事:

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

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

是的,我从未通过didFailToConnectPeripheral收到错误。

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

1。检测不再可用的设备

我用

扫描
[_centralManager scanForPeripheralsWithServices:services options:@{CBCentralManagerScanOptionAllowDuplicatesKey: @(TRUE)}];

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

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

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

更新2014-12-17:

与此同时,我使用计时器开发自己的解决方案,似乎效果很好。

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

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

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

1 个答案:

答案 0 :(得分:5)

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

连接尝试不会在操作系统级别超时,这显然是documented

  

某些应用可能需要使用Core Bluetooth框架才能执行   在后台进行长期行动。举个例子,想象一下   为通信的iOS设备开发家庭安全应用程序   带门锁(配备蓝牙低能耗技术)。该   应用程序和锁相互作用,以便在用户自动锁定门   当用户返回时,离开家并解锁门   应用程序在后台。当用户离开家时,iOS设备   可能最终变得超出锁定范围,导致连接   锁定丢失。此时,应用程序可以简单地调用   connectPeripheral:options:CBCentralManager类的方法,和   因为连接请求没有超时,iOS设备会   用户返回家园时重新连接。