2

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!即使我可以使用QBluetoothAPI 搜索连接远程设备。

知道 BLE 适配器是否可用的正确方法是什么?

4

1 回答 1

0

正确的解决方案是使用isBluetoothAvailable1(),因为调用allDevices()列出了所有连接的蓝牙适配器。但是,这不适用于 Windows。

我不完全理解他们的推理,但在 Qt 中有 2 个 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;
}

您还需要链接必要的库Bthpropsws2_32.

于 2021-08-26T06:12:14.217 回答