QtBluetooth Win10, как проверить, доступен ли адаптер Bluetooth и включен ли?

Я использую QtBluetooth под Win10. Работает отлично.

Однако, поскольку мое приложение развернуто как на ноутбуках (которые могут иметь или не иметь адаптер BT), так и на настольных компьютерах (которые, скорее всего, не имеют адаптера), я хотел бы программно проверить, доступен ли адаптер или нет (присутствует и включен).

Учитывая документацию, я протестировал 4 функции:

bool isBluetoothAvailable1()
{
    return !QBluetoothLocalDevice::allDevices().empty();
}

bool isBluetoothAvailable2()
{
    QBluetoothLocalDevice localDevice;
    return localDevice.isValid();
}

bool isBluetoothAvailable3()
{
    std::shared_ptr<QLowEnergyController> created( QLowEnergyController::createPeripheral() );
    if ( created )
    {
        if ( !created->localAddress().isNull() )
            return true;
    }
    return false;
}

bool isBluetoothAvailable4()
{
    std::shared_ptr<QLowEnergyController> created( QLowEnergyController::createCentral( QBluetoothDeviceInfo() ) );
    if ( created )
    {
        if ( !created->localAddress().isNull() )
            return true;
    }
    return false;
}

Но когда я запускаю свой код на ноутбуке с Win10, они все возвращают false! Даже если я могу найти подключиться к удаленному устройству с помощью QBluetooth API.

Какой правильный способ узнать, доступен ли адаптер BLE?

1 ответ

Правильным решением было бы использовать isBluetoothAvailable1() потому что звонок allDevices()перечисляет все подключенные адаптеры Bluetooth. Однако в Windows это не работает.

Я не совсем понимаю их рассуждения, но в Qt есть две реализации этой функции для Windows.

https://code.qt.io/cgit/qt/qtconnectivity.git/tree/src/bluetooth/qbluetoothlocaldevice_win.cpp?h=5.15.2

https://code.qt.io/cgit/qt/qtconnectivity.git/tree/src/bluetooth/qbluetoothlocaldevice_winrt.cpp?h=5.15.2

И по умолчанию он использует тот, который всегда возвращает пустой список ( qbluetoothlocaldevice_win.cpp).

      QList<QBluetoothHostInfo> QBluetoothLocalDevice::allDevices()
{
    QList<QBluetoothHostInfo> localDevices;
    return localDevices;
}

Самое простое решение - использовать код из другой работающей реализации Windows ( qbluetoothlocaldevice_winrt.cpp)

      #include <Windows.h>
#include <BluetoothAPIs.h>

QList<QBluetoothHostInfo> allDevices()
{
    BLUETOOTH_FIND_RADIO_PARAMS params;
    ::ZeroMemory(&params, sizeof(params));
    params.dwSize = sizeof(params);

    QList<QBluetoothHostInfo> foundAdapters;

    HANDLE hRadio = nullptr;
    if (const HBLUETOOTH_RADIO_FIND hSearch = ::BluetoothFindFirstRadio(&params, &hRadio)) {
        for (;;) {
            BLUETOOTH_RADIO_INFO radio;
            ::ZeroMemory(&radio, sizeof(radio));
            radio.dwSize = sizeof(radio);

            const DWORD retval = ::BluetoothGetRadioInfo(hRadio, &radio);
            ::CloseHandle(hRadio);

            if (retval != ERROR_SUCCESS)
                break;

            QBluetoothHostInfo adapterInfo;
            adapterInfo.setAddress(QBluetoothAddress(radio.address.ullLong));
            adapterInfo.setName(QString::fromWCharArray(radio.szName));

            foundAdapters << adapterInfo;

            if (!::BluetoothFindNextRadio(hSearch, &hRadio))
                break;
        }

        ::BluetoothFindRadioClose(hSearch);
    }

    return foundAdapters;
}

Также вам нужно будет подключить необходимые библиотеки Bthprops а также ws2_32.

Другие вопросы по тегам