|
GPRS, SIM900, TCP, Модуль (клиент) не соединяется с сервером |
|
|
|
Oct 9 2012, 08:29
|
Частый гость
 
Группа: Участник
Сообщений: 89
Регистрация: 28-04-11
Пользователь №: 64 664

|
Добрый день!
Начал разбираться с GPRS на базе модуля SIM900. Ознакомился с файлом описания TCP/IP (название документа: SIM900_TCPIP_ApplicationNote_V1.02.pdf). Начал делать такой проектик: Софт на РС будет сервером, а модуль SIM900 - клиентом. Модуль на данный момент подсоединен к терминалу. Буду с терминала управлять модулем SIM900 для первоначального запуска. Используется режим single connection и non-transparent mode, установленные по умолчанию. Начал выполнять действия, описанные в пункте 2.1.1 How to Establish a TCP Client Connection. Команды AT+CPIN?, AT+CSQ, AT+CREG?, AT+CGATT?, AT+CSTT="internet.lmt.lv" (APN латвийского оператора LMT), AT+CIICR, AT+CIFSR прошли нормально. Ответы на эти команды такие же, как в примере на страницах 5 и 6. До этого момента вроде все нормально.
На следующую команду AT+CIPSTART="TCP","10.13.137.45","10000" получил такой ответ: OK а еще через какое-то время пришло: STATE: TCP CLOSED CONNECT FAIL
На компе с IP адресом 10.13.137.45 уже до выполнения этой команды была запущена программа сервера с номером порта сервера 10000. Может какой-то не тот софт на PC? При запуске этой программы нужно было только присвоить номер порта (выбрал 10000). Софт уже сам считывал IP адрес РС. В чем может быть проблема? Какой софт можете посоветовать?
Думаю, что проблема все же не в софте на РС. Один человек подсказал следующее: "Программа может и слушает, но модулю возможно не пробиться через сервер/рутер, сложно сказать не зная вашей архитектуры сети. Настройки Nat, port forwarding и т.д. смотрите". Где можно посмотреть настройки и какие они должны быть?
Заранее спасибо за помощь! Дмитрий
Создал сразу 4 одинаковые темы. У меня сегодня РС тормозит. Первые 3 можно не читать. Не могу найти, как их можно удалить.
|
|
|
|
|
Oct 9 2012, 09:19
|
Частый гость
 
Группа: Участник
Сообщений: 89
Регистрация: 28-04-11
Пользователь №: 64 664

|
Цитата(andrewlekar @ Oct 9 2012, 12:03)  Попробуйте с компа подцепиться к этому адресу. Комп возьмите с другой локалки. В начале попробовал соединить два РС, которые включены в одну сеть. На одном РС была запущена программа сервера, на втором - программа клиента. Все работало, можно было обмениваться данными в обоих направлениях. Возможно, у нас здесь (на работе) своя локальная сеть. Может она не пропускает что-то. Если честно, то я в сетях мало что понимаю. Если что, надо будет спрашивать у администратора сети. Пока у меня нет возможности подсоединиться с другой сети. В крайнем случае нужно нести модуль домой, устанавливать весь софт и т.д. Что нужно делать, если связь не установится между двумя РС в разных локальных сетях? В любом случае эту проблему нужно решать.
|
|
|
|
|
Oct 9 2012, 12:06
|
Частый гость
 
Группа: Участник
Сообщений: 89
Регистрация: 28-04-11
Пользователь №: 64 664

|
Цитата(andrewlekar @ Oct 9 2012, 12:47)  Если связь не установится между двумя PC в разных локальных сетях, значит указанный IP адрес "серый" - спрятан за NATом, то есть существует только в пределах вашей локалки. Если не ошибаюсь, то диапазон 10.х.х.х используется как раз для локальных адресов... GSM модуль существует в своей виртуальное подсети и за некорыми исключениями, может подключаться только к "белым" внешним адресам. Вам, чтобы решить эту проблему, нужно попросить у админа статический внешний адрес для экспериментов (это может потребовать некоторых финансовых затрат). Хорошо, буду узнавать у нашего админа. Если GSM модуль существует в своей виртуальной подсети, то и его IP начинается с 10.х.х.х? При считывании IP адреса с SIM900 модуля он выдает разные адреса. Один раз выдал 10.83.194.253, а другой раз - 10.40.25.55 IP адрес модуля нефиксированный, а динамический? Поэтому его нужно каждый раз считывать?
|
|
|
|
|
Oct 10 2012, 06:57
|
Частый гость
 
Группа: Участник
Сообщений: 89
Регистрация: 28-04-11
Пользователь №: 64 664

|
Цитата(_Артём_ @ Oct 9 2012, 16:07)  Зачем вам нужен IP модуля? Какой в нём смысл? Я так понимаю, IP адрес модуля понадобится, если захочу сконфигурировать модуль сервером, а программу на РС - клиентом. При подключении к серверу нужно указывать IP адрес и номер порта сервера. Это для следующего эксперимента. Дома получилось подключиться к серверу. Что касается компа на работе, то наш администратор дал внешний IP адрес моего компа и снял Firewall с порта 10000. В результате тоже получилось соединиться с програмкой сервера. Данные передаются в обоих направлениях. Модуль SIM900 поочередно выдает два IP адреса: 10.40.25.55 и 10.83.194.253 Можно ли сделать так, чтобы он всегда выдавал только один адрес. Если не ошибаюсь, то где-то читал, что можно задать фиксированный IP адрес. Когда модуль подключается к серверу, то в програмке сервера в поле IP адреса клиента вместо 10.40.25.55 появляется 212.93.100.2, а при 10.83.194.253 появляется такой адрес 212.93.100.45 Теперь хочу сделать наоборот, чтобы комп был клиентом, а модуль - сервером. Какой мне указывать адрес сервера (IP адрес модуля SIM900)? Может локальные адреса предусмотрены для общения между аналогичними модулями SIM900, а есть также какой-то внеший IP адрес для работы с остальным миром? Это я просто предположил по аналогии с нашей локальной сетью. Цитата(alexdos @ Oct 9 2012, 19:28)  "а еще через какое-то время пришло: STATE: TCP CLOSED CONNECT FAIL" мы программисты любим цифры, конкретно укажите через какое время Вам приходит " STATE: TCP CLOSED CONNECT FAIL" ? Точно не скажу, но где-то порядка 30 секунд или примерно так. Наверно, при отсылке команды AT+CIPSTART="TCP","10.13.137.41","10000" запускается таймер на определенное время. Если модуль не подсоединяется к серверу за это время, то срабатывает таймаут и модуль выдает сообщение STATE: TCP CLOSED CONNECT FAIL. Эта проблема уже решилась после того, как администратор дал внешний IP адрес моего РС.
Сообщение отредактировал Electronics Engineer - Oct 10 2012, 06:58
|
|
|
|
|
Oct 10 2012, 07:23
|
Частый гость
 
Группа: Участник
Сообщений: 89
Регистрация: 28-04-11
Пользователь №: 64 664

|
Цитата(andrewlekar @ Oct 10 2012, 10:03)  Чтобы модуль был сервером, нужно идти к оператору сотовой связи и просить у него услугу "статический внешний IP". Ни разу такой услугой не пользовался, но подозреваю, что дадут нестандартный APN и возьмут некоторое количество денег. Попытался запустить модуль в качестве сервера, а софт на РС - в качестве клиента. В начале сконфигурировал модуль сервером, как описано на странице 8 выше указанного документа. Когда модуль находился в состоянии SERVER LISTENING, перепробывал все 4 IP адреса сервера, но клиенту так и не удалось подсоединиться к серверу ни с одним адресом. Это я просто хотел поэкспериментировать. В реальных устройствах модуль скорее всего будет клиентом. Пока не актуально делать модуль сервером. Интересно, а два SIM900 модуля будут между собой работать, если один будет сервером, а второй -клиентом? Или с сервером будет такая же проблема? Использовать их локальные адреса, что модули выдают на команду AT+CIFSR (Get local IP address).
Сообщение отредактировал Electronics Engineer - Oct 10 2012, 08:02
|
|
|
|
|
Oct 10 2012, 12:00
|
Частый гость
 
Группа: Участник
Сообщений: 89
Регистрация: 28-04-11
Пользователь №: 64 664

|
Цитата(_Артём_ @ Oct 10 2012, 14:20)  Использование sim900 в качестве сервера (и не только) описано в документе SIM900_TCPIP_Application Note_V1.02.pdf Как раз делал по примерам, описанным в этом документе. Проблема заключалась в том, что клиент (софт на РС) не мог подсоединиться к серверу (модуль SIM900). Загвоздка в IP адресе модуля (сервер). Тот локальный IP адрес, который считывается с SIM900, не проходит. Не подходил также тот IP адрес, который определяет РС, когда модуль подсоединяется как клиент. Чуть выше была описана возможное решение этой проблемы. Пока с этим я возиться не буду. Модуль планируется использовать в качастве клиента. Просто хотел попробовать.
|
|
|
|
|
Oct 10 2012, 15:52
|
Местный
  
Группа: Свой
Сообщений: 403
Регистрация: 29-04-11
Из: Украина
Пользователь №: 64 682

|
Не все так просто у Вас сделать. Все IP, которые начинаются на 10, серые. ---------------- inetnum: 10.0.0.0 - 10.255.255.255 netname: IANA-ABLK-RESERVED1 descr: Class A address space for private ------------------ Т.о., и модуль, и РС с сервером у Вас находятся за NAT, поэтому никоим образом недоступны друг другу, и все Ваши попытки создать описанное выше соединение бесполезны. Выходов из данной ситуации есть много, но самым лучшим видится следующие: 1. Установить сервер на РС, имеющий белый IP (причем не обязательно статический). Многие домовые сети раздают клиентам именно белые IP. Если компьютер за роутером, то в роутере необходимо прописать нужный диаппазон портов на конкретный внутрненний IP вашего компьютера с сервером (VirtualServer). Если IP от провайера белый, но динамический, пропишите в роутере или запустите на РС клиент dyndns, и бесплатно получите доменное имя на dyndns.com. В этом случае подключайтесь с модуля, используя функцию ресолвинга домена (в крайнем случае можно сделать и вручную, отправив заранее заготовленный UDP пакет на 8.8.8.8:53 и отпарсив ответ). Тут есть "подводный камень" - иногда надо постоянную исходящую активность компа с сервером для поддержки arp в сети провайдера. Например, запустите на нем скайп. 2. Более изящный вариант: арендуйте самый дешевый VDS с реальным статитческим IP (это будет стоить 5$/мес), и используйте его в качестве транзитного узла. Можно подобрать нужный готовый софт, или же написать на gcc простенький демон, выполняющий нужные операции. 3. Если все же принципиально нужно соединение точка-точка в ваших условиях, то можно попробовать с помощью внешнего сервера настроить оба NAT (модуля и внутреннего сервера) друг на друга. Так делает, например, скайп или хамачи. Это достаточно сложно алгоритмически и не всегда выполнимо (все зависит от типов NAT). Цитата(Electronics Engineer @ Oct 10 2012, 09:57)  Что касается компа на работе, то наш администратор дал внешний IP адрес моего компа и снял Firewall с порта 10000. Если быть точным, не снял Firewall, а проключил порт 10000 извне на ваш комп (создал VirtualServer-запись в своем роутере). Тоже вариант решения проблемы, но требует контакта с админом сети, его расторопности и желания. Цитата(west329_ @ Oct 10 2012, 16:18)  В Украине только ЛАЙФ и УТЕЛ выделят белый ИП по жпрс, и будьте готовы к приходу большого количества мусора. Ип при подключении всегда разный. С лайфом я не работал, а утел всегда белый и доступен извне. Если на модуле реализовать dyndns-клиент (протокол открыт, из-под OpenCPU или EAT это можно сделать), то не надо ничего просить у сисопа: сервер внутри модуля будет всегда доступен по домену. Может потребоваться периодическая активность модуля (см. выше): например, каждые 30 сек отсылать куда-нибудь удп-пакет с 1-байтной датаграмой. Мусора немного, все терпимо и отсекается на уровне сокета ядром (кстати, столько же, как и в режиме клиента), только 80й порт, естественно, не использовать
Сообщение отредактировал GeGeL - Oct 10 2012, 17:46
|
|
|
|
|
Oct 11 2012, 09:34
|
Частый гость
 
Группа: Участник
Сообщений: 89
Регистрация: 28-04-11
Пользователь №: 64 664

|
Спасибо всем за помощь в решении данной проблемы. На данный момент пока достаточно ломать голову с этими IP адресами.
Надо двигаться дальше. Написал программу для микроконтроллера, который управляет SIM900 модулем (клиент). Программа на РС является сервером. Но планируется запускать эту программу периодически, т.е. сервер с клиентом большую часть времени будут рассоединены.
В начале идет инициализация SIM900, как написано в выше упомянутом документе. Когда при соединении с сервером (отправляется команда AT+CIPSTART="TCP","195.13.137.41","10000"), а в это время сервер слушает клиента, то микроконтроллер получает ответ "CONNECT OK". С этого момента можно обмениваться данными. Если же программа сервера не работает, то микроконтроллер получает ответ "TCP CLOSED", "CONNECT FAIL" и микроконтроллер пытается подсоединиться к серверу вновь. И так до тех пор пока клиент не подсоединится к серверу. Период каждого запроса примерно составляет 2.5-3 секунды. По идее устройство (клиент) должно подлючиться к серверу максимально быстро после запуска программы сервера, т.к. пользователь с программы сервера может слать кое-какие команды устройству. Сейчас программа микроконтроллера написана так, что при удачном соединении с сервером на сервер отсылается сообщение "I am ready". По этому принятому сообщению программа сервера определяет, что можно начинать работу с клиентом. Тут все работает как надо.
Вопрос 1: Используется ли предоставляемый интернетовский объем данных при неудачных попытках подсоединения? Если клиен будет запрашивать соединение каждые 2-3 секунды, не израсходуется ли быстро лимит данных?
Вопрос 2: Устройство (клиент) должно будет слать на сервер довольно большие объемы данных (предварительно до 2 Мbit). Нужно ли использовать handshake при отсылке данных, т.к. скорость передачи данных по каналу GPRS довольно низкая, а внутренний буфер SIM900 ограничен (что-то вроде 500 байт, если не ошибаюсь)?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|