![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Регистрация: 14.01.2010
Сообщений: 9
|
![]()
Здравствуйте. Пишу бакалаврскую с использованием C++ MFC. Программирую смартфон под Windows Mobile. Задача такая: передать некоторые данные от модема неподалеку к смартфона по блютусу. Данные - последовательность бит неопределенной длины. Блютус реализую при помощи сокетов. На данный момент написал класс CBluetoothSocket, который унаследовал от CAsyncSocket (хотя сейчас уже сомневаюсь в правильности решения, подумываю использовать CSocket). Написал парсер для разбора входного пакета данных.
Это все было предисловием ![]() И еще хотел спросить, какая практическая разница в CAsyncSocket и CSocket? Я так понял, что в CSocket решена проблема блокирования и еще ряд других и с ним проще работать. Но мне нужно, чтобы вся передача была в фоне, могу ли я использовать в таком случае CSocket? Еще было бы очень хорошо найти того, кто имеет опыт в программировании bluetooth под MFC, или хотя бы получить ссылку куда-нибудь, информации об этом довольно мало, а уж тем более на русском. Последний раз редактировалось LMnet; 26.05.2011 в 18:24. |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
![]()
> Вроде из литературы я понял, что все должно делаться автоматом еще на уровне протокола
срочно сожгите такую литературу. > Протокол bluetooth подразумевает пакетную передачу данных блютус тут побоку, пакетную передачу данных требует IP протокол. TCP (у вас же не UDP сокеты, верно?) сделает за вас часть работы, но только часть. Разбирать, где начало и где конец передачи, надо будет самому (если за одно подключение могут быть переданы несколько разных не связанных блоков данных/файлов). > OnReceive вызовется уже после того, как все 4 части моего большого пакета передадуться, либо OnReceive будет вызываться каждый раз, как приходит маленький пакет? зависит от многих факторов, но надо быть готовым к тому, что OnReceive будет вызываться хоть на каждый новый принятый байт.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
Последний раз редактировалось veniside; 26.05.2011 в 18:33. |
![]() |
![]() |
![]() |
#3 | ||
Регистрация: 14.01.2010
Сообщений: 9
|
![]() Цитата:
![]() Цитата:
Я так понимаю, мне придется вводить дополнительные стартовые и стоповые биты в пакет данных для контроля за передачей. В bluetooth имеется режим эмуляции COM порта. Руководитель мне говорил, что там имеется встроенный механизм контроля начала и конца передачи. Получается, мне лучше именно такой режим применить? Последний раз редактировалось LMnet; 26.05.2011 в 18:38. |
||
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
![]()
> Так все-таки мне нужно самому соединять куски данных?
ну, возможно ваши 4 пакета и сольются в каком-нибудь буфере на клиенте, и OnReceive таки вызовется 1 раз. Но особо рассчитавать на это я бы не стал. Тем более, если завтра у вас размер данных увеличится (фильм закачать на 700 МБ потребуется), не будете же вы переписывать программу. > Я так понимаю, мне придется вводить дополнительные стартовые и стоповые биты в пакет данных для контроля за передачей. угу, вероятно. Обычно, каждый блок данных предваряют заголовком, в котором описывается как минимум длина передаваемых данных. Опять же, если у вас соединение закрывается сразу после успешной передачи блока данных (файла), а новый блок посылает путём создания нового соединения, можно этого и не делать. > В bluetooth имеется режим эмуляции COM порта. Руководитель мне говорил, что там имеется встроенный механизм контроля начала и конца передачи. Получается, мне лучше именно такой режим применить? скорей всего это все не имеет ни малейшего отношения к сокетам.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
Последний раз редактировалось veniside; 26.05.2011 в 18:45. |
![]() |
![]() |
![]() |
#5 | |
Регистрация: 14.01.2010
Сообщений: 9
|
![]() Цитата:
Пока что я нахожусь только на этапе проектирования класса для управления блютуса, поэтому точно сказать не могу. Но изначально задумывалось, что соединение открывается с началом программы и открыто постоянно, потому что данные могут прийти в любой момент с абсолютно разными промежутками времени (такова особенность решаемой задачи). |
|
![]() |
![]() |
![]() |
#6 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
![]()
> Этот заголовок я ввожу сам
да, сами. Ведь TCP — это просто поток. Что на одной стороне послали, то на другой получили. Но нет гарантии, что получим ровно теми же кусками, что были посланы. например, послали 10000 байт, а получатель принял блоки по 2048, 2048, 2048, 2000 и 1856 байт. Единственное, что гарантирует ТCP — что данные будут доставленны в том же порядке, и без потерь. > соединение открывается с началом программы и открыто постоянно тогда без своего протокола не обойтись, т.к. вам нужно будет понимать, где конец одной передачи и начало другой. Свой протокол == заголовок перед передачей нового блока данных (файла).
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
![]() |
![]() |
![]() |
#7 |
Регистрация: 14.01.2010
Сообщений: 9
|
![]()
veniside, спасибо большое за советы! Вы мне очень помогли
![]() |
![]() |
![]() |
![]() |
#8 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
![]()
> CAsyncSocket и CSocket?
судя по именам классов, CSocket относится к блокирующим сокетам, а CAsyncSocket к неблокирующим (с мфс-шными сокетам не работал, можно глянуть в мсдн). Оба класса применимы для работы в фоновом режиме. Просто для CSocket вам нужно будет самому создать новый поток, и в нём работать с блокирующим сокетом (т.е. сокетом, вызов send() или receive() у которого может "зависнуть" на неопределенное время). Для CAsyncSocket дополнительный поток, скорей всего, не понадобится, но надо быть готовым к тому, что его события могут быть вызваны в любой (неподходящий) момент из служебного потока. Что лучше — дело привычки.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
BlueTooth | GBAXA | Работа с сетью в Delphi | 1 | 19.12.2010 13:53 |
Bluetooth на ноуте | misher | Компьютерное железо | 0 | 17.12.2010 21:56 |
Bluetooth и C++Builder | olm | C++ Builder | 3 | 23.01.2010 22:10 |
BlueTooth | subsonic | Общие вопросы Delphi | 4 | 24.07.2008 16:19 |
BlueTooth | doniyor | Компоненты Delphi | 5 | 01.06.2008 23:19 |