我正在设计一个iOS框架来处理多个BLE设备(所有类型)。目前一切都很顺利,除了一件事:
客户端需要包含可用设备的列表。但是,我怎样才能检测到过去发现的设备何时不再可用?
当我尝试连接到不再可用的设备时,会出现另一个问题。文档说:连接尝试永远不会超时和
是的,我从未通过didFailToConnectPeripheral收到错误。
我做了一些研究,但无法弄清楚如何通过CoreBluetooth正确处理这些问题。所以我开发了自己的解决方案,但我不确定这是否是正确的方法(或者至少是一种好方法,因为可能有几种方法可以做到这一点)。
1。检测不再可用的设备
我用
扫描[_centralManager scanForPeripheralsWithServices:services options:@{CBCentralManagerScanOptionAllowDuplicatesKey: @(TRUE)}];
所以只要设备没有连接,我就会一直收到广告。我用计时器检查广告在给定的时间间隔内重新固化(足够大,对应于设备广告间隔)。如果广告没有在时间间隔内发生,我会从列表中删除该设备。
2。检测连接超时 嗯,我觉得这很简单。我使用自己的超时功能,并在计时器到期时取消连接请求。
如果有人遇到过这些问题,我会对你的意见和/或你的解决方案非常感兴趣。
更新2014-12-17:
与此同时,我使用计时器开发自己的解决方案,似乎效果很好。
连接超时很简单。只需将计时器设置为5秒或您认为对您有益的任何东西。如果计时器到期且设备未连接,只需取消连接并告诉用户存在问题。
检测超出范围的设备有点棘手。对于每个发现的设备,我启动一个计时器,在两倍的时间后触发,设备发送广告。如果设备确实发送了另一个广告,直到计时器到期,它可能超出范围或被关闭或连接到另一个设备。
我不想回答我自己的问题,因为我希望苹果有朝一日可以解决这些问题。
答案 0 :(得分:5)
确定设备是否可用的正确方法是存储外设identifier
值。在尝试重新连接之前,请致电retrievePeripheralsWithIdentifiers
。但是,这仍然不能保证在您尝试连接时设备将在范围内!
连接尝试不会在操作系统级别超时,这显然是documented。
某些应用可能需要使用Core Bluetooth框架才能执行 在后台进行长期行动。举个例子,想象一下 为通信的iOS设备开发家庭安全应用程序 带门锁(配备蓝牙低能耗技术)。该 应用程序和锁相互作用,以便在用户自动锁定门 当用户返回时,离开家并解锁门 应用程序在后台。当用户离开家时,iOS设备 可能最终变得超出锁定范围,导致连接 锁定丢失。此时,应用程序可以简单地调用 connectPeripheral:options:CBCentralManager类的方法,和 因为连接请求没有超时,iOS设备会 用户返回家园时重新连接。