iOS SWIFT - 检测外围设备从中央关闭

问题描述

中央应用程序是否有任何方法可以检测外围设备何时耗尽电源并因此断开连接?

我尝试使用这个: func centralManager(_ central: CBCentralManager,diddisconnectPeripheral peripheral: CBPeripheral,error: Error?) { bleCentralManagerDelegate?.disconnectFromDeviceBLEResult(result: true)}

但是只有当外围设备请求实际断开连接时才会调用此事件,如果外围设备随机关闭则不会调用

谢谢

解决方法

不幸的是没有。通用 BLE 断开连接通常将“断开连接原因”作为断开连接事件的一部分(参见 this),但这并不可靠,并且在任何情况下 CoreBluetooth 都不会直接暴露这一点。我说“不直接公开这个”是因为您确实将 error 参数作为事件的一部分,但这不是对堆栈上发生的实际断开连接原因的直接映射。

您唯一可以做的解决方法是自己添加智能。换句话说,当外围设备即将关闭或电池电量非常低时,它可以将该信息发送到中央设备(通过 GATT 写入/通知),让它知道它即将断开连接,因为电池电量不足低。

查看以下链接了解更多信息:-

,

这是您要找的吗?

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
}

}