如何知道iOS中的蓝牙设备是否已连接?

fcy6dtqo  于 11个月前  发布在  iOS
关注(0)|答案(3)|浏览(309)

了解蓝牙设备如何连接的最佳方法是什么?我正在使用CBCentralManager来识别蓝牙是否已打开,但我无法找到如何识别蓝牙设备是否已连接。
我正在通过连接的蓝牙设备实现AVAudioSession呼叫的路由,但AudioSession类别更改被反复调用,因此我无法找到蓝牙设备是否连接。如果有人试图实现此行为,您的输入可能会有所帮助。请分享信息。

hgtggwj0

hgtggwj01#

您在这里描述的蓝牙是一种音频设备,几乎可以肯定是“经典”蓝牙。这与CoreBluetooth无关,它主要通过BLE处理GATT连接(沿着其他一些较少使用的协议)。您无法找到有关使用CoreBluetooth连接的音频设备的任何信息。
要检查您的音频路由,请参阅AVAudioSesssion. currentRoute. outputs。portType将告诉您它是否是蓝牙设备。请注意,有几种类型可以归类为“蓝牙”,以供您使用:

  • bluetoothA 2DP:高品质音乐(单向)
  • bluetoothHFP:双向(麦克风/扬声器)语音;低质量
  • carAudio:CarPlay(非CarPlay系统为A2 DP或HFP)
  • 蓝牙LE:助听器。虽然这是BLE,但它不是CoreBluetooth的一部分。
fae0ux8s

fae0ux8s2#

我正在使用CBPeripheral.state == .connected检查BLE设备的状态。
从文档中:

/**
 *  @enum CBPeripheralState
 *
 *  @discussion Represents the current connection state of a CBPeripheral.
 *
 */
@available(iOS 7.0, *)
public enum CBPeripheralState : Int {

    
    case disconnected = 0

    case connecting = 1

    case connected = 2

    @available(iOS 9.0, *)
    case disconnecting = 3
}

字符串

hs1rzwqc

hs1rzwqc3#

使用通知中心

NotificationCenter.default.addObserver(
   self,
   selector: #selector(handleAudioSessionRouteChange(_:)),
   name: NSNotification.Name.AVAudioSessionRouteChange,
   object: nil)

    @objc private func handleAudioSessionRouteChange(_ notification: Notification) {
            guard let userInfo = notification.userInfo,
                  let reasonValue = userInfo[AVAudioSessionRouteChangeReasonKey] as? UInt,
                  let reason = AVAudioSession.RouteChangeReason(rawValue: reasonValue) else {return}
            switch reason {
            case .newDeviceAvailable:
                let session = AVAudioSession.sharedInstance()
                for output in session.currentRoute.outputs {
                    print("Bluetooth A2DP device connected: \(output.portName)")
                    self.speakerButton.setImage(UIImage(systemName: "s.circle.fill"), for: .normal)
                }
            case .oldDeviceUnavailable:
                if let previousRoute = userInfo[AVAudioSessionRouteChangePreviousRouteKey] as? AVAudioSessionRouteDescription {
                    for output in previousRoute.outputs{
                        print("Bluetooth A2DP device disconnected: \(output.portName)")
                        self.speakerButton.setImage(UIImage(named: "speaker-button"), for: .normal)
                    }
                }
            default:
                break
            }
        }
        deinit {
            NotificationCenter.default.removeObserver(self)
        }

字符串
或者您可以使用

func checkBluetoothConnection() {
        let session = AVAudioSession.sharedInstance()
        let connectedBluetoothDevices = session.availableInputs?.filter { input in
            input.portType == .bluetoothHFP || input.portType == .bluetoothLE || input.portType == .bluetoothA2DP
        }
       isBluetoothConnected = connectedBluetoothDevices?.isEmpty == false
    }


第一个选项是当音频路由改变时。
第二个选项查看是否连接了蓝牙,即使AudioSession路由没有改变

相关问题