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

 
 
> Как обрабатывать сообщение 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

Сообщений в этой теме
- 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
||- - @Ark   Цитата(david_off @ Nov 7 2008, 21:30) Вы ...   Nov 7 2008, 18:53
||- - 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 Текстовая версия Сейчас: 24th July 2025 - 02:57
Рейтинг@Mail.ru


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