核心蓝牙:CBPeripheral 每约 10 秒断开一次
Core Bluetooth: CBPeripheral disconnects every ~10 seconds
我在 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 秒后,此过程重复进行。
这是一个错误还是我做错了什么?
我也试过在外设上直接订阅一个特性,但是好像没有任何改变。
这是预期的行为。蓝牙设计为消耗极少的能量,因此它会尽快断开连接。同样至少在 iOS 7 中,没有必要重新发现外围设备 - 您可以在断开连接后重新连接到已发现的设备。我很确定 iOS 也是如此 8. 如果您不需要永久连接,推荐使用 BLE 的方法是:
- 发现
- 连接
- Read/write你需要的尽快
- 设置定时器
- 当计时器触发时转到第 2 点
如果您需要永久连接(例如,您需要实时获取有关心率的数据),您应该使用 - setNotifyValue:forCharacteristic:
订阅特征
When you enable notifications for characteristic’s value, the
peripheral calls the
peripheral:didUpdateNotificationStateForCharacteristic:error: method
of its delegate object to notify your app when the characteristic’s
value changes. Because it is the peripheral that chooses when to send
an update, your app should be prepared to handle them as long as
notifications or indications remain enabled.
它帮助我不时将消息(不是命令 - 任何东西)发送回外围设备。
我在 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 秒后,此过程重复进行。
这是一个错误还是我做错了什么?
我也试过在外设上直接订阅一个特性,但是好像没有任何改变。
这是预期的行为。蓝牙设计为消耗极少的能量,因此它会尽快断开连接。同样至少在 iOS 7 中,没有必要重新发现外围设备 - 您可以在断开连接后重新连接到已发现的设备。我很确定 iOS 也是如此 8. 如果您不需要永久连接,推荐使用 BLE 的方法是:
- 发现
- 连接
- Read/write你需要的尽快
- 设置定时器
- 当计时器触发时转到第 2 点
如果您需要永久连接(例如,您需要实时获取有关心率的数据),您应该使用 - setNotifyValue:forCharacteristic:
订阅特征When you enable notifications for characteristic’s value, the peripheral calls the peripheral:didUpdateNotificationStateForCharacteristic:error: method of its delegate object to notify your app when the characteristic’s value changes. Because it is the peripheral that chooses when to send an update, your app should be prepared to handle them as long as notifications or indications remain enabled.
它帮助我不时将消息(不是命令 - 任何东西)发送回外围设备。