连续扫描iOS CoreBluetooth Central Manager



低功耗蓝牙规范并没有说明外设是否可以同时连接多个中心,但我的经验测试告诉我它们不能。

因为我的应用程序需要与外设建立非占有关系(即没有连接,这会阻止其他连接),并且需要不断更新它们的RSSI值,所以我正在寻找一种方法来连续扫描外设并捕获它们的RSSI值。

scanForPeripheralsWithServices方法似乎扫描了一段时间,然后停止。我相信我最好的办法是每次扫描3秒,停止扫描,等待(几秒钟),然后重新开始扫描。重复。

有谁能指出更好的方法吗?例如,配置外设连接到多个Central?

一个外设不能连接多个中心。但如果你只需要捕获RSSI,那么你甚至不需要连接。扫描设备可以使用以下函数检索RSSI:

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI

对于前面的答案,如果您只对RSSI感兴趣,您可以简单地将其放入委托方法:

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI

BTW,默认情况下CBCentralManager将只调用此方法一次。如果您需要每次CBCentralManager接收到广告数据包时都调用此回调,则需要启动扫描,将CBCentralManagerScanOptionAllowDuplicatesKey选项设置为YES:

NSDictionary *scanningOptions = @{CBCentralManagerScanOptionAllowDuplicatesKey: @YES};
[centralManager scanForPeripheralsWithServices:nil options:scanningOptions];

注意,如果不是绝对必要的话,苹果不鼓励使用这个选项。

参见:iOS开发者库-与远程外围设备交互的最佳实践

我用这段代码解决了这类问题,基本上只是在每次处理广告时重新启动扫描。我正面临着同样的问题,CBCentralManager实例将停止监听外设。

(设置CBCentralManagerScanOptionAllowDuplicatesKey@YES并不能完全解决我的问题)

假设类实现了CBCentralManagerDelegate:

- (id) init {
    self.central = [[CBCentralManager alloc]initWithDelegate:self queue:nil];
    [self initScan];
}
- (void) initScan {
    [self.central stopScan];
    [self.central scanForPeripheralsWithServices:nil
                                         options:[NSDictionary dictionaryWithObjectsAndKeys:@NO, CBCentralManagerScanOptionAllowDuplicatesKey, nil]];
}
- (void) centralManager:(CBCentralManager*)central didDiscoverPeripheral:(CBPeripheral*)peripheral advertisementData:(NSDictionary*)advertisementData RSSI:(NSNumber*)RSSI {
    //
    // Do stuff here
    //
    [self initScan];
}

最新更新