我想解决的基本问题如下。我有两个iOS设备,一个配置为中央设备,另一个配置为外围设备。我希望外围设备知道中央是否因为某些原因而移开或变为非活动状态(例如,运行中央设备的设备已关闭)。
在正常情况下,我将其设置为当中心移动靠近外围设备时,中央可以使用信标区域和范围通过特征写入通知外围设备,当它处于紧邻状态时(CLProximityImmediate) ,然后再次当它仍在范围内,但远离(CLProximityFar)。这很好用。
然而,为了在中央设备从CLProximityImmediate变为某种未知状态时捕获角落条件,我计划使用来自中心可以响应的外围设备的周期性指示。如果对指示没有响应,则外围设备可以假设中心不再紧邻。但是,我无法找到回调或委托方法,通知外围设备管理器指示失败。
方法updateValue:forCharacteristic:onSubscribedCentrals:当底层传输队列已满时返回NO - 而不是因为中心没有响应,就像我理解它一样。
我错过了一些明显的东西吗?有没有办法让外围经理告诉中心没有收到指示?或者在这种情况下CoreBluetooth中是否缺少回调?
感谢您的帮助!
答案 0 :(得分:5)
有两个问题让外围设备知道位置管理员与CLBeacon失去联系:
iBeacons是被动的,通告和传输设备。与Apple实现一样,Core Location框架没有与它们建立连接。因此,外围新手知道任何人都听过他们的广播。
CLBeacon
不会将基础BTLE外设公开为CBPeripheral,因此您无法让BTLE外设知道您的位置监视器在范围内。
问题#2可以通过一种相当复杂的方式解决:
开始扫描CBPeripherals
advertisementData
包含proximityUUID
的{{1}}。
建立与CBPeripheral
的连接,并获得特征值更改的通知。
经常更改外围设备上的特征值,因此当中心在超时时间后看不到更多通知时,表示外围设备超出范围。
如果你想让它适用于多个iOS设备,那么在广告和iBeacon之间进行切换以及作为GATT外围设备工作变得复杂。
答案 1 :(得分:3)
虽然这个问题没有明确说明,但是我暗示说外设正在宣传一项具有几个特征的服务。这是明确的iBeacon广告的补充,我同意这是"被动"。当中心被通知信标区域时,它发现并写入其中一个特征,并且外围设备可以知道中心在范围内。
我的基本问题不是关于灯塔的被动性,而是关于如何"指示"使用CoreBluetooth。我认为,如果外围设备使用updateValue:forCharacteristic:onSubscribedCentrals:
来通知订阅了CBCharacteristicPropertyIndicate
定义的特征的中心,则可以相当安全地确定没有定义回调以获取应该返回的指示的确认来自中央(每个GAP)。
这个缺失的API的一个解决方法是将第三个特征定义为"确认"每当中央接收peripheral:didUpdateValueForCharacteristic:
订阅的指示时,中央应该对该特性进行虚拟读取。这应该产生对外围设备peripheralManager:didReceiveReadRequest:
的呼叫,以确认收到了指示。
这是更多的工作,而不是最优雅的方式,但它可能是最好的事情,因为没有API用于指示确认。