Qt如何在Linux中以编程方式正确连接电话(蓝牙A2DP,AVRCP,HSP,HFP)

时间:2018-10-06 17:55:50

标签: qt bluetooth bluez pulseaudio a2dp

我正在尝试开发一个使用bluez堆栈,pulseaudio和ofono的应用程序,以便连接到电话并完成诸如媒体播放(A2DP),媒体控制(AVRCP)和免提电话(HFP)之类的任务)。当我通过bluetoothctl连接到手机时,它将自动连接到所有可用的配置文件,因此可以通过程序使用所有配置文件A2DP,AVRCP和HFP。如果我没有使用bluetoothctl连接到手机,则onono中不会启用免提/ HFP调制解调器。

但是,当我在Qt中使用QBluetoothSocket并使用配置文件进行连接时,总是会有未连接的配置文件。例如,连接到免提配置文件,电话就可以,但是媒体控件不起作用。简而言之,我希望能够像bluetoothctl一样连接到蓝牙。我在Qt中的内容如下(简称):

static const QList<QBluetoothUuid> audioUuids = QList<QBluetoothUuid>()
        << QBluetoothUuid::HeadsetAG
        << QBluetoothUuid::AV_RemoteControlTarget;
..
void BtConnection::setConnection(int index)
{
    if(m_bluetoothSocket == nullptr) {
        m_bluetoothSocket = new QBluetoothSocket(QBluetoothServiceInfo::RfcommProtocol);
        qDebug() << "Created Bluetooth Socket";
    }
    if(m_bluetoothSocket != nullptr) {
        connect(m_bluetoothSocket, SIGNAL(connected()), this, SLOT(connected()));
        connect(m_bluetoothSocket, SIGNAL(disconnected()), this, SLOT(disconnected()));
        connect(m_bluetoothSocket, SIGNAL(error(QBluetoothSocket::SocketError)),
                this, SLOT(connectionError(QBluetoothSocket::SocketError)));
    }

    m_device = get(index);

    // Check if an element in m_device.serviceUuids() match with an element in audioUuids
    QList<QBluetoothUuid>::const_iterator uuid;
    for (uuid = audioUuids.begin(); uuid != audioUuids.end(); ++uuid) {
        if(m_device.serviceUuids().indexOf(*uuid) > 0) {
            // This device supports one of the uuids we have scanned for
            if(m_bluetoothSocket != nullptr) {
                qDebug() << "*****Connecting...   " << *uuid;
                m_bluetoothSocket->connectToService(m_device.address(), *uuid);
                return;
            }
        }
    }
    qDebug() << "*****Cannot connect to service...";
}

如果您不清楚,我愿意发布更多代码。像bluetoothctl一样,在如何使用Qt连接到蓝牙方面,任何帮助都将受到极大的赞赏。

1 个答案:

答案 0 :(得分:2)

不是直接答案,但是您可能要检查KDE的KDEConnect项目。它已经满足了您的期望,并且可能是灵感的来源,也可以为该项目做出贡献。