Qt How to properly connect to a phone programmatically (Bluetooth A2DP, AVRCP, HSP, HFP) in Linux

960 Views Asked by At

I am trying to develop an application that uses bluez stack along with pulseaudio and ofono in order to connect to a phone and achieve tasks such as media playback (A2DP), media control (AVRCP), and handsfree-based telephony (HFP). When I connect to my phone through bluetoothctl, it automatically connects to all the available profiles, so using all profiles A2DP, AVRCP, HFP through my program is achievable. If I don't connect to my phone using bluetoothctl, handsfree /HFP modem is not enabled/powered in ofono.

However, when I use QBluetoothSocket in Qt and connect using a profile, there is always a profile that is not connected. For example connecting to Handsfree profile, telephony works, but the media control does not work. In short, I want to be able to connect to bluetooth as bluetoothctl does. What I have in Qt is as follows (in short):

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...";
}

I would be willing to post more of the code if this is not clear to you. Any help is greately appreciated on how to connect to bluetooth with Qt as bluetoothctl does.

1

There are 1 best solutions below

1
On

Not a direct answer but you might want to check KDE's KDEConnect project. It already does what you are looking for and might either be a source of inspiration or you could contribute to the project.