核心蓝牙:CBPeripheral每隔约10秒钟断开连接

des*_*top 6 bluetooth ios core-bluetooth

我在iOS 8.3中看到一个奇怪的错误,我想知道是否有其他人看到了同样的事情.

我有一个iPad Air(在中央模式下)和一个iPhone 6(在外围模式下)非常接近.

  • CBCentralManager的初始化是使用串行后台队列和CBCentralManagerOptionRestoreIdentifierKey选项
  • 管理员使用该CBCentralManagerScanOptionAllowDuplicatesKey: true选项开始扫描外围设备
  • centralManager:didDiscoverPeripheral:我内部检查已发现的外围设备列表:
let connect: () -> () = {
  peripheral.delegate = self
  self.devices[peripheral.identifier.UUIDString] = peripheral
  self.manager.connectPeripheral(peripheral, options: nil)
}

if let device = devices[peripheral.identifier.UUIDString] {
  if device.peripheral.state == .Disconnected {
    connect()
  }
} else if peripheral.state == .Disconnected {
  connect()
}
Run Code Online (Sandbox Code Playgroud)
  • 连接后,我会发现服务和特征.

现在外围设备在大约10秒后断开连接,立即再次发现并再次连接.10秒后,此程序重复进行.

这是一个错误还是我在这里做错了什么?

我也尝试直接订阅外围设备的特性,但这似乎没有改变任何东西.

Avt*_*Avt 8

这是一种预期的行为.蓝牙设计为消耗非常少的能量,因此它会尽快断开连接.此外,至少在iOS 7中,没有必要重新发现外围设备 - 您可以在断开连接后重新连接到已发现的设备.我非常确定iOS 8也是如此.如果您不需要永久连接,建议使用BLE的方法是:

  1. 发现
  2. 尽快读取/写入您需要的所有内容
  3. 设置计时器
  4. 当计时器点火进入第2点时

如果您需要永久连接(例如,您需要实时获取有关心率的数据),您应该使用- setNotifyValue:forCharacteristic来订阅特征:

当您为特征值启用通知时,外围设备会调用外围设备:didUpdateNotificationStateForCharacteristic:error:其委托对象的方法,以便在特征值更改时通知您的应用.由于外围设备选择何时发送更新,因此只要通知或指示保持启用,您的应用就应该准备好处理它们.