10

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

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

scanForPeripheralsWithServices 方法似乎扫描了一定的时间间隔,然后停止。我相信我最好的选择是一次扫描 3 秒钟,停止扫描,等待(几秒钟)然后重新启动扫描。重复。

任何人都可以指出更好的方法吗?例如,将外围设备配置为连接到多个 Central?

4

3 回答 3

8

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

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
于 2013-05-16T08:56:40.860 回答
5

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

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

顺便说一句,默认情况下CBCentralManager只会调用此方法一次。如果您需要在每次CBCentralManager收到广告数据包时调用此回调,您需要使用CBCentralManagerScanOptionAllowDuplicatesKey设置为的选项启动扫描YES

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

请注意,如果不是绝对必要,Apple 不鼓励使用此选项。

请参阅:iOS 开发人员库 - 与远程外围设备交互的最佳实践

于 2015-08-31T14:35:40.530 回答
2

我用这段代码解决了这类问题,基本上只是在每次处理广告时重新开始扫描。我遇到了同样的问题,即 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];
}
于 2016-11-22T16:20:58.713 回答