Здравствуйте. Помогите пожалуйста решить одну проблему.
Пишу приложение для обмена с BLE устройством и qt предлагает использование класса QLowEnergyController.
Как таковая коммуникация и обмен данным с устройством у меня получилась, но возникла одна проблема. QLowEnergyController предлагает методы (в частности connectToDevice) работающие в асинхронном режиме, то есть при выполнении срабатывает сигнал. Но мне необходим синхронный вызов методов (в идеале по тайм-ауту) так как уже в приложении есть другой клиент основе QTcpSocket работающий в синхронном режиме и хочется просто сделать по аналогии его методы. Решение с помощью QEventLoop не помогает так пока выполняется ожидание может повторно вызваться метод вызывающий connectToDevice. То есть нужно примерно такой код:
bool MyBluetooth::doConnect(QBluetoothAddress address)
{
control = new QLowEnergyController(address, nullptr);
control->connectToDevice();
if (!control->waitForConnected(3000)) return false; // !!! данного метода у класса не существует
return true;
}
Кроме того пытался решить проблему перенеся экземпляр класса QLowEnergyController в отдельный поток. Но это у меня не получилось, экземпляр оставался в том же потоке. Вот код как я это делал:
bool MyBluetooth::doConnect(QBluetoothAddress address)
{
control = new QLowEnergyController(address, nullptr);
connect(control, SIGNAL(connected()), this, SLOT(controlConnected()));
connect(control, SIGNAL(error(QLowEnergyController::Error)), this, SLOT(controlError(QLowEnergyController::Error)));
controlThread = new QThread;
control->moveToThread(controlThread);
connecting = true;
errorCode = 0;
controlThread->start();
control->connectToDevice();
while(connecting);
return !errorCode;
}
void MyBluetooth::controlConnected()
{
connecting = false;
}
void MyBluetooth::controlError(QLowEnergyController::Error newError)
{
errorCode = newError;
connecting = false;
}