16 / 14 / 1
Регистрация: 08.07.2012
Сообщений: 192
|
|||||||||||
1 | |||||||||||
Как принять сообщение по BlueTooth04.10.2014, 17:24. Показов 12465. Ответов 16
Метки нет (Все метки)
Здравствуйте!
Уже не первый день ломаю голову по поводу Bluetooth технологии, пытаясь написать элементарный терминал. Связываю планшет и телефон, оба Android 4.2. На планшетнике стоит терминал из маркета, на нем проверяю свой. Проблема заключается в том, что отправить получается, а принять нет. При чём приложение не вылетает и вообще ни как не реагирует на те данные, что ей передают, в отладочном терминале тоже пусто... Два разрешения в манифест прописал: BLUETOOTH, BLUETOOTH_ADMIN. Вообще не понимаю в чём дело... Вот код, который слеплен из официальной документции к андроид и встречается на огромном кол-ве сайтов псвящённых этой теме:
P.S. что такое UUID? и откуда его брать?
0
|
04.10.2014, 17:24 | |
Ответы с готовыми решениями:
16
SendMessage как принять сообщение? Как можно работать с почтой в Worde (отослать, принять сообщение)? Как принять и обработать сообщение об ошибке с сервера, при работе с IdFTTP? Как создать bluetooth соединение, распознанное как bluetooth клавиатура и/или мышь |
510 / 272 / 60
Регистрация: 14.12.2010
Сообщений: 548
|
|
04.10.2014, 19:50 | 2 |
Сообщение было отмечено vovken1997 как решение
Решение
201-ая строчка - кошмар, т.к. блокирующий вызов на 256 байт.
Т.е. вернётся он только когда 256 байт отсчитает. Если их передано меньше, то будет ждать пока лимит не наберётся. Воспользоваться нужно available() для определения сколько есть доступных байтов. И читать только сколько доступно, а не весь массив. Но тут риск: пакет наполовину прочитать. Поэтому надо знать размер пакета. В следующей строчке ты отправляешь свой массив каждый раз в цикле без копирования. Тоже ужас, в двух последовательных сообщениях какие данные будут? Правильно, непорядок...надо копировать данные перед оправкой. UUID - уникальный идентификатор. Можно сгенерировать случайный, а потом его использовать на обоих устройствах один и тот же.
1
|
16 / 14 / 1
Регистрация: 08.07.2012
Сообщений: 192
|
||||||
04.10.2014, 20:44 [ТС] | 3 | |||||
Наверное совсем глупо:
0
|
510 / 272 / 60
Регистрация: 14.12.2010
Сообщений: 548
|
|||||||||||
04.10.2014, 22:09 | 4 | ||||||||||
Кликните здесь для просмотра всего текста
1
|
16 / 14 / 1
Регистрация: 08.07.2012
Сообщений: 192
|
|
05.10.2014, 01:22 [ТС] | 5 |
Спасибо тебе огромное!))
Вот я идиот...)
0
|
16 / 14 / 1
Регистрация: 08.07.2012
Сообщений: 192
|
|||||||||||||||||||||
05.10.2014, 12:34 [ТС] | 6 | ||||||||||||||||||||
Вроде с приёмом разобрался:
Кликните здесь для просмотра всего текста
Основная проблема была в:
Единственная проблема, которая осталась, это глюк отправки сообщений. Приложение продолжает работать (нормально принимает), но через раз передаёт... Лог молчит, созается впечаление, что программа зацикливается на приёме, и вообще не срабатывает даже обработчик нажатия кнопки.
0
|
510 / 272 / 60
Регистрация: 14.12.2010
Сообщений: 548
|
|
05.10.2014, 13:46 | 7 |
Посоветую, завести потокобезопасный список сообщений на отправку.
И методе run() проверять на наличие сообщений на отправку. А в методе write(String) только добавлять сообщение в список. А то с сокетом много операций из разных потоков, это нехорошо
2
|
16 / 14 / 1
Регистрация: 08.07.2012
Сообщений: 192
|
|||||||||||
05.10.2014, 15:38 [ТС] | 8 | ||||||||||
Вот, всё работает!!!
Кликните здесь для просмотра всего текста
Самое смешное то, что на кнопках отправления было написано :
EVP, вот что было по настоящему нехорошо)) Огромное спасибо за помощь!) P.S. в прилжении работающий исходничёк, может кому пригодиться)
3
|
0 / 0 / 0
Регистрация: 11.10.2014
Сообщений: 5
|
|
11.10.2014, 19:07 | 9 |
а вот объесните мне дураку, где всему о том, о чем вы говорили, мне научится. ???
0
|
16 / 14 / 1
Регистрация: 08.07.2012
Сообщений: 192
|
|
11.10.2014, 21:28 [ТС] | 10 |
0
|
1 / 1 / 0
Регистрация: 13.11.2013
Сообщений: 16
|
|
01.05.2015, 21:20 | 11 |
Решаю аналогичную задачу. Код из аналогичного примера.
Не могу понять, можно ли задать таймаут на приеме. Устройство, подключенное по ВТ возвращает в ответ несколько байт, причем задержка ответа после посылки запроса может достигать 1-2 сек. и интервал между частями ответа может быть разным. И получается так, что сокет принимает ответ частями, в несколько приемов. А при больших задержках вообще не принимает. Такое ощущение что слишком маленький таймаут. Не могу найти в доках, какой он по умолчанию и можно ли увеличить. Вроде есть для сокета команда accept, или setSoTimeout, но мой Эклипс не знает их.
0
|
16 / 14 / 1
Регистрация: 08.07.2012
Сообщений: 192
|
|
01.05.2015, 21:27 [ТС] | 12 |
У меня была похожая проблема. Я сделал глобальную переменную и в нее записывал все что приходит, без таймаута, в случае, если в течении определенного интервала ничено не приходило, просто давал команду на обработку данных, после чего очищал переменную.
П.с. Еще можно сделать по стоповому байту, надежнее задержек
0
|
1 / 1 / 0
Регистрация: 13.11.2013
Сообщений: 16
|
|
01.05.2015, 23:03 | 13 |
Спасибо!!!
Я тоже собираюсь принимать решенике об окончании приема по стоповому байту. но сначала надо собрать весь ответ. Но все-таки как узнать, сейчас какая величина таймаута? Я что-то недопонимаю в работе с сокетами, раньше работал на PC c COM портами - там отправляется запрос и ПОСЛЕ этого можно начинать прием и контролировать таймаут. А здесь получается что сокет постоянно ловит что-то со входа, даже ДО начала и ВО ВРЕМЯ командной посылки туда?? Какого-то ключевого момента я не понимаю, уже неделю бьюсь. Да и незнакомые странноватые Java и Eclipse не облегчают понимания.
0
|
16 / 14 / 1
Регистрация: 08.07.2012
Сообщений: 192
|
|
01.05.2015, 23:42 [ТС] | 14 |
Там впринципе нет таймаута, он ловит все, что ему передается от другого устройства, но вы можете искусственно приостановить поток, там можете подобрать любую задержку. Но я все равно советовал бы вам сделать через столовый байт или еще что нибудь свое придумать, в виде небольшого протокольчика, надежнее, тем более если вы точно не знаете через какое время придет остаток сообщения и через какой таймаут определять конец посылки.
0
|
0 / 0 / 0
Регистрация: 19.06.2015
Сообщений: 1
|
|
19.06.2015, 22:13 | 15 |
Комрады, возникла проблемка. Написал похожий блютуз терминал как у vovken1997. Запускается , принимает данные всё красиво но через пару минут прием данных останавливается. Программа не зависает перезапуск потока делаю-ноль. Перезапускаю программу. Пишет что не может сделать сокет коннект. Перезапускаю еще несколько раз с включением выключением блютуза и она начинает принимать снова. Может ли это быть какое-то переполнение потока ? попробовал рестатртить поток по но ничего не помогает - через пару минут всё повторяется.
0
|
1 / 1 / 0
Регистрация: 09.02.2016
Сообщений: 1
|
|
09.02.2016, 13:03 | 16 |
А стоит ли скомпилировать этот проект.И он автоматически отправляет сообщение блютуз?
1
|
0 / 0 / 0
Регистрация: 23.02.2017
Сообщений: 12
|
|||||||||||
13.08.2018, 10:24 | 17 | ||||||||||
Можно даже не вносить доп.переменную. Достаточно просто изменить отправку сообщения из потока.
Было так:
0
|
13.08.2018, 10:24 | |
13.08.2018, 10:24 | |
Помогаю со студенческими работами здесь
17
Qt Bluetooth, ошибка qt.bluetooth: Dummy backend running. Qt Bluetooth module is non-functional Не получается принять сообщение (SendMessage) Попытка принять сообщение с сервера TCP клиент: Не получается принять сообщение от сервера Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |