1 (04.03.2011 13:11:18 отредактировано Yana)

Тема: Bluetooth и QLocalSocket

Добавляю к своему приложению для N900 возможность получать информацию от датчика пульса Zephyr. Установить bluetooth-соединение средствами BlueZ:

struct sockaddr_rc endpoint;
endpoint.rc_family = AF_BLUETOOTH;
endpoint.rc_bdaddr = remoteDevice;
endpoint.rc_channel = channel;

btHandle = ::socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
status = ::connect(btHandle, (struct sockaddr*)&endpoint, sizeof(endpoint));

Как мне теперь превратить установленное соединение в QLocalSocket, чтобы читать данные средствами Qt?

Поделиться

2

Re: Bluetooth и QLocalSocket

для написания переносимого (в будущем) приложения лучше воспользоваться qt mobility/connectivity api
http://doc.qt.nokia.com/qtmobility-1.2/ … y-api.html
все будет родное и никаких замороче не будет

Сайт nsl

Поделиться

3

Re: Bluetooth и QLocalSocket

nsl пишет:

для написания переносимого (в будущем) приложения лучше воспользоваться qt mobility/connectivity api
http://doc.qt.nokia.com/qtmobility-1.2/ … y-api.html
все будет родное и никаких замороче не будет

А как его поставить на телефон (я собираю программу непосредственно на телефоне)? Старая версия ставится просто - apt-get install libqtm-dev...

Поделиться

4

Re: Bluetooth и QLocalSocket

Yana пишет:

Старая версия ставится просто - apt-get install libqtm-dev...

apt-get install libqtm-12-dev

Поделиться

5

Re: Bluetooth и QLocalSocket

Yana пишет:

Добавляю к своему приложению для N900 возможность получать информацию от датчика пульса Zephyr.

А что это за датчик? Продаются в России/Украине?
Я просто пользую штатный Polar WearLink, но там протокол закрыт и его ни к чему не прикрутишь. sad

---
Быть мрачным и непонятным очень просто. Охрененно трудно быть добрым и ясным. (с) Стивен Содеберг.

Сайт divan

Поделиться

6 (04.03.2011 18:32:51 отредактировано Yana)

Re: Bluetooth и QLocalSocket

Avis, спасибо. Попробую.

Такой вопрос - попыталась собрать программу со встроенной переменной QLocalSocket btSocket. Не собирается. Если прописываю #include <QtNetwork>, ошибка при компиляции:
error: QtNetwork: No such file or directory.
Прописываю #include <QtNetwork/QLocalSocket> (он существует) - ошибка возникает при линковке:
Bluetooth.cpp: (.text+0xbc): undefined reference to `QLocalSocket::QLocalSocket(QObject*)'

В .pro, вроде, все прописано:

Qt += core \
     qui \
     network

CONFIG += mobility
MOBILITY += location connectivity
LIBS += -lbluetooth -L/opt/usr/lib -lrxsupport

Добавлено: 04.03.2011 18:31:52

divan пишет:

А что это за датчик? Продаются в России/Украине?
Я просто пользую штатный Polar WearLink, но там протокол закрыт и его ни к чему не прикрутишь. sad

Zephyr HxM Bluetooth. Покупала на сайте производителя developers kit за $99 (плюс доставка) - но пришел "голый" датчик, без документации, API и прочего обещанного. На письма c запросом по поводу более продвинутого датчика и по поводу доков к купленному - не получила ни одного ответа. Но есть приложение для N900, которое работает с этим датчиком: http://www.google.ru/url?sa=t&sourc … mp;cad=rja, так что разбираюсь с протоколом по исходникам.

Поделиться

7

Re: Bluetooth и QLocalSocket

Не ставится libqtm-12-dev sad Репозитарии просят публичных ключей. Будем разбираться...

Поделиться

8 (05.03.2011 15:09:28 отредактировано Yana)

Re: Bluetooth и QLocalSocket

Если я пишу программу с использованием QtMobility 1.2 - значит ли это, что для ее работы пользователь должен будет дополнительно установить библиотеку на свой телефон (apt-get install libqtm-12)?

Поделиться

9

Re: Bluetooth и QLocalSocket

Yana если ты сделаешь deb и она будет в зависимостях + твое приложения будет устанавливаться из репозитария (пусть даже собственного), то все что нужно само подтянется

Сайт nsl

Поделиться

10

Re: Bluetooth и QLocalSocket

nsl пишет:

Yana если ты сделаешь deb и она будет в зависимостях + твое приложения будет устанавливаться из репозитария (пусть даже собственного), то все что нужно само подтянется

Что-то ничего у меня не собирается - ни QLocalSocket'ы не удалось добавить в программу, ни Phonon задействовать (хорошо, видео мне нужно совсем простое - удастся обойтись QMovie). Так что поставила QtMobile 1.2 - попробую с ним поработать. Зато удалось установить соединение с BT-девайсом. Делюсь кодом - вдруг кому-то пригодится smile

int Bluetooth::findSerialPort(const bdaddr_t* addr, const uuid_t* uuid) {
   uint32_t range = 0x0000FFFF;
   sdp_session_t* session = sdp_connect(BDADDR_ANY, addr, SDP_RETRY_IF_BUSY);
   if (session != NULL) {
     uuid_t identifier;

     if (uuid == NULL) {
       sdp_uuid16_create(&identifier, RFCOMM_UUID);
       uuid = &identifier;
     }

     sdp_list_t* search_list = sdp_list_append(NULL, (uuid_t*)uuid);
     sdp_list_t* attribute_list = sdp_list_append(NULL, &range);
     sdp_list_t* response_list = NULL;

     int status = sdp_service_search_attr_req(
       session, search_list, SDP_ATTR_REQ_RANGE, attribute_list, &response_list);
     if (status == 0) {
       sdp_list_t* proto_list = NULL;
       for (sdp_list_t* entry = response_list; entry != NULL;
         entry = entry->next) {
         sdp_record_t* record = (sdp_record_t*)entry->data;
         if (sdp_get_access_protos(record, &proto_list) == 0) {
           port = sdp_get_proto_port(proto_list, RFCOMM_UUID);
           sdp_list_free(proto_list, 0);
         }
         sdp_record_free(record);
       }
     }
     sdp_list_free(response_list, 0);
     sdp_list_free(search_list, 0);
     sdp_list_free(attribute_list, 0);
     sdp_close(session);
     return port;
   }
   return -1;
}

int Bluetooth::connectSerialPort(bdaddr_t remote, int channel) {
   struct sockaddr_rc endpoint;
   endpoint.rc_family = AF_BLUETOOTH;
   endpoint.rc_bdaddr = remote;
   endpoint.rc_channel = (uint8_t)channel;

   btHandle = ::socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
   if (btHandle < 0) {
     return -1;
   }
   int status = ::connect(btHandle, (struct sockaddr*)&endpoint, sizeof(endpoint));
   if (status < 0) {
     return -1;
   }
   return 0;
}

bdaddr_t address;
int port;
str2ba("00:01:02:03:04:05", &address); // Здесь у меня для простоты был введен адрес нужного мне устройства
port = findSerialPort(&address, NULL);
if (connectSerialPort(address, port)) {
 ...
}

Поделиться

11 (11.03.2011 17:17:17 отредактировано Yana)

Re: Bluetooth и QLocalSocket

nsl пишет:

для написания переносимого (в будущем) приложения лучше воспользоваться qt mobility/connectivity api

Поставила libqtm-12-dev. Добавила в .pro-файл:

CONFIG += mobility
MOBILITY = location connectivity
INCLUDEPATH += /opt/qtm12/include
DEPENDPATH += /opt/qtm12/include
LIBS += -lbluetooth -L/opt/usr/lib -L/opt/qtm12/lib

При добавлении в исходник строки
#include <QtConnectivity/QBluetoothAddress>
компилятор ругается:
qbluetoothaddress.h: No such file or directory
И действительно, файла qbluetoothaddress.h, на который ссылается QBluetoothAddress - на диске нет.

Видимо, что-то еще нужно доустановить? Поискала что-то вроде libqtm-12-headers - не нашла... При этом использование функций location нормально проходит - все собирается.

Та же проблема с QLocalSocket. Заголовочные файлы есть, но при линковке идет ругань на отсутствие QLocalSocket::QLocalSocket. С Phonon - то же самое (правда, тут спокойно обошлась QMovie).

Пожалуйста, посоветуйте, как исправить положение...

P.S.: с Phonon, кажется, разобралась - нужно было вместо VideoPlayer и пр. использовать Phonon::VideoPlayer. А вот с connectivity по-прежнему засада...

Насколько крив будет следующий вариант? Отсутствующие заголовочные файлы (qbluetoothaddress.h и пр.) имеются в скачанных мною исходниках QtMobility 12. Есть ли смысл прописать к ним путь - или этого будет недостаточно, т.к., возможно, отсутствует еще что-то необходимое?

Поделиться

12 (11.03.2011 18:34:49 отредактировано Yana)

Re: Bluetooth и QLocalSocket

nsl пишет:

для написания переносимого (в будущем) приложения лучше воспользоваться qt mobility/connectivity api

А ты уверен? Идем на http://doc.qt.nokia.com/qtmobility-1.2/index.html и смотрим: Connectivity отмечена в табличке как ALPHA и выделена для всех осей серым цветом, что означает: "A functional backend for the API on the platform is not being worked on. It is possible for others to implement and integrate support", то есть ничего не готово - реализуйте функционал сами, если не влом...

Что же за засада с этим Bluetooth! Вроде бы тривиальная задача...

Поделиться

13

Re: Bluetooth и QLocalSocket

Yana, упс, не уверен smile в смысле на перспективу, конечно, будет хорошо... но, боюсь, перспектива появится через пол года, если не больше :-( видимо имеет смысл все выделить в отдельный модуль, а потом заменить

P.S.: по ходу дела... посмотрел в разных реализациях MeeGo - там тоже нет этих заголовочных файлов :-( хотя судя по changelog'ам они connectivity api якобы добавляли :-( интересно, а будет ли в релизе все как нужно, или опять как получится...

Сайт nsl

Поделиться