Qt Как правильно подключиться к телефону программно (Bluetooth A2DP, AVRCP, HSP, HFP) в Linux - PullRequest
0 голосов
/ 06 октября 2018

Я пытаюсь разработать приложение, которое использует стек bluez вместе с pulseaudio и ofono для подключения к телефону и выполнения таких задач, как воспроизведение мультимедиа (A2DP), управление мультимедиа (AVRCP) и телефония на основе громкой связи (HFP).).Когда я подключаюсь к своему телефону через bluetoothctl, он автоматически подключается ко всем доступным профилям, поэтому использование всех профилей A2DP, AVRCP, HFP через мою программу достижимо.Если я не подключаюсь к телефону с помощью bluetoothctl, модем громкой связи / HFP не включен / не включен в режиме ofono.

Однако, когда я использую QBluetoothSocket в Qt и подключаюсь с помощью профиля, всегда есть профиль, который не подключен.Например, при подключении к профилю Handsfree телефония работает, но управление мультимедиа не работает.Короче говоря, я хочу иметь возможность подключаться к Bluetooth как 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...";
}

Я был бы готов выложить больше кода, если вам это не понятно.С благодарностью приветствуется любая помощь по подключению к bluetooth с Qt, как bluetoothctl.

1 Ответ

0 голосов
/ 08 октября 2018

Не прямой ответ, но вы можете проверить проект KDE KDEConnect .Он уже делает то, что вы ищете, и может быть источником вдохновения или вы могли бы внести свой вклад в проект.

...