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

 
 
> Как обрабатывать сообщение REMOTE IP:
david_off
сообщение Nov 7 2008, 11:19
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 37
Регистрация: 15-10-08
Из: Одесса, Украина
Пользователь №: 40 978



В моей программе все сообщения обрабатываются по установке флага получения нового сообщения. Анализатор флага работает так: получив CRLF (начало) - начинает ожидать CRLF(конец). Как только получен конец - флаг устанавливается. Обработчик сообщений, получив флаг, смотрит в буфер и обрабатывает пришедшее сообщение. После обработки флаг сбрасывается.

Алгоритм работает шикарно. Единственный его нюанс - нельзя работать с командами типа CLCC, которые возращают несколько строк и строки начиная со втрой не имеют CRLF (начало). Данные ответы имеют вид: CRLF<line1>CRLF<line2>CRLF...<lineN>CRLF OK CRLF. Проблема решается путём отказа от таких комманд - они мне не нужны.

Так вот с сообщением <CRLF REMOTE IP:> тоже наблюдается лажа.
Есть вариант выхода из сложившейся ситуации следующий: после соединения модулей посылать текст, который всегда будет заканчиватся на CRLF. Тогда сообщение будет иметь вид
<CRLF REMOTE IP: текст CRLF> - такое корректно обработается.

Но вот найти решение корректной обработки, когда приходит RING или ещё какое-то неожиданное сообщение - не могу. По сему спрашиваю здесь. Как обрабатывать REMOTE IP на тот случай, если влазит кто-то?

Сообщение отредактировал david_off - Nov 7 2008, 11:20
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
PIC_Embedder
сообщение Nov 7 2008, 12:31
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 123
Регистрация: 30-07-08
Из: Украина Луганск
Пользователь №: 39 308



У меня получилось что-то среднее. Алгоритм такой. Ожидаю первый символ (любой). Потом ожидается символ LF и если в течении 3 Мс нет нового символа, то считаем это признаком конца сообщения. Скорость установил 9600. Всё работает.
Go to the top of the page
 
+Quote Post
david_off
сообщение Nov 7 2008, 12:38
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 37
Регистрация: 15-10-08
Из: Одесса, Украина
Пользователь №: 40 978



Цитата(PIC_Embedder @ Nov 7 2008, 16:31) *
У меня получилось что-то среднее. Алгоритм такой. Ожидаю первый символ (любой). Потом ожидается символ LF и если в течении 3 Мс нет нового символа, то считаем это признаком конца сообщения. Скорость установил 9600. Всё работает.


неплохой вариант, только я хочу уточнить. Если получен LF, а заним ещё что-то лезит, то это уже снимает проверку таймаута?
Если да, то тогда REMOTE IP, который не имеет вконце LF также не будет обработан как и в моём алгоритме.
Если нет, то тогда вообще зачем ждать LF - алгоритм становиться такой же как описан выше.
Go to the top of the page
 
+Quote Post
_zag_
сообщение Nov 7 2008, 13:54
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 20-10-07
Пользователь №: 31 529



Цитата(david_off @ Nov 7 2008, 16:38) *
неплохой вариант, только я хочу уточнить. Если получен LF, а заним ещё что-то лезит, то это уже снимает проверку таймаута?


я думаю не снимает проверку таймаута а обнуляет таймер.
Go to the top of the page
 
+Quote Post
david_off
сообщение Nov 7 2008, 16:24
Сообщение #5


Участник
*

Группа: Новичок
Сообщений: 37
Регистрация: 15-10-08
Из: Одесса, Украина
Пользователь №: 40 978



Думал, думал и надумал...

По суте у меня выбор между двумя вариантами: моим и вариант с таймаутами.
У моего есть минус, что он не ловит сообщения, которые не заканчиваются на CRLF
У второго - не ловятся и не обрабатываются сообщения, которые были получены сразу же за сообщением, которое запустило таймер. Т.е. когда начало второго ответа успело начать приходить раньше таймаута.

Так вот что я думаю. Надо совместить плюсы двух вариантов, убраив их взаимные минусы. Буду ловить как раньше начало и конец сообщений, но если произвойдёт тайм-аут, то буду принудительно ставить флаг получения сообщения.

Для тех кто делал тайм-ауты наверно будет понятней сказать так. Буду ждать тайм-аута, но по мере поступления данных, буду проверять а нет ли внутри потока уже готового для обработки сообщения.

Сообщение отредактировал david_off - Nov 7 2008, 16:32
Go to the top of the page
 
+Quote Post
Guest_@Ark_*
сообщение Nov 7 2008, 17:11
Сообщение #6





Guests






Цитата(david_off @ Nov 7 2008, 19:24) *
Думал, думал и надумал...

По суте у меня выбор между двумя вариантами: моим и вариант с таймаутами.
У моего есть минус, что он не ловит сообщения, которые не заканчиваются на CRLF
У второго - не ловятся и не обрабатываются сообщения, которые были получены сразу же за сообщением, которое запустило таймер. Т.е. когда начало второго ответа успело начать приходить раньше таймаута.

Так вот что я думаю. Надо совместить плюсы двух вариантов, убраив их взаимные минусы. Буду ловить как раньше начало и конец сообщений, но если произвойдёт тайм-аут, то буду принудительно ставить флаг получения сообщения.

Для тех кто делал тайм-ауты наверно будет понятней сказать так. Буду ждать тайм-аута, но по мере поступления данных, буду проверять а нет ли внутри потока уже готового для обработки сообщения.


Предложу Вам такой вариант обработки:
Начало сообщения определяется по приему символа LF. Символ CR можно проигнорировать (чтобы не путать с эхом команд). После приема LF, сразу, в процессе приема, нужно начинать распознавать сообщение (как - это Вам уже известно). Как только распознавание закончено - можно считать законченной и обработку сообщения - выставлять флаг и, возможно, код сообщения. Только, конечно, не тот код, что выдает модем, а собственный, присвоенный Вами данному сообщению. Далее весь ввод игнорируется до получения начала нового сообщения. Примерно так.
Go to the top of the page
 
+Quote Post
david_off
сообщение Nov 7 2008, 18:30
Сообщение #7


Участник
*

Группа: Новичок
Сообщений: 37
Регистрация: 15-10-08
Из: Одесса, Украина
Пользователь №: 40 978



Цитата(@Ark @ Nov 7 2008, 21:11) *
Предложу Вам такой вариант обработки:
Начало сообщения определяется по приему символа LF. Символ CR можно проигнорировать (чтобы не путать с эхом команд). После приема LF, сразу, в процессе приема, нужно начинать распознавать сообщение (как - это Вам уже известно). Как только распознавание закончено - можно считать законченной и обработку сообщения - выставлять флаг и, возможно, код сообщения. Только, конечно, не тот код, что выдает модем, а собственный, присвоенный Вами данному сообщению. Далее весь ввод игнорируется до получения начала нового сообщения. Примерно так.


Вы предлагаете после получения КАЖДОГО байта (когда уже был LF) пытаться распознать что у нас лежит в буфере приёма?! Мне кажется это будет нерационально расходовать процессорное время.
Получается для распознования элементарного ответа IP INITIAL на команду CIPSTATUS прийдётся запустить процедуру распознования содержимого более 10 раз. И это не просто процедура инкремента, а попытка найти в буфере какую-то строку, соответсвующую определённому шаблону. Шаблоны как я понимаю должны быть приготовлены для всех вариантов ответа.
Если же всё таки начинать распознавание ответа по признаку количества принятых байт, или ещё какому-то признаку, то это не меняет концептуально подход. Просто меняется признак, по которому начинается обработка. А смысл тот же. Ждём признак, а получив - идём на распознование.
Go to the top of the page
 
+Quote Post
Guest_@Ark_*
сообщение Nov 7 2008, 18:53
Сообщение #8





Guests






Цитата(david_off @ Nov 7 2008, 21:30) *
Вы предлагаете после получения КАЖДОГО байта (когда уже был LF) пытаться распознать что у нас лежит в буфере приёма?! Мне кажется это будет нерационально расходовать процессорное время.
Получается для распознования элементарного ответа IP INITIAL на команду CIPSTATUS прийдётся запустить процедуру распознования содержимого более 10 раз...

Здесь, конечно, вопрос реализации... Кто и как выполняет процедуру приема... Если это делает Ваша программа (процедура), причем, асинхронно - по прерыванию на прием символа, то почему бы не совместить прием с распознованием? Где Вы увидели усложнение? Сам подход Вам не привычен? Это возможно...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- david_off   Как обрабатывать сообщение REMOTE IP:   Nov 7 2008, 11:19
- - FormatCft   Цитата(david_off @ Nov 7 2008, 16:19) В м...   Nov 7 2008, 11:28
|- - _zag_   Цитата(FormatCft @ Nov 7 2008, 15:28) ИМХ...   Nov 7 2008, 11:49
||- - david_off   Цитата(@Ark @ Nov 7 2008, 22:53) Здесь, к...   Nov 7 2008, 20:00
||- - @Ark   Цитата(david_off @ Nov 7 2008, 23:00) Нав...   Nov 8 2008, 00:14
|- - PIC_Embedder   Цитата(david_off @ Nov 7 2008, 16:38) неп...   Nov 7 2008, 15:40
- - Baser   Цитата(david_off @ Nov 7 2008, 13:19) В м...   Nov 7 2008, 22:23
- - david_off   Цитата(Baser @ Nov 8 2008, 02:23) А я так...   Nov 8 2008, 13:00
|- - @Ark   Цитата(david_off @ Nov 8 2008, 16:00) ......   Nov 8 2008, 13:23
|- - Baser   Цитата(david_off @ Nov 8 2008, 15:00) Не ...   Nov 8 2008, 13:45
|- - david_off   Цитата(Baser @ Nov 8 2008, 17:45) Ну, есл...   Nov 8 2008, 15:47
|- - Baser   Цитата(david_off @ Nov 8 2008, 17:47) Кст...   Nov 8 2008, 17:19
- - FormatCft   Цитата(Baser @ Nov 8 2008, 03:23) А я так...   Nov 9 2008, 10:18
- - Baser   Цитата(FormatCft @ Nov 9 2008, 12:18) А п...   Nov 9 2008, 16:38


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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 17:51
Рейтинг@Mail.ru


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