ReadRSSI不会调用委托方法

时间:2014-09-26 13:57:26

标签: ios bluetooth ios8 bluetooth-lowenergy core-bluetooth

自从iOS 8更新后我遇到了问题,现在我的应用程序连接到BLE设备,并且由于计时器和ReadRSSI方法而定期读取RSSI。

调用readRSSI方法(使用断点检查),所以在此之前一切都很好。

根据调用readRSSI的文档应该触发回调

- (void)peripheral:(CBPeripheral *)peripheral didReadRSSI:(NSNumber *)RSSI error:(NSError *)error

但是,每次都不调用此委托方法。但是,当我关闭和打开手机蓝牙时,我恢复了RSSI更新。有没有人遇到过这个问题?我该如何设法修复它?

3 个答案:

答案 0 :(得分:3)

我遇到了同样的问题,首先想到这可能是我的错,但后来事实证明这很奇怪。

我编写了类似的程序,使用iPhone连接到BLE信标,并使用[CBPeripheral readRSSI]来获取信号强度。当BLE信标第一次连接到我的iPhone时,一切顺利。但如果它断开连接并再次重新连接,则不会再调用readRSSI方法。 只有在我重新启动iPhone上的蓝牙后,问题才会得到解决。

我一步一步地在调试模式下运行程序,令我惊讶的是,我发现没有任何问题。即使我多次断开连接并再次重新连接,仍然可以正确调用readRSSI方法。

希望这可能会有所帮助。我也在等待这个奇怪的事情的答案。

答案 1 :(得分:3)

我最近遇到了这个问题,我遇到了多个问题。这是清单方式的解决方案,从最简单到最复杂:

  1. CBCentralManager不会强烈引用peripheral,您需要自己保留。
  2. 确保您确实是peripheral.delegate
  3. 确保您正在实施新方法peripheral(peripheral:didReadRSSI:error:),而不是旧方法。
  4. iOS 8.0.2引入了上述方法的问题,8.1,8.2,8.3之后的任何版本都没有问题(什么是@Gamma-Point提到)。
  5. 对于连接到中心的设备,您只能readRSSI,因此:
    1. 对于通过发现检索的设备,您可以在执行[CBCentralManagerScanOptionAllowDuplicatesKey : true]时传递scanForPeripheralsWithServices(_:options:)。如this answer
    2. 中所示
    3. 此外,还有方法central.retrieveConnectedPeripheralsWithServices的问题。此方法返回“已连接”设备,但readRSSI或服务发现工作,直到您实际调用connectPeripheral(_:options:),因此即使它们连接到iPhone / iPad / AppleWatch,它们也没有连接到你的中心,非常讨厌。
  6. 这最后一个对我来说是个大问题,我希望“选择最接近的”连接或发现设备,但无法保持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只能在连接状态下接受命令。