Перейти к содержанию
    

Bluetooth c++ winapi

Как взаимодействовать с БТ из винды? Начал использовать "Windows Sockets Support for Bluetooth" но чото лыжи не едут. Делаю следующий алгоритм с winsock

 

Код

 

socket();
connect();
send(sock, array, 8, 0);
shutdown(sock, SD_SEND);
recv();

 

если в дебаге прошагать, то всё прекрасно работает. создается сокет и конектиться без ошибок. удаленное устройство видит коннект. посылаются данные, удаленное устройство получает их и отвечает. recv() возвращает кол-во принятых байт. как в аптеке.

 

если без остановки выполнить.... то send() возвращает 8, shutdown() возвращает 0, recv() возвращает 0. Удаленное устройство видит подключение, но не получает ни одного байта. если между этими функциями понаставить пауз секундных, то код выполняется без остановки нормально... уходит запрос и возвращается ответ. Почему без пауз не работает? Если из-за неблокирующего сокета, то как сокет сделать блокирующим?

 

ps Может вместо этой API есть более годные либы для работы с bluetooth под винды?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Почему без пауз не работает? Если из-за неблокирующего сокета, то как сокет сделать блокирующим?

Посмотрите наличие callback-функций для событий сокета - их использовать гораздо удобнее.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Посмотрите наличие callback-функций для событий сокета - их использовать гораздо удобнее.

Не катят колбаки..... у меня весь обмен вынесен в отдельный поток, поэтому колбаки неудобны. удобнее линейно-последовательно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не катят колбаки..... у меня весь обмен вынесен в отдельный поток, поэтому колбаки неудобны. удобнее линейно-последовательно.

Сразу после создания сокета вызывается функция установления его параметров.

Среди этих параметров должен быть блокирующий/неблокирующий.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сразу после создания сокета вызывается функция установления его параметров.

Среди этих параметров должен быть блокирующий/неблокирующий.

Но это у вас говорит здравый смысл, а не опыт работы с БТ. Мой здравый смысл тоже говорит, что сокет нужно както переключить в блокирующий режим. но как? Конкретно как? В winsock я этого не нашел. Нашел пример по созданию БЛОКИРУЮЩЕГО сокета на winsock.... но только для TCP.... но для БТ должен сокет также работать. Конкретно, как общаться с БТ? как заставить сокет ждать отправки по бт? Или какая библа для этого подходить лучше?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

как заставить сокет ждать отправки по бт? Или какая библа для этого подходить лучше?

 

Есть команда select как раз для ожиданий

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть команда select как раз для ожиданий

я видел селект в winsock. Как его готовить? Не могу понять, как селект может помочь?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Посмотрел исходник, мне нужен был неблокирующий сокет. Я вызывал ioctlsocket с командой FIONBIO перевода сокета в неблокирующий режим.

Насколько я понимаю Вам нужно проделать обратную операцию.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Посмотрел исходник, мне нужен был неблокирующий сокет. Я вызывал ioctlsocket с командой FIONBIO перевода сокета в неблокирующий режим.

Насколько я понимаю Вам нужно проделать обратную операцию.

а вам нужен был неблокирующий сокет Bluetooth? вы с сокетом bluetooth работали?

 

по дефолту сокет блокирующий. чтоб он стал неблокирующим нужно сделать

u_long iMode=1;
ioctlsocket(sock,FIONBIO,&iMode);

я в своём коде принудительно джелаю

 u_long iMode=0;
ioctlsocket(sock,FIONBIO,&iMode);

Не помогает. и ещё.... до кучи... если так и не пришел ответ.... то как сокет выйдет из recv()? Где то же должны задаваться таймауты ожидания.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а вам нужен был неблокирующий сокет Bluetooth? вы с сокетом bluetooth работали?

Мне нужен был именно неблокирующий, а FIONBIO в устанавливал потому что предпочитаю не полагаться на умолчания,

а прописать установку.

Работал не с bluetooth, но предполагаю, что при создании сокета нужно указать блютузный тип протокола, а в остальном все аналогично.

 

Не помогает. и ещё.... до кучи... если так и не пришел ответ.... то как сокет выйдет из recv()? Где то же должны задаваться таймауты ожидания.

Я не пробовал, но по описанию таймауты для блокирующего устанавливаются в setsockopt: SO_RCVTIMEO - "Sets the timeout, in milliseconds, for blocking receive calls."

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...