|
Модераторы: feodorv |
|
juvf |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 1.6.2010 Репутация: нет Всего: нет |
Как взаимодействовать с БТ из винды? Начал использовать "Windows Sockets Support for Bluetooth" но чото лыжи не едут. Делаю следующий алгоритм с winsock
Код
если в дебаге прошагать, то всё прекрасно работает. создается сокет и конектиться без ошибок. удаленное устройство видит коннект. посылаются данные, удаленое устройство получает их и отвечает. recv() возвращает кол-во принятых байт. как в аптеке. если без остановки выполнить.... то send() возвращает 8, shutdown() возвращает 0, recv() возвращает 0. Удаленное устройство видит подключение, но не получает ни одного байта. если между этими функциями понаставить пауз секундных, то код выполняется без остановки нормально... уходит запрос и возвращается ответ. Почему без пауз не работает? Если из-за неблокирующего сокета, то как сокет сделать блокирующим? ps Может вместо этой API есть более годные либы для работы с bluetooth под винды? |
|||
|
||||
feodorv |
|
|||
Эксперт Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 10 Всего: 45 |
С неблокирующими сокетами данные же нужно подождать, пока придут. Если просто вызвать recv(), то система заглянет в буфер приёма, увидит, что он пуст, и вернёт 0. Всё правильно. А ждать данные в винде можно через WSAEVENT/WSAWaitForMultipleEvents или через select. -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
juvf |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 1.6.2010 Репутация: нет Всего: нет |
да у меня даже отправки нет.... send(sock, array, 8, 0); видать помещает данные в буфер передачи и сразу вызвращается.... а следом идет shutdown(sock, SD_SEND); Удаленное устройство по БТ не получает ни одного байта.
Я пробовал через селект..... не получилось. Есть пример работы с скоетами через селект? |
|||
|
||||
feodorv |
|
|||
Эксперт Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 10 Всего: 45 |
Да. Оно не должно помешать:
Это не понятно. Это точно установлено? А в случае с блокируемыми сокетами всё было в порядке? Внятного примера у меня не нашлось, давно работаю через события (чего и Вам желаю). Отличия от юниксовского подхода есть (в основном в области обработки ошибок), но мало. В инете примеры найти можно. -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
juvf |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 1.6.2010 Репутация: нет Всего: нет |
Добавлено через 9 минут и 49 секунд
|
||||||||
|
|||||||||
feodorv |
|
|||
Эксперт Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 10 Всего: 45 |
Найдите в инете "Windows Sockets 2 Application Programming Interface" и узнаете, чего есть в виндах, чего нету Например, про ioctlsocket(FIONBIO). И что сокет после создания тоже блокирующий.
Тогда я ничего не понимаю))) Как у Вас всё это работало на неблокирующих сокетах без селекта или событий? Тут, увы, мне сказать нечего. С блютусом не работал, опыта нет. -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
juvf |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 1.6.2010 Репутация: нет Всего: нет |
зато такой код работает
ps хотя если сокет вывалится по таймауту, то send или recv тернёт WSAETIMEDOUT, но этого не происходит. |
||||||||
|
|||||||||
feodorv |
|
|||
Эксперт Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 10 Всего: 45 |
Честно говоря, не знаю в чём дело. Возможно, в параметрах открытия сокета, ведь их Вы не привели. Первые ссылки по двум ключевым словам "bluetooth" и "socket" дают искомый результат. Например, http://www.winsocketdotnetworkprogramming....protocol4p.html. Там же, как получить адрес. -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
juvf |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 1.6.2010 Репутация: нет Всего: нет |
за ссылки спасибо! Добавлено через 3 минуты и 57 секунд и до кучи передача и прием
Добавлено через 12 минут и 2 секунды ps забегая вперёд..... вот работая с обычным компортом или с бинарным ТСП сокетом я обмен осуществлял так -открытие компорта -отправка запроса -ожидание ответа -обработка ответа -отправка запроса -приме и отбработка ответа ..... .... -закрытие порта как с блютузом и сокетами в этом случае? получается так -открытие сокета блютуза -отправка запроса -закрытие передачи (шатдаун сенд) -ожидание ответа -обработка ответа -... а дальше? можно сразу посылать новый запрос? там был сделан шатдаунд сенд. как после этого делать передачу? или после приема надо сделать шатдаунт приема и делать передачу? или надо открыть и закрыть сокет? |
||||||
|
|||||||
feodorv |
|
|||
Эксперт Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 10 Всего: 45 |
Прошу прощения за долгое молчание
Здесь можно найти такую фразу:
Всё зависит от того, как на той стороне работает сервер. Если он способен только на один запрос-ответ, то придется каждый раз открывать новое соединение, а затем его закрывать. Если же сервер может обрабатывать множественные запросы, то, конечно, можно обойтись одним сокетом. Очень надеюсь, что у Вас что-нибудь разрешилось за это время -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
juvf |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 1.6.2010 Репутация: нет Всего: нет |
|
|||
|
||||
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Сети | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |