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.
И по умолчанию он использует тот, который всегда возвращает пустой список (
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(¶ms, sizeof(params));
params.dwSize = sizeof(params);
QList<QBluetoothHostInfo> foundAdapters;
HANDLE hRadio = nullptr;
if (const HBLUETOOTH_RADIO_FIND hSearch = ::BluetoothFindFirstRadio(¶ms, &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
.