自从iOS 8更新以来,我遇到了一个问题,现在我的应用程序连接到一个BLE设备,并通过计时器和ReadRSSI方法定期读取RSSI。
readRSSI方法被调用(用断点检查),所以在这之前一切都很好。
根据文档,调用readRSSI应该会触发回调
- (void)peripheral:(CBPeripheral *)peripheral didReadRSSI:(NSNumber *)RSSI error:(NSError *)error但是,并不是每次都会调用此委托方法。但是当我关闭和打开手机蓝牙时,我得到了RSSI更新。有没有人遇到过这个问题?我怎么才能修好它呢?
发布于 2014-09-28 23:25:47
我也遇到了同样的问题,一开始以为这可能是我的错,但后来发现真的很奇怪。
我写了类似的程序,使用iPhone连接到一个BLE信标,并使用CBPeripheral readRSSI获得信号强度。当BLE信标第一次连接到我的iPhone时,一切都很顺利。但是,如果它断开连接,然后重新连接,则不会再调用readRSSI方法。只有在我重新启动iPhone上的蓝牙之后,这个问题才会得到解决。
我在调试模式下一步一步地运行程序,令我惊讶的是,我发现根本没有问题。即使我多次断开连接并重新连接,readRSSI方法仍然可以正确调用。
希望这能有所帮助。我也在等待这件奇怪的事情的答案。
发布于 2015-05-06 06:19:00
我最近遇到了这个问题,我有多个问题导致了这个问题。下面是清单形式的解决方案,从最简单到最复杂:
CBCentralManager不会包含对peripheral的强引用,你需要自己保留它。peripheral(peripheral:didReadRSSI:error:),确保你实现的是新方法peripheral(peripheral:didReadRSSI:error:)而不是旧方法。readRSSI,因此:scanForPeripheralsWithServices(_:options:)时传递[CBCentralManagerScanOptionAllowDuplicatesKey : true]。正如在this answer.central.retrieveConnectedPeripheralsWithServices方法有一个缺陷。此方法返回“已连接”的设备,但readRSSI或服务发现在您实际对它们调用connectPeripheral(_:options:)之前都不起作用,因此即使它们已连接到iPhone/iPad/AppleWatch,它们也不会连接到您的中央设备,非常annoying.
最后一个对我来说是最大的问题,我希望“挑选最接近的”连接或发现的设备,但无法保持RSSI的更新。文档也没有说明任何事情。
我最终做的是建立一个大字典,里面有[UUID : Device]索引的所有设备(设备是CBPeripheral的包装器)。通过发现添加的设备通过去发现方法更新它们的RSSI,连接的设备通过蓝牙队列上的GCD计时器调用readRSSI并更新它们自己的RSSI读数。
发布于 2014-10-17 02:18:13
我有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委托方法。苹果可能很快就会在iOS中为RSSI添加一些东西。
在iOS 8.0中,didReadRSSI工作正常。在8.0.2文档中,它没有列在iOS下面。
如果我同时使用这两种方法,didReadRSSI在iOS 8中会被调用,而peripheralDidUpdateRSSI在iOS 7中会被调用。
所以不要更新到RSSI8.0.2,直到苹果为iOS添加了一些东西。
有没有人试过iOS 8.1测试版?
看起来在扫描设备时无法读取RSSI。如果对CBCentralManager scanForPeripheralsWithServices的调用...已启动,则不会发生ReadRSSI的效果(不调用任何委托)。但是,如果发出CBCentralManager stopScan,ReadRSSI就会开始响应。
还请注意:设备必须处于已连接状态才能发出命令,否则您将得到: CoreBluetoothAPI MISUSE CBPeripheral只能在处于已连接状态时接受命令。
https://stackoverflow.com/questions/26061359
复制相似问题