Russian Qt Forum
Ноябрь 25, 2024, 10:12 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Синхронный Bluetooth LE  (Прочитано 2284 раз)
astarot
Гость
« : Сентябрь 03, 2018, 14:19 »

Здравствуйте. Помогите пожалуйста решить одну проблему.

Пишу приложение для обмена с 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;  
}


« Последнее редактирование: Сентябрь 04, 2018, 13:14 от astarot » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.049 секунд. Запросов: 21.