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

17

我正在设计一个处理多个蓝牙低功耗设备的iOS框架(所有设备都是相同类型)。目前一切都运行得非常好,只有一个问题:

客户需要一个可用设备列表。但是当以前发现的设备不再可用时,我该如何检测到呢?

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

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

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

1. 检测不再可用的设备

我使用下面的代码进行扫描:

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

只要设备没有连接,我就会一直收到广告。我使用定时器检查广告是否在给定的时间间隔内(足够大,相应于设备的广告时间间隔)重新出现。如果广告未在该时间间隔内重复出现,则将该设备从列表中移除。

2. 检测连接超时 我认为这是非常简单的。我使用自己的超时函数,并且如果计时器过期,就取消连接请求。

如果有人碰到这些问题,我很感兴趣听听您的意见和/或解决方案。

更新2014-12-17:

与此同时,我正在开发自己的解决方案,使用定时器,看起来效果不错。

连接超时很直接,只需设置一个5秒钟或您认为合适的计时器。如果计时器超时并且设备未连接,则简单地取消连接并告诉用户存在问题。

检测超出范围的设备有点棘手。对于每个发现的设备,我启动一个计时器,它在设备发送广告的两倍时间后触发。如果设备在计时器超时之前未发送其他广告,则可能已超出范围、关闭或连接到另一个设备。

我不想回答自己的问题,因为我希望也许有一天苹果会解决这些问题。


只是想说,我也遇到了连接没有超时的完全相同的问题。你知道这是不是一个 bug 吗? - Yoav Schwartz
实际上,自一月份以来,我已不再参与相关项目,因此对该主题没有更新的信息。在我看来,这并不是一个错误,而是缺少一个功能。 - benjamin.ludwig
在BLE协议中,它们确实设定了一个20秒的超时时间。它们似乎会自动尝试重新连接而不向Delegate发出警报/失败/给您回应的机会,所以我认为这是一个重要的缺失功能 :) - Yoav Schwartz
1个回答

7

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

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

一些应用程序可能需要使用核心蓝牙框架在后台执行长期操作。例如,假设您正在为iOS设备开发一个家庭安全应用程序,该应用程序与配备蓝牙低功耗技术的门锁通信。应用程序和锁交互以在用户离开家时自动锁定门,并在用户返回时解锁门 - 所有这些都在应用程序在后台运行时完成。当用户离开家时,iOS设备可能最终超出锁的范围,导致与锁的连接丢失。此时,应用程序可以简单地调用CBCentralManager类的connectPeripheral:options:方法,因为连接请求不会超时,所以iOS设备将在用户回家时重新连接。

“检测设备超出范围/连接超时”的答案是“不可能”,对吗? - User

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接