|
|
  |
Краткий курс по TCP/IP + Новый баг SIM300C (прошивка 12). |
|
|
|
Oct 21 2008, 20:12
|
Участник

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

|
По известному алгоритму установления TCP/IP соединения, сначала надо произвести 3 чудо команды 1) AT+CSTT="WWW.UMC.UA","MTS","MTS" - задать APN, пользователя и пароль 2) at+CIICR - поднять соедиение 3) AT+CIFSR - получить статус. потом можно поднимать сервер или соединение... Перед первой командой надо бы убедиться, что AT+CIPSTATUS выдаёт IP INITIAL (начальное состояние). Ещё не плохо бы убедится, что GPRS сервис подлючён. Для этого можно узнать текущее состояние при помощи AT+CGATT?, и если ответит AT+CGATT=0, то подключить сервис командой AT+CGATT=1. Подключение может быть с задержкой.
Так вот, решил я проверить правильность реализации в контроллере АТ комманд, поднимающие TCP/IP соединение. Перед вызывом чудо команд, проверяю состояние AT+CIPSTATUS, если оно не равно IP INITIAL, то провожу деактивацию контекста (AT+CIPSHUT), что должно гарантировано вернуть состояние IP INITIAL и потом смело посылаю чудо команды. Алгоритм обработки комманд устроен так, что следующая не посылается, пока не получен ответ на предыдущую.
Так вот, после суток биения головой об монитор, нахожу такую закономерность: если не дать модулю постоять после получения ответа SHUT OK на команду AT+CIPSHUT, то модуль сходит сума.
Вот кусок беседы с модулем:
//Проверяем состояние модуля AT+CIPSTATUS >>OK >>STATE: IP INITIAL
//устанавливием параметры GPRS подключения AT+CSTT="WWW.UMC.UA","MTS","MTS" >>OK
//Проверяем состояние модуля AT+CIPSTATUS >>OK >>STATE: IP START
//поднимаем GPRS подключение at+CIICR >>OK
//Проверяем состояние модуля AT+CIPSTATUS >>OK >>STATE: IP GPRSACT
//получаем ip-адерес AT+CIFSR >>88.214.69.76
//Проверяем состояние модуля AT+CIPSTATUS >>OK >>STATE: IP STATUS
//теперь сессия готова к использования, что бы попробывать поднять её ещё раз, надо деативировать //контекст, что приведёт модуль в начальное состояние. Для этого используем команду +CIPSHUT AT+CIPSHUT >>SHUT OK
если сейчас, после сообщения "SHUT OK", не сделать паузу хотя бы 1 сек, то в 90% будет вот что
AT+CSTT="WWW.UMC.UA","MTS","MTS" --OK AT+CIICR +PDP: DEACT <- Какого !(,!,:? вылазит это сообщение? Ведь вроде получили, что "SHUT OK", Видно модуль хоть и выдал сообщение, но деактивация контекста не была произведена.
PS: Постил такое же сообщение на другом форуме, один человек сказал, что вообще все команды, которые я использовал - тормозят, после всех нужно ждать. Спорить с ним не стал. У себя пробывал выливать команды CSTT, CIICR, CIFSR даже не дожидаясь между ними прихода эха и ответа. Ошибки небыло, конечно если до этого состояние было IP INITIAL.
|
|
|
|
|
Oct 21 2008, 22:04
|
Участник

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

|
Цитата(Dron_Gus @ Oct 22 2008, 00:26)  Перед AT+CIPSHUT надо . Может где-то и надо, но в SIM300С это не к чему. AT+CIPSHUT гарантировано включает в себя дейтвия команды AT+CIPCLOSE
|
|
|
|
Guest_@Ark_*
|
Oct 21 2008, 23:15
|
Guests

|
Цитата(david_off @ Oct 22 2008, 02:04)  ... С TCP/IP я не работал, а вот с обычной модемной связью приходилось иметь дело. Из этого опыта вынес следующее: нужно четко понимать, что кроме, собственно, Вашего модема, есть еще линия связи и другой абонент. Успешное выполнение команды и получение сообщения об этом означает, лишь, что модем правильно воспринял команду и выполнил все предписанные действия. Что происходит при этом на другом конце линии не всегда достоверно известно. За примерами далеко ходить не нужно, можно взять стандартную команду установки связи ATD. После успешного соединения выдается ответ CONNECT, и по идее уже можно передавать данные, но это не так. Проводили такие эксперименты: ставили рядом два компьютера, каждый со своим модемом, подключенным к своему отдельному телефонному номеру, и пытались установить связь между ними. Когда на компьютере, инициирующем связь, уже выдавалось сообщение CONNECT, на втором его еще не было. Оно всегда выдавалось с задержкой 1-3 сек. Попытка сразу начать передавать данные приводила к глухому зависанию. Была возможность попробовать сочетания разных/одинаковых модемов и различного/одинакового ПО на компьютерах. Результат был примерно одинаков: только выдержка до передачи данных 3-секундной паузы после CONNECT гарантировала надежное соединение.
|
|
|
|
|
Oct 22 2008, 06:12
|
Участник

Группа: Новичок
Сообщений: 23
Регистрация: 30-07-07
Пользователь №: 29 450

|
Спорить необходимо, иначе какой смысл в форумах.
Кстати, если Вы оспариваете мнение, высказанное в одном форуме, в другом форуме, справедливей приводить цитату, а не пересказывать своими словами.java script:emoticon(':(', 'smid_1')
"Автор: GP Дата: 21.10.08 08:50:19 Я пришел к выводу, что после любой из перечисленных команд нужно дать модулю подумать, несмотря на то, что он сразу отвечает. Например, после AT+CSTT= недостаточно получить ОК, а нужно чтобы на CIPSTATUS отвечал IP START и только потом CIICR. Кстати перед AT+CSTT= обязательно проверить AT+CGATT? и только если AT+CGATT=1, то дальше по алгоритму. Attach to GPRS service происходит с некоторой задержкой."
И вопрос в том форуме отличался. Между командами настройки не было CIPSTATUS.
|
|
|
|
|
Oct 22 2008, 08:59
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Цитата(david_off @ Oct 21 2008, 23:12)  //теперь сессия готова к использования, что бы попробывать поднять её ещё раз, надо деативировать //контекст, что приведёт модуль в начальное состояние. Для этого используем команду +CIPSHUT AT+CIPSHUT >>SHUT OK
если сейчас, после сообщения "SHUT OK", не сделать паузу хотя бы 1 сек, то в 90% будет вот что
AT+CSTT="WWW.UMC.UA","MTS","MTS" --OK AT+CIICR +PDP: DEACT <- Какого !(,!,:? вылазит это сообщение? Ведь вроде получили, что "SHUT OK", Видно модуль хоть и выдал сообщение, но деактивация контекста не была произведена. Я с этими всеми командами тоже долго боролся и изучал их, пока писал оптимальную (на мой взгляд  ) процедуру обработки ошибок и сбоев. Кое чего понял. Так вот, то что вы считаете следствием команды AT+CIICR, а именно ответ +PDP: DEACT, на самом деле является второй частью ответа на вашу первую команду AT+CIPSHUT. Нужно понимать одну вещь (я её тоже не сразу понял): есть модем со своим стеком команд (не совсем прямым  ) и есть GSM сеть. А команда AT+CIPSHUT - есть управляющая команда как для модема, так и для GSM сети. Так что, не на 90%, как вы пишите, а на все 100% должно быть следующее: Ваш PDP контекст активирован, вы подаете команду: AT+CIPSHUT Модем сбрасывает свой стек в начальное состояние, посылает команду в GSM сеть и отвечает: >>SHUT OK GSM сеть деактивирует ваш PDP контекст и присылает подтверждение, которое модем транслирует вам: +PDP: DEACT (тут может быть и другой текст, в зависимости от возможных ошибок). Между первым и вторым ответом может проити достаточное время, и если вы в эту паузу начнете управлять модемом, то результаты могут быть мало предсказуемыми Я после AT+CIPSHUT просто тупо жду 5-10 сек без анализа ответов. Но вполне могут быть случаи, когда деактивация контекста сетью будет происходить гораздо дольше. Мне еще предстоит на это нарваться...
|
|
|
|
|
Oct 22 2008, 21:00
|
Участник

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

|
Цитата(GP_ @ Oct 22 2008, 09:12)  Спорить необходимо, иначе какой смысл в форумах. Кстати, если Вы оспариваете мнение, высказанное в одном форуме, в другом форуме, справедливей приводить цитату, а не пересказывать своими словами.java script:emoticon(':(', 'smid_1')
"Автор: GP Дата: 21.10.08 08:50:19 Я пришел к выводу, что после любой из перечисленных команд нужно дать модулю подумать, несмотря на то, что он сразу отвечает. Например, после AT+CSTT= недостаточно получить ОК, а нужно чтобы на CIPSTATUS отвечал IP START и только потом CIICR. Кстати перед AT+CSTT= обязательно проверить AT+CGATT? и только если AT+CGATT=1, то дальше по алгоритму. Attach to GPRS service происходит с некоторой задержкой." И вопрос в том форуме отличался. Между командами настройки не было CIPSTATUS. Конечно извеняюсь, что цитату исковеркал, но смысл то не изменил. Спорить не стал, потому что ваше мнение может быть 100% правильным, но для другого модема. Для своего же модема, уже говорил, мнение не справедливо. А по поводу того, что появились слегка изменения в тексте, то это только для того, что новичкам, которые первый раз по моему посту попробуют поднять стек было понятней. Команду AT+CGATT действительно лучше проверять. Просто забыл про неё, хотя у меня в программе выше она использовалась. Изначально текст, который именно вы читали, не соделржал команд считывания статуса (первый вариант такой, как у меня в программе).
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|