首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ReadRSSI不调用委托方法

ReadRSSI不调用委托方法
EN

Stack Overflow用户
提问于 2014-09-26 21:57:26
回答 3查看 5.7K关注 0票数 9

自从iOS 8更新以来,我遇到了一个问题,现在我的应用程序连接到一个BLE设备,并通过计时器和ReadRSSI方法定期读取RSSI。

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

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

代码语言:javascript
复制
- (void)peripheral:(CBPeripheral *)peripheral didReadRSSI:(NSNumber *)RSSI error:(NSError *)error

但是,并不是每次都会调用此委托方法。但是当我关闭和打开手机蓝牙时,我得到了RSSI更新。有没有人遇到过这个问题?我怎么才能修好它呢?

EN

回答 3

Stack Overflow用户

发布于 2014-09-28 23:25:47

我也遇到了同样的问题,一开始以为这可能是我的错,但后来发现真的很奇怪。

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

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

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

票数 3
EN

Stack Overflow用户

发布于 2015-05-06 06:19:00

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

  1. CBCentralManager不会包含对peripheral的强引用,你需要自己保留它。
  2. 确保你是真正的peripheral(peripheral:didReadRSSI:error:),确保你实现的是新方法peripheral(peripheral:didReadRSSI:error:)而不是旧方法。
  3. iOS 8.0.2引入了上述方法的问题,8.1、8.2、8.3之后的任何版本都没有问题( @Gamma-Point提到的)。
  4. 您只能对连接到中心的设备执行readRSSI,因此:
    1. 对于通过发现检索到的设备,您可以在执行scanForPeripheralsWithServices(_:options:)时传递[CBCentralManagerScanOptionAllowDuplicatesKey : true]。正如在this answer.
    2. Also,中看到的,central.retrieveConnectedPeripheralsWithServices方法有一个缺陷。此方法返回“已连接”的设备,但readRSSI或服务发现在您实际对它们调用connectPeripheral(_:options:)之前都不起作用,因此即使它们已连接到iPhone/iPad/AppleWatch,它们也不会连接到您的中央设备,非常annoying.

最后一个对我来说是最大的问题,我希望“挑选最接近的”连接或发现的设备,但无法保持RSSI的更新。文档也没有说明任何事情。

我最终做的是建立一个大字典,里面有[UUID : Device]索引的所有设备(设备是CBPeripheral的包装器)。通过发现添加的设备通过去发现方法更新它们的RSSI,连接的设备通过蓝牙队列上的GCD计时器调用readRSSI并更新它们自己的RSSI读数。

票数 3
EN

Stack Overflow用户

发布于 2014-10-17 02:18:13

我有8.0,它工作得很好。

代码语言:javascript
复制
-(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中已被弃用,因此尝试另一个委托将返回报告。

代码语言:javascript
复制
-(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只能在处于已连接状态时接受命令。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26061359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档