连续扫描iOS CoreBluetooth Central Manager?

Jon*_*han 8 peripherals bluetooth ios core-bluetooth bluetooth-lowenergy

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

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

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

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

Abo*_*oud 8

外围设备无法连接到多个中心.但是如果你需要捕获RSSI,那么你甚至不需要连接.扫描设备可以使用此功能检索RSSI:

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
Run Code Online (Sandbox Code Playgroud)

  • 是的,你可以在didDiscoverPeripheral函数中重新启动扫描,并且你将永远快速获得RSSI. (4认同)
  • 是的,但我需要不断获得更新的RSSI.我的发现是,一旦中央管理器发现并重新发现外围设备几次,它就会停止发现它(似乎大约3秒),即使扫描仍在继续.我剩下的就是需要重复重新启动扫描以尝试获取更新的RSSI值. (3认同)
  • 谢谢.这样可行.为了节省电力,我实际上在100ms后停止扫描,然后每秒钟做一次100ms的爆发.效果很好. (2认同)

Dar*_*llo 5

至于上一个答案,如果您只对RSSI感兴趣,可以直接将其放入委托方法:

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
Run Code Online (Sandbox Code Playgroud)

BTW,默认情况下,CBCentralManager只会调用此方法一次.如果你需要这个回调被称为每次时间CBCentralManager接收到广播数据包,你需要启动与扫描选项CBCentralManagerScanOptionAllowDuplicatesKey设置为YES:

NSDictionary *scanningOptions = @{CBCentralManagerScanOptionAllowDuplicatesKey: @YES};
[centralManager scanForPeripheralsWithServices:nil options:scanningOptions];
Run Code Online (Sandbox Code Playgroud)

请注意,如果不是绝对必要,Apple会阻止使用此选项.

请参阅:iOS Developer Library - 与远程外围设备交互的最佳实践