低功耗蓝牙规范并没有说明外设是否可以同时连接多个中心,但我的经验测试告诉我它们不能。
因为我的应用程序需要与外设建立非占有关系(即没有连接,这会阻止其他连接),并且需要不断更新它们的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];
}