自从iOS 8更新后我遇到了问题,现在我的应用程序连接到BLE设备,并且由于计时器和ReadRSSI
方法而定期读取RSSI。
调用readRSSI
方法(使用断点检查),所以在此之前一切都很好。
根据调用readRSSI
的文档应该触发回调
- (void)peripheral:(CBPeripheral *)peripheral didReadRSSI:(NSNumber *)RSSI error:(NSError *)error
但是,每次都不调用此委托方法。但是,当我关闭和打开手机蓝牙时,我恢复了RSSI更新。有没有人遇到过这个问题?我该如何设法修复它?
答案 0 :(得分:3)
我遇到了同样的问题,首先想到这可能是我的错,但后来事实证明这很奇怪。
我编写了类似的程序,使用iPhone连接到BLE信标,并使用[CBPeripheral readRSSI]来获取信号强度。当BLE信标第一次连接到我的iPhone时,一切顺利。但如果它断开连接并再次重新连接,则不会再调用readRSSI方法。 只有在我重新启动iPhone上的蓝牙后,问题才会得到解决。
我一步一步地在调试模式下运行程序,令我惊讶的是,我发现没有任何问题。即使我多次断开连接并再次重新连接,仍然可以正确调用readRSSI方法。
希望这可能会有所帮助。我也在等待这个奇怪的事情的答案。
答案 1 :(得分:3)
我最近遇到了这个问题,我遇到了多个问题。这是清单方式的解决方案,从最简单到最复杂:
CBCentralManager
不会强烈引用peripheral
,您需要自己保留。peripheral.delegate
。peripheral(peripheral:didReadRSSI:error:)
,而不是旧方法。readRSSI
,因此:
[CBCentralManagerScanOptionAllowDuplicatesKey : true]
时传递scanForPeripheralsWithServices(_:options:)
。如this answer。central.retrieveConnectedPeripheralsWithServices
的问题。此方法返回“已连接”设备,但readRSSI
或服务发现工作,直到您实际调用connectPeripheral(_:options:)
,因此即使它们连接到iPhone / iPad / AppleWatch,它们也没有连接到你的中心,非常讨厌。这最后一个对我来说是个大问题,我希望“选择最接近的”连接或发现设备,但无法保持RSSI更新。文档也没有说什么。
我最终做的是构建一个包含[UUID : Device]
索引的所有设备的大字典(设备是CBPeripheral
的包装器)。通过发现添加的设备通过de discover方法更新RSSI,通过蓝牙队列上的GCD定时器更新连接的RSSI,并调用readRSSI
并更新自己的RSSI读数。
答案 2 :(得分:1)
我有8.0,它工作正常。
-(void) startScanForRSSI{
timerRSSI = [NSTimer scheduledTimerWithTimeInterval:10.0f target:self selector:@selector(detectRSSI) userInfo:nil repeats:YES];
}
- (void)detectRSSI {
if (state == ...) {
peripheral.delegate = self;
[peripheral readRSSI];
} else {
if (timerRSSI && [timerRSSI isValid]) {
[timerRSSI invalidate];
}
}
}
- (void)peripheralDidUpdateRSSI:(CBPeripheral *)peripheral error:(NSError *)error {
NSLog(@"Got RSSI update: %4.1f", [peripheral.RSSI doubleValue]);
NSNumber *rssiNum = peripheral.RSSI;
}
由于上述内容在iOS 8中已弃用,因此尝试其他代理会报告回来。
-(void) peripheral:(CBPeripheral *)peripheral didReadRSSI:(NSNumber *)RSSI error:(NSError *)error {
NSLog(@"Got RSSI update in didReadRSSI : %4.1f", [RSSI doubleValue]);
}
这似乎是一个OSX委托方法。 Apple可能会很快在iOS中为RSSI添加一些内容。
在iOS 8.0中,didReadRSSI正在运行。在8.0.2文档中,它未列在iOS下。
如果我把两种方法都放在iOS 8&中调用didReadRSSI。在iOS 7中调用peripheralDidUpdateRSSI。
因此,在Apples为RSSI提供内容之前,不要更新到iOS 8.0.2。
有没有人尝试iOS 8.1测试版?
在扫描设备时看起来无法读取RSSI。如果已启动对[CBCentralManager scanForPeripheralsWithServices ...]的调用,则不会发生ReadRSSI的影响(不会调用任何代理)。但如果发出[CBCentralManager stopScan],则ReadRSSI开始响应。
另请注意:设备必须处于连接状态才能发出命令,否则您将获得: CoreBluetooth [API MISUSE] CBPeripheral只能在连接状态下接受命令。