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

Posted

技术标签:

【中文标题】CoreBluetooth:检测设备超出范围/连接超时【英文标题】:CoreBluetooth: detect device out of range/ connection timeout 【发布时间】:2014-09-17 08:02:48 【问题描述】:

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

客户想要一个包含可用设备的列表。但是如何检测过去发现的设备何时不再可用?

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

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

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

1.检测不再可用的设备

我用扫描

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

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

2。检测连接超时 嗯,我认为这很容易。我使用自己的超时功能,如果计时器到期,则取消连接请求。

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

2014 年 12 月 17 日更新:

与此同时,我使用计时器开发了自己的解决方案,它似乎工作得很好。

连接超时是直截了当的。只需将计时器设置为 5 秒或您认为对您有好处的任何时间。如果计时器到期并且设备没有连接,只需取消连接并告诉用户出现问题。

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

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

【问题讨论】:

只是想说,我有完全相同的问题,连接不超时。不知道是不是bug? 实际上我从一月份开始就不再参与相应的项目,因此没有关于该主题的更新信息。从我的角度来看,这并不是一个真正的错误,而是一个缺失的功能 嗯,在 BLE 协议中,它们确实有一个设置为 20 秒的超时。他们似乎会自动重试而不会提醒代表/失败/给你一个回应的机会,所以我会说这是一个很大的缺失功能:) 【参考方案1】:

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

连接尝试不会在操作系统级别超时,这明确表示为documented。

某些应用可能需要使用 Core Bluetooth 框架来执行 后台的长期操作。例如,假设您是 为 iOS 设备开发一个家庭安全应用程序,以进行通信 带门锁(配备蓝牙低功耗技术)。这 app和锁交互,当用户使用时自动锁门 离开家并在用户返回时解锁门——同时 应用程序在后台。当用户离开家时,iOS 设备 最终可能会超出锁定范围,导致连接 到锁丢失。此时,应用程序可以简单地调用 connectPeripheral:options: CBCentralManager 类的方法,以及 因为连接请求不会超时,iOS 设备会 用户回家后重新连接。

【讨论】:

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

以上是关于CoreBluetooth:检测设备超出范围/连接超时的主要内容,如果未能解决你的问题,请参考以下文章

CoreBluetooth 框架可以用来连接非 Apple 设备吗?

如何解决 [CoreBluetooth] 警告:对于具有多个设备连接的外围设备来说,这不是一个有效的特征

检测设备是不是超出 wifi 范围

CoreBluetooth 与非 iOS 设备的连接

CoreBluetooth 和 BluetoothManager,设备不是 BLE

使用 CoreBluetooth 通过 iOS 设备连接到 Windows 10