【问题标题】:Continuous scanning for iOS CoreBluetooth Central Manager?持续扫描 iOS CoreBluetooth Central Manager?
【发布时间】:2013-05-10 18:18:12
【问题描述】:

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

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

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

谁能指出更好的方法?例如,将外围设备配置为连接到多个 Central?

【问题讨论】:

    标签: ios bluetooth core-bluetooth bluetooth-lowenergy peripherals


    【解决方案1】:

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

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

    【讨论】:

    • 是的,但我需要不断获得更新的 RSSI。我的发现是,一旦 Central Manager 多次发现并重新发现外围设备,即使继续扫描,它也会停止发现它(似乎大约 3 秒)。我剩下的是需要重复重新启动扫描以尝试获取更新的 RSSI 值。
    • 是的,您可以在 didDiscoverPeripheral 函数中重新启动扫描,这样您将永远快速获得 RSSI。
    • 谢谢。这样可行。为了节省电力,我实际上在 100 毫秒后停止扫描,然后每秒左右进行 100 毫秒的突发。效果很好。
    • 您能否指出一个外围设备无法连接到多个中心的文档?在 CBCentralManagerDelegate 中有一个函数叫做 - (void)centralManager:(CBCentralManager *)central didRetrieveConnectedPeripherals:(NSArray *)peripherals,其中 peripherals 是一个数组。
    • 嗨乔纳森,你能发布你的sn-ps代码吗?
    【解决方案2】:

    至于上一个答案,如果你只对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 Developer Library -Best Practices for Interacting with a Remote Peripheral Device

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 这行得通。我最终也延迟了限制扫描频率。
      猜你喜欢
      • 2014-01-22
      • 2012-12-02
      • 2014-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-03
      • 2013-03-09
      • 1970-01-01
      相关资源
      最近更新 更多