2015-02-26 5 views
0

У меня есть приложение, которое подключается (или должно подключаться) к клиенту к службе Bluetooth на устройстве Android, используя Qt Bluetooth API. Код для этого не является сложным и не сильно отличается от образца, указанного в Qt Bluetooth Overview, хотя он немного распределен, так как он является частью класса.QBluetoothSocket :: connectToService Hanging on ServiceLookupState - Почему?

В конструкторе:

mBluetoothSocket = new QBluetoothSocket(QBluetoothServiceInfo::RfcommProtocol); 

В способе «waitForServiceConnection»:

mBluetoothSocket->connectToService(address, uuid); 

    for (unsigned i = 0; i < timeout; ++i) 
    { 
     QTime delayLimit = QTime::currentTime().addSecs(1); 
     while(QTime::currentTime() < delayLimit) QCoreApplication::processEvents(QEventLoop::AllEvents, 100); 
      qDebug() << "Current socket state is " << mBluetoothSocket->state() << endl; 
      if (mServiceConnected) 
      { 
        return; 
      } 
     } 
    ... 
    } 

Для каждой итерации для цикла (по времени ожидания до 60 секунд) я получаю следующий вывод :

Текущее состояние розетки QBluetoothSocket :: ServiceLookupState

Существует слот socketStateChanged, который принимает сигнал StateChanged из гнезда и содержит следующее:

qDebug() << "Socket state changed to " << socketState << endl; 

, который выводит:

гнездо состояние изменено на QBluetoothSocket :: ServiceLookupState

только один раз. Если я вручную проверю состояние сокета в цикле, это всегда ServiceLookupState.

Я, к сожалению, не на 100% уверен, что точно ServiceLookupState влечет за собой. Qt's documentation on the QBluetoothSocket class

Сокет запрашивает параметры подключения.

, который, как я подозреваю, означает поиск портов или что-то в этом роде.

Клиент рабочего стола успешно находит службу, зарегистрированную на устройстве, с помощью службы QBluetoothServiceDiscoveryAgent. Я протестировал это против хорошо известного Bluetooth-сервиса (образец Android BluetoothChat) с теми же результатами, поэтому я уверен, что проблема связана с настольным клиентом. Что я делаю не так?

Исключения не выбрасываются и QBluetoothSocket :: error() всегда указывает на отсутствие ошибки.

ответ

0

В коде не было ничего плохого - проблема была связана с тем, что он был в библиотеке, которая вызывается из некоторых модульных тестов. Он отлично работает при вызове из стандартного консольного приложения Qt.

Поскольку модульные тесты не могут правильно адресовать компоненты Bluetooth, в любом случае это приемлемо.