Я пытаюсь понять, почему переподключение к устройству BLE не удается с Qt.
Моя система — Ubuntu 14.04 со встроенным BT-адаптером, использующая бета-версию Qt 5.5.0 (случалось также с Qt 5.4.0).
По сути, я пытаюсь повторно подключиться к устройству BLE, такому же или другому, после того, как решу отключиться от устройства BLE. Обратите внимание, что первое соединение в порядке и работает в порядке.
Ошибка я получаю сразу после выполнения m_control->connectToDevice();
является QLowEnergyController::UnknownError
,
Заглушка соединительной части (на основе примера кода):
m_control = new QLowEnergyController(QBluetoothAddress(connection_string), this);
connect(m_control, SIGNAL(serviceDiscovered(QBluetoothUuid)),
this, SLOT(serviceDiscovered(QBluetoothUuid)));
connect(m_control, SIGNAL(discoveryFinished()),
this, SLOT(serviceScanDone()));
connect(m_control, SIGNAL(error(QLowEnergyController::Error)),
this, SLOT(controllerError(QLowEnergyController::Error)));
connect(m_control, SIGNAL(connected()),
this, SLOT(deviceConnected()));
connect(m_control, SIGNAL(disconnected()),
this, SLOT(deviceDisconnected()));
m_control->connectToDevice();
И часть отключения:
if (m_control->state() != QLowEnergyController::UnconnectedState) {
m_control->disconnectFromDevice();
}
delete m_control;
m_control = NULL;
Единственный способ восстановить соединение — сбросить BT-адаптер или сбросить удаленное BT-устройство. Я также не могу сканировать устройство после отключения программного обеспечения, поэтому я предполагаю, что оно все еще связано с ПК.
Я делаю что-то не так в процессе?
Вы подписались на какие-либо уведомления? Я вижу только часть отключения, но нет отписавшейся части. Интересно, это потому, что ваше предыдущее соединение перевело периферийное устройство в состояние, которое не подходит для нового соединения.
Вам необходимо отписаться от уведомления:
//disable notifications
if (m_notificationDesc.isValid() && m_service) {
m_service->writeDescriptor(m_notificationDesc, QByteArray::fromHex("0000"));
} else {
m_control->disconnectFromDevice();
delete m_service;
m_service = 0;
}