реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Bluetooth c++ winapi
juvf
сообщение Sep 21 2016, 18:44
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Как взаимодействовать с БТ из винды? Начал использовать "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 под винды?
Go to the top of the page
 
+Quote Post
aiwa
сообщение Sep 21 2016, 23:28
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682



Цитата(juvf @ Sep 21 2016, 21:44) *
Почему без пауз не работает? Если из-за неблокирующего сокета, то как сокет сделать блокирующим?

Посмотрите наличие callback-функций для событий сокета - их использовать гораздо удобнее.
Go to the top of the page
 
+Quote Post
juvf
сообщение Sep 22 2016, 03:15
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



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

Не катят колбаки..... у меня весь обмен вынесен в отдельный поток, поэтому колбаки неудобны. удобнее линейно-последовательно.
Go to the top of the page
 
+Quote Post
aiwa
сообщение Sep 22 2016, 04:40
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682



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

Сразу после создания сокета вызывается функция установления его параметров.
Среди этих параметров должен быть блокирующий/неблокирующий.
Go to the top of the page
 
+Quote Post
juvf
сообщение Sep 22 2016, 06:27
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



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

Но это у вас говорит здравый смысл, а не опыт работы с БТ. Мой здравый смысл тоже говорит, что сокет нужно както переключить в блокирующий режим. но как? Конкретно как? В winsock я этого не нашел. Нашел пример по созданию БЛОКИРУЮЩЕГО сокета на winsock.... но только для TCP.... но для БТ должен сокет также работать. Конкретно, как общаться с БТ? как заставить сокет ждать отправки по бт? Или какая библа для этого подходить лучше?
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Sep 22 2016, 08:40
Сообщение #6


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(juvf @ Sep 22 2016, 09:27) *
как заставить сокет ждать отправки по бт? Или какая библа для этого подходить лучше?


Есть команда select как раз для ожиданий
Go to the top of the page
 
+Quote Post
juvf
сообщение Sep 22 2016, 10:08
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



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

я видел селект в winsock. Как его готовить? Не могу понять, как селект может помочь?
Go to the top of the page
 
+Quote Post
aiwa
сообщение Sep 23 2016, 03:30
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682



Посмотрел исходник, мне нужен был неблокирующий сокет. Я вызывал ioctlsocket с командой FIONBIO перевода сокета в неблокирующий режим.
Насколько я понимаю Вам нужно проделать обратную операцию.
Go to the top of the page
 
+Quote Post
juvf
сообщение Sep 23 2016, 07:49
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата(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()? Где то же должны задаваться таймауты ожидания.
Go to the top of the page
 
+Quote Post
aiwa
сообщение Sep 23 2016, 09:44
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682



Цитата(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."
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th April 2024 - 01:30
Рейтинг@Mail.ru


Страница сгенерированна за 0.01437 секунд с 7
ELECTRONIX ©2004-2016