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

时间:2015-04-18 09:53:11

标签: ios bluetooth 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()
}
  • 连接后,我会发现服务和特征。

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

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

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

2 个答案:

答案 0 :(得分:8)

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

  1. 发现
  2. 连接
  3. 尽快读取/写入您需要的所有内容
  4. 设置计时器
  5. 当计时器点火进入第2点时
  6. 如果您需要永久连接(例如,您需要实时获取有关心率的数据),您应该使用- setNotifyValue:forCharacteristic:订阅特征

      

    启用特征值的通知时,   外围电话称   peripheral:didUpdateNotificationStateForCharacteristic:error:方法   其特权的代理对象通知您的应用程序   价值变化。因为它是选择何时发送的外围设备   更新,您的应用程序应该准备好处理它们,只要   通知或指示仍然有效。

答案 1 :(得分:0)

它帮助我不时向外围设备发送消息(不是命令 - 任何东西)。