Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Bluetooth c++ winapi
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > Программирование
juvf
Как взаимодействовать с БТ из винды? Начал использовать "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 под винды?
aiwa
Цитата(juvf @ Sep 21 2016, 21:44) *
Почему без пауз не работает? Если из-за неблокирующего сокета, то как сокет сделать блокирующим?

Посмотрите наличие callback-функций для событий сокета - их использовать гораздо удобнее.
juvf
Цитата(aiwa @ Sep 22 2016, 04:28) *
Посмотрите наличие callback-функций для событий сокета - их использовать гораздо удобнее.

Не катят колбаки..... у меня весь обмен вынесен в отдельный поток, поэтому колбаки неудобны. удобнее линейно-последовательно.
aiwa
Цитата(juvf @ Sep 22 2016, 06:15) *
Не катят колбаки..... у меня весь обмен вынесен в отдельный поток, поэтому колбаки неудобны. удобнее линейно-последовательно.

Сразу после создания сокета вызывается функция установления его параметров.
Среди этих параметров должен быть блокирующий/неблокирующий.
juvf
Цитата(aiwa @ Sep 22 2016, 09:40) *
Сразу после создания сокета вызывается функция установления его параметров.
Среди этих параметров должен быть блокирующий/неблокирующий.

Но это у вас говорит здравый смысл, а не опыт работы с БТ. Мой здравый смысл тоже говорит, что сокет нужно както переключить в блокирующий режим. но как? Конкретно как? В winsock я этого не нашел. Нашел пример по созданию БЛОКИРУЮЩЕГО сокета на winsock.... но только для TCP.... но для БТ должен сокет также работать. Конкретно, как общаться с БТ? как заставить сокет ждать отправки по бт? Или какая библа для этого подходить лучше?
AlexandrY
Цитата(juvf @ Sep 22 2016, 09:27) *
как заставить сокет ждать отправки по бт? Или какая библа для этого подходить лучше?


Есть команда select как раз для ожиданий
juvf
Цитата(AlexandrY @ Sep 22 2016, 13:40) *
Есть команда select как раз для ожиданий

я видел селект в winsock. Как его готовить? Не могу понять, как селект может помочь?
aiwa
Посмотрел исходник, мне нужен был неблокирующий сокет. Я вызывал ioctlsocket с командой FIONBIO перевода сокета в неблокирующий режим.
Насколько я понимаю Вам нужно проделать обратную операцию.
juvf
Цитата(aiwa @ Sep 23 2016, 08:30) *
Посмотрел исходник, мне нужен был неблокирующий сокет. Я вызывал ioctlsocket с командой FIONBIO перевода сокета в неблокирующий режим.
Насколько я понимаю Вам нужно проделать обратную операцию.
а вам нужен был неблокирующий сокет Bluetooth? вы с сокетом bluetooth работали?

по дефолту сокет блокирующий. чтоб он стал неблокирующим нужно сделать
Код
u_long iMode=1;
ioctlsocket(sock,FIONBIO,&iMode);

я в своём коде принудительно джелаю
Код
u_long iMode=0;
ioctlsocket(sock,FIONBIO,&iMode);
Не помогает. и ещё.... до кучи... если так и не пришел ответ.... то как сокет выйдет из recv()? Где то же должны задаваться таймауты ожидания.
aiwa
Цитата(juvf @ Sep 23 2016, 10:49) *
а вам нужен был неблокирующий сокет Bluetooth? вы с сокетом bluetooth работали?

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

Цитата(juvf @ Sep 23 2016, 10:49) *
Не помогает. и ещё.... до кучи... если так и не пришел ответ.... то как сокет выйдет из recv()? Где то же должны задаваться таймауты ожидания.

Я не пробовал, но по описанию таймауты для блокирующего устанавливаются в setsockopt: SO_RCVTIMEO - "Sets the timeout, in milliseconds, for blocking receive calls."
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.