中央应用程序是否有任何方法可以检测外围设备何时断电并因此断开连接?
我试着使用这个:func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) { bleCentralManagerDelegate?.disconnectFromDeviceBLEResult(result: true)}
但是,只有当外围设备请求实际断开连接时,才会调用此事件,而如果外围设备随机关闭,则不会调用此事件。
感谢
不幸的是没有。一般BLE断开通常具有";断开原因";作为断开连接事件的一部分(见此(,但这是不可靠的,而且在任何情况下,CoreBluetooth都不会直接暴露这一点。我说";不直接暴露这个";因为您确实将error参数作为事件的一部分,但这并不是对堆栈上发生的实际断开原因的直接映射。
你能做的唯一变通办法是你自己添加智能。换句话说,当外围设备即将关闭或电池电量非常低时,它可以向中央设备发送该信息(通过GATT写入/通知(,让它知道由于电池电量不足,它将断开连接。
查看以下链接以获取更多信息:-
- 了解BLE断开连接
- 核心蓝牙CBError
这就是您想要的吗?
func centralManagerDidUpdateState(_ central: CBCentralManager) {
let cState = central.state
switch cState {
case .unknown:
if ( preLogLevel == "LOGLEVEL" ) {
CSVfuncs.writeLog(">>BT central.state is .unknown")
}
case .resetting:
if ( preLogLevel == "LOGLEVEL" ) {
CSVfuncs.writeLog(">>BT central.state is .resetting")
}
case .unsupported:
if ( preLogLevel == "LOGLEVEL" ) {
CSVfuncs.writeLog(">>BT central.state is .unsupported")
}
case .unauthorized:
if ( preLogLevel == "LOGLEVEL" ) {
CSVfuncs.writeLog(">>BT central.state is .unauthorized")
}
case .poweredOff:
if ( preLogLevel == "LOGLEVEL" ) {
CSVfuncs.writeLog(">>BT central.state is .poweredOff")
}
case .poweredOn:
if ( preLogLevel == "LOGLEVEL" ) {
CSVfuncs.writeLog(">>BT central.state is .poweredOn")
}
centralManager.scanForPeripherals(withServices: servicesInterested)
@unknown default:
if ( preLogLevel == "LOGLEVEL" ) {
CSVfuncs.writeLog(">>BT central.state is Unknown Default")
}
break
// unknown default
}
}