Создание прозрачного TCP-соединения через модем с использованием AT-команд

Широкое использование интернета привело к тому, что частой задачей является необходимость соединить оборудование с интернетом. В моем случае, использовался модем Cinterion MC52i, который подключается по com-порту к разрабатываемому устройству. Управление этого модема как и многими другими осуществляется через последовательный порт и использованием специальных AT-команд. Данная модель модема предоставляет прозрачный стек TCP/IP, который позволяет организовать различные протоколы обмена. Например, такие протоколы как HTTP, FTP, SMTP и другие позволяют эффективно реализовывать сессии обмена. В случае необходимости загрузки какой-либо web-странички на устройство, всего лишь надо ввести несколько AT-команд и эта страничка прилетит на вход com-порта к которому подключен модем. Далее будет показан пример загрузки страницы «www.yandex.ru» по протколу http.

Документация

Для работы с любым модулем или устройством необходимы инструкции. Так и для модема в поставке с идет несколько инструкций. Все инструкции поставляются в электронном виде на диске. Правда, тем кто не владеет техническим английским придется трудно. Вот то, что пригодятся для статьи из поставки модема:

  • mc52it_hd_v01201a.pdf — описание аппаратных характеристик;
  • mc52i_atc_v01201a.pdf — описание AT-команд.

Подключение

Подключение питания и интерфейса RS-232 детально описано в файле mc52it_hd_v01201a.pdf. Если вкратце сказать, то все разъемы уникальные. Поэтому перепутать, что куда включать сложно. Для подключения своего оборудования через данный модем необходимо подключить питание и com-порт. Правда для работы интернета также необходима SIM-карта с подключенной услугой GPRS. Модем также поддерживает и GSM соединение с интернетом, но оно уж сильно дорого. Если не ошибаюсь примерно в среднем у всех операторов стоимость gprs-интернета к wap(gsm)-интернету отличается в 210 раз на 2011 год (210, я не ошибся, стоимость так называемого wap-интернета указывается за 10 КилоБайт, а gprs\edge за 1 МегаБайт. 1МБ = 1000КБ).

З.Ы. А ещё антенну надо присоединить… А то я полдня мучался думал что же у меня не работать соединение с инетом =)

Инициализация модема (мигание светодиода, режим модема)

При подаче питания, модем пытается подключиться к сети. Выбор оператора происходит как в обычном телефоне.  Подключается к тому оператору, sim-карта которого установлена. При включении светодиод начинает медленно и продолжительно мигать. Примерно, с интервалом «600 ms on / 600 ms off» как описано в инструкции аппаратных характеристик на странице 29. При удачном подключении к оператору, режим «мигания» переходить в следующее состояние и его продолжительность составляет «75 ms on / 3 s off». Таким образом, можно определить подключился ли модем к сети или нет. Ах да! Совсем забыл! Не надо забывать присоединить антенну к модему, чтобы он смог корректно работать с сотовой сетью. Так как я, например, целый день не мог понять почему у меня модем не логиниться в сети. Всё оказалось проще простого, он не мог «разговаривать» с сетью оператора из-за нехватки антенны. =)

Настройка соединения модема с устройством

Тут все просто. При выключенном модеме и устройстве соединяем их нуль-модемным кабелем. Настройки соединения из того что написано в инструкции «It is configured for 8 data bits, no parity and, 1 stop bit, and can be operated at bit rates from 300bps to 115kbps» следующие:

  • Биты данных: 8;
  • Четность: нет;
  • Стоп биты: 1;
  • Скорость: любая от 300бит/сек до 115кбит/сек.

Идентификация (распознавание) модема

При первом знакомстве с модемом были испробованы AT-команды, которые позволяют узнать информацию о модеме. Для управления AT-командами модема лучше написать небольшую программу, которая последовательно выполнит все команды. Но в данном случае, в ней нет необходимости. Так как для получения информации о производителе, модели и программном обеспечении используются всего три команды. Для обмена с модемом была использована программа SerialMon. Можно использовать Putty или любую другую, которая позволит общаться через COM-порт. Отличие SerialMon в том, что она позволяет удобно переключаться между отображением в разных вариантах (бинарном, ASCII и т.д.) текущих данных. Вот пара скриншотов с этой программой:

   

Ниже представлена вырезка из лог файла. Выделенные строки показывают, то что передавалось в модем, соответственно остальные это ответ модема. Данные в кавычках это ASCII-текст, без ковычек — коды двоичных данных:

"AT+CGMI" 0D
"AT+CGMI" 0D 0D 0A "Cinterion" 0D 0A 0D  0A "OK" 0D 0A
"AT+CGMM" 0D
"AT+CGMM" 0D 0D 0A "MC52i" 0D 0A 0D 0A "OK" 0D 0A
"AT+CGMR" 0D
"AT+CGMR" 0D 0D 0A "REVISION 01.201" 0D 0A 0D 0A "OK" 0D 0A

Описание выполненных команд:

    • AT+CGMI — Запрос идентификатора производителя
    • AT+CGMM — Запрос идентификатора модели
    • AT+CGMR — Запрос идентификатора версии программного обеспечения

Все выполненные команды являются командами выполнения. Вообще в документации к данному модему идет описание о стандарте команд с такими модемами:

    • AT+CXXX=? — Вывести список доступных параметров для установки. Список этих параметров используется в команде для их установки «AT+CXXX=<…>»
    • AT+CXXX? — Показывает какие параметры установленные
    • AT+CXXX=<…> — Установка параметров
    • AT+CXXX — Выполнение команды

Соединения в режиме «HTTP»

Как описывалось в начале данный модем имеет поддержку протокола HTTP, поэтому получить веб страничку не составит труда. Первое что надо сделать, это сконфигурировать модема для получения необходимой странички. Далее открывается соединение и страничка начинает загружаться в буфер модема. Максимальное количество которого 1500 байт. Чтобы загрузить всю страницу, операцию чтения надо выполнить несколько раз. Думаю понятно, что количество операций чтения зависит от размера HTML-кода страницы.

В данном примере загрузиться страница «www.yandex.ru». В конфигурирование входят следующие этапы:

  • настройка способа подключения (at^scfg, at^sics);
  • настройка параметров подключения, такие как необходимая веб страничка, метод передачи GET или POST и т.д. (at^siss).

Есть интересный момент в котором я запутался, это то что параметр conId в at^siss является настройками at^sics. То есть надо задать ту цифру в которые вы занесли параметры в команде at^sics. Как видно в логе, строка «at^sics=0,conType,GPRS0» заносит параметры в набор с номером 0. Тем самым появляется нулевой набор с установленными параметрами на который ссылается команда at^siss. А вот набор команды at^siss используется при открытие соединения командой at^siso. Таким образом строка «at^siso=0» говорит о том, что необходимо открыть подключение с параметрами установленными в наборе 0 команды at^siss. В логе специально после установок параметров какой-либо команды специально выводится инофрмация о ней. Эта информация показывает, какие наборы и с какой информацией содержаться в командах. Вобщем, после настройки всех необходимых параметров можно  открывать сессию обмена.

>"at^scfg?
^SCFG: "Audio/AMR","enabled"
^SCFG: "Audio/Loop","0"
^SCFG: "Call/SpeechVersion1","0"
^SCFG: "GPRS/ATS0/withAttach","on"
^SCFG: "GPRS/RingOnIncomingData","off"
^SCFG: "PowerSaver/Mode9/Timeout","20"
^SCFG: "Radio/Band/HandOver","0"
^SCFG: "Tcp/IRT","3"
^SCFG: "Tcp/MR","10"
^SCFG: "Tcp/OT","6000"
^SCFG: "Tcp/WithURCs","off"
^SCFG: "URC/CallStatus/CIEV","restricted"
^SCFG: "URC/CallStatus/SLCC","verbose"
^SCFG: "URC/Datamode/Ringline","off"
^SCFG: "URC/Ringline","local"
^SCFG: "URC/Ringline/ActiveTime","2"

OK
"

>"at^scfg=tcp/withurcs,off
^SCFG: "Tcp/WithURCs","off"

OK
"

>"at^scfg?
^SCFG: "Audio/AMR","enabled"
^SCFG: "Audio/Loop","0"
^SCFG: "Call/SpeechVersion1","0"
^SCFG: "GPRS/ATS0/withAttach","on"
^SCFG: "GPRS/RingOnIncomingData","off"
^SCFG: "PowerSaver/Mode9/Timeout","20"
^SCFG: "Radio/Band/HandOver","0"
^SCFG: "Tcp/IRT","3"
^SCFG: "Tcp/MR","10"
^SCFG: "Tcp/OT","6000"
^SCFG: "Tcp/WithURCs","off"
^SCFG: "URC/CallStatus/CIEV","restricted"
^SCFG: "URC/CallStatus/SLCC","verbose"
^SCFG: "URC/Datamode/Ringline","off"
^SCFG: "URC/Ringline","local"
^SCFG: "URC/Ringline/ActiveTime","2"

OK
"

>"at^sics?
^SICS: 0,"conType","GPRS0"
^SICS: 0,"alphabet","0"
^SICS: 0,"inactTO","20"
^SICS: 0,"user",""
^SICS: 0,"passwd","*****"
^SICS: 0,"dns1","8.8.8.8"
^SICS: 0,"apn","internet"
^SICS: 1,"conType",""
^SICS: 2,"conType",""
^SICS: 3,"conType",""
^SICS: 4,"conType",""
^SICS: 5,"conType",""

OK
"

>"at^sics=0,conType,GPRS0

OK
"

>"at^sics=0,apn,internet

OK
"

>"at^sics=0,dns1,8.8.8.8

OK
"

>"at^sics?
^SICS: 0,"conType","GPRS0"
^SICS: 0,"alphabet","0"
^SICS: 0,"inactTO","20"
^SICS: 0,"user",""
^SICS: 0,"passwd","*****"
^SICS: 0,"dns1","8.8.8.8"
^SICS: 0,"apn","internet"
^SICS: 1,"conType",""
^SICS: 2,"conType",""
^SICS: 3,"conType",""
^SICS: 4,"conType",""
^SICS: 5,"conType",""

OK
"

>"at^siss?
^SISS: 0,"srvType","Http"
^SISS: 0,"conId","0"
^SISS: 0,"alphabet","0"
^SISS: 0,"hcMethod","0"
^SISS: 0,"hcContLen","0"
^SISS: 0,"hcAuth","0"
^SISS: 0,"hcRedir","1"
^SISS: 0,"address","http://www.yandex.ru"
^SISS: 0,"hcContent",""
^SISS: 0,"hcProp","Accept-Encoding: identity"
^SISS: 0,"user",""
^SISS: 0,"passwd","*****"
^SISS: 0,"hcUsrAgent","MC75/4.1"
^SISS: 0,"tcpMR","10"
^SISS: 0,"tcpOT","6000"
^SISS: 1,"srvType",""
^SISS: 2,"srvType",""
^SISS: 3,"srvType",""
^SISS: 4,"srvType",""
^SISS: 5,"srvType",""
^SISS: 6,"srvType",""
^SISS: 7,"srvType",""
^SISS: 8,"srvType",""
^SISS: 9,"srvType",""

OK
"

>"at^siss=0,srvType,Http

OK
"

>"at^siss=0,conId,0

OK
"

>"at^siss=0,hcMethod,0

OK
"

>"at^siss=0,address,http://www.yandex.ru

OK
"

>"at^siss?
^SISS: 0,"srvType","Http"
^SISS: 0,"conId","0"
^SISS: 0,"alphabet","0"
^SISS: 0,"hcMethod","0"
^SISS: 0,"hcContLen","0"
^SISS: 0,"hcAuth","0"
^SISS: 0,"hcRedir","1"
^SISS: 0,"address","http://www.yandex.ru"
^SISS: 0,"hcContent",""
^SISS: 0,"hcProp","Accept-Encoding: identity"
^SISS: 0,"user",""
^SISS: 0,"passwd","*****"
^SISS: 0,"hcUsrAgent","MC75/4.1"
^SISS: 0,"tcpMR","10"
^SISS: 0,"tcpOT","6000"
^SISS: 1,"srvType",""
^SISS: 2,"srvType",""
^SISS: 3,"srvType",""
^SISS: 4,"srvType",""
^SISS: 5,"srvType",""
^SISS: 6,"srvType",""
^SISS: 7,"srvType",""
^SISS: 8,"srvType",""
^SISS: 9,"srvType",""

OK
" 

>"at^siso=0

OK
"

>"at^siso?
^SISO: 0, "Http","3","1","0","0","0.0.0.0:0","93.158.134.3:80"
^SISO: 1, ""
^SISO: 2, ""
^SISO: 3, ""
^SISO: 4, ""
^SISO: 5, ""
^SISO: 6, ""
^SISO: 7, ""
^SISO: 8, ""
^SISO: 9, ""

OK
"

Как видно из описания команды at^siso после ее выполнения установилось соединение по протоколу HTTP по адресу 93.158.134.3:80. Можете попробовать этот адрес в браузере, у меня открылся яндекс, значит я всё правильно сделал ©. =) Теперь остается только прочитать всю страницу, которая делается командой at^sisr и после прочтения всех данных завершить соединение с сервером командой at^sisc. В первых попытках соединения выдается ERROR. Я специально оставил его. Уже не помню почему выдавалась ошибка, но из лога удалять не стал, пускай будет. Если у вас такая же фигня, то знайте что ничего страшного в этом нет. Видимо операция чтения запустилась раньше, чем модем начал качать страничку к себе в буфер.

>"at^siso=0

OK
"

>"at^siso?
^SISO: 0, "Http","3","1","0","0","0.0.0.0:0","93.158.134.3:80"
^SISO: 1, ""
^SISO: 2, ""
^SISO: 3, ""
^SISO: 4, ""
^SISO: 5, ""
^SISO: 6, ""
^SISO: 7, ""
^SISO: 8, ""
^SISO: 9, ""

OK
"

>"at^sisr=0,1500
ERROR
"

>"at^sisr=0,1500
^SISR: 0, 0

OK
" 

>"at^sisr=0,1500
ERROR
"

>"at^sisr=0,1500
^SISR: 0, 642
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><title>???????µ??N?</title><link rel="shortcut icon"href="http://yandex.st/lego/_/pDu9OWAQKB0s2J9IojKpiS_Eho.ico"><link rel=alternate type="application/rss+xml"title="????????N?N??? ???????µ??N??°"href="http://company.yandex.ru/news/news.rss"><link rel=alternate type="application/rss+xml"title="???»???? ???????µ??N??°"href="http://company.yandex.ru/blog/index.rss"><link rel=search href="http://yandex.ru/opensearch.xml"title="???????µ??N?"type="application/opensearchdescription+xml"><meta name="yamm"content="p"><script>var startLoadTime = +new Date(), M = {};</script><scrip

OK
"

>"at^sisr=0,1500
^SISR: 0, 1410
t type="text/javascript">document.documentElement.id = "js"; if (document.compatMode != "CSS1Compat") document.documentElement.className += " quirks"; var addEvent = function(obj, type, func, capture) { if (!obj) { return; } if (obj.addEventListener) { obj.addEventListener(type, func, capture); } else if (obj.attachEvent) { obj.attachEvent("on" + type, func); } }; var focusHandler = function(e){ var target = e.target || e.srcElement; if (!target){ return; } if (!target.tagName || target.tagName && !(target.tagName.toLowerCase() == 'input' || target.tagName.toLowerCase() == 'textarea')){ return; } if (target.id && target.id.toLowerCase() == 'text'){ window.isFocusStealed = 0; } else{ window.isFocusStealed = 1; } }; addEvent(window, 'focus', focusHandler, true); addEvent(document, 'focusin', focusHandler, true); addEvent(document, 'DOMFocusIn', focusHandler, true); var keyEventsHandler= function(e){ var target = e.target || e.srcElement; if (!target || !target.tagName){ window.isFocusStealed = 1; return; } if (!(target.tagName.toLowerCase() == 'input' || target.tagName.toLowerCase() == 'textarea')){ return; } if (target.id && target.id.toLowerCase() == "text"){ window.isFocusStealed = 0; return; } var keyCode = e.keyCode || e.which; var char = String.fromCharCode(keyCode); var re = /[a-zA-Z0-9]/; if (char.match(re)){ window.isFocusStealed = 1; } }; addEvent(document, 'keyup', keyEventsHand

OK
"

...
...
...

>"at^sisr=0,1500
^SISR: 0, 1500
???????N?N?</a> A A A <span>A©A ???????µ??N?</span></td><td class="g"><i></i></td></tr></table></div><!--u8.wfront.yandex.net--><img src="//mc.yandex.ru/watch/722545"style="position:absolute"alt=""/><img src="http://yabs.yandex.ru/count/EN7VDNahZF440WW0Zh61QFa4KP6yq4ba1fCehlL3aoV2hMg-17a3=KitNi9K2cmPfMcbQag9tm8obbXXafZHx0W00" alt="" width="1" height="1" border="0"/><noscript class="i-flashcookie i-flashcookie_type_inline g-js"onclick="return {name:'i\-flashcookie'}"><img src="http://kiks.yandex.ru/fu/"alt="fc"/></noscript><div class="b-errmsg g-hidden"><a href="#"onclick="this.parentNode.className+=' g-hidden'; return false"class="b-errmsg__close"><i class="b-errmsg__clicon"></i>???°??N?N?N?N?</a><img src="//img.yandex.net/i/www/err/warn.gif"alt=""class="b-errmsg__icon"><p class="b-errmsg__message">?? N????¶?°?»?µ????N?, ?????»????N?N?N?N? ?·?°???µN?N???N?N? ??N???N??µN?N? ????????N??????°????N? cookies ???µ N????°?»??N?N?. ?????·?????¶????, ???°?? ?????????¶?µN? <a href="http://passport.yandex.ru/passport?mode=error&error=nocki">???·???µ???µ?????µ ???°N?N?N????µ?? ?±N??°N??·?µN??°</a>.</p></div><script type="text/javascript">$(".b-errmsg").removeClass('g-hidden');</script><script type="text/javascript">$(document).ready(function(){init(1)})</script><script type="text/javascript">if (window.regClock){ regClock.locale = { month: [ 'N??????°N?N?', 'N??µ??N??°?»N?', '???°N?N??°', '?°??N??µ?»N?', '???°N?', '??N???N?', '??N??»N?', '?°????N?N?N??°', 'N??µ??N?N??±N?N?', '????N?N??±N

OK
"

>"at^sisr=0,1500
^SISR: 0, 1383
?N?', '????N??±N?N?', '???µ???°?±N?N?' ], week: [ '????N???N??µN??µ??N??µ', '???????µ???µ?»N???????', '??N???N???????', 'N?N??µ???°', 'N??µN????µN???', '??N?N?????N??°', 'N?N??±?±??N??°' ] }; regClock.init('April 24, 2012, 15:01:38', $ya('area-time')); }</script><div id="images" class="b-popupa b-popupa_theme_feffd6 b-popupa_direction_down b-popupa_is-bem_yes i-bem b-region__hint"><i class="b-popupa__shadow"></i><i class="b-popupa__tail"><i class="b-popupa__tail-i"></i></i><table cellpadding="0"cellspacing="0"class="b-popupa__wrap"><tr><td class="b-popupa__wrap-cell"><div class="b-popupa__content"><a class="b-region__hint__alone-link"onmousedown="cp('v11.region.change',this)" href="http://tune.yandex.ru/region/?reg_from=&amp;retpath=http://www.yandex.ru">?˜?·???µ????N?N? ????N?????</a></div></td></tr></table></div><script type="text/javascript">$(document).ready(function(){ if ('initRegionHint' in window){ initRegionHint('', '.b-region_city', '.b-region_city', 'v11.changeregion'); } });</script><script type="text/javascript">$('.kbd').click(function(){ var tabsOffset = $('#tabs').offset(); window.scrollTo(tabsOffset.left, tabsOffset.top); });</script><script type="text/javascript">/* reflow in ie */ var reflow = function(){}; if ($.browser.msie){ reflow = function(){ setTimeout(function(){ $('.b-password__lock').parent().css('zoom', '1'); }, 100); } } </script>

OK
"

>"at^sisr=0,1500
^SISR: 0, -2

OK
"

>"at^sisc=0

OK
"

Три точки обозначают разрыв в логе, я его сократил. Оставил первые и последние две команды чтения, чтобы не загромождать статью.

Соединение в режиме «Transparent TCP»

А теперь ближе к заголовку статьи. Прозрачный TCP/IP позволяет устанавливать соединение клиент-сервер без особого напряга. И работать также как по Ethernet, не замечая что у нас подключен к компу по COM-порту GSM-модем.

Делается это аналогично http подключению. Только я настраивал для случая когда есть две симки одного оператора и они подключены к услугу корпаративного интернета. То есть эти две симки могут видеть друг друга напрямую по статическому ip адресу. Следовательно, у них есть свой APN. Я назвал ее «you.vpn». Впринципе ниче сложного в отличие от настройки http соединения нет.

>"at^scfg?
^SCFG: "Audio/AMR","enabled"
^SCFG: "Audio/Loop","0"
^SCFG: "Call/SpeechVersion1","0"
^SCFG: "GPRS/ATS0/withAttach","on"
^SCFG: "GPRS/RingOnIncomingData","off"
^SCFG: "PowerSaver/Mode9/Timeout","20"
^SCFG: "Radio/Band/HandOver","0"
^SCFG: "Tcp/IRT","3"
^SCFG: "Tcp/MR","10"
^SCFG: "Tcp/OT","6000"
^SCFG: "Tcp/WithURCs","on"
^SCFG: "URC/CallStatus/CIEV","restricted"
^SCFG: "URC/CallStatus/SLCC","verbose"
^SCFG: "URC/Datamode/Ringline","off"
^SCFG: "URC/Ringline","local"
^SCFG: "URC/Ringline/ActiveTime","2"

OK
"

>"at^scfg=tcp/withurcs,on
^SCFG: "Tcp/WithURCs","on"

OK
"

>"at^scfg?
^SCFG: "Audio/AMR","enabled"
^SCFG: "Audio/Loop","0"
^SCFG: "Call/SpeechVersion1","0"
^SCFG: "GPRS/ATS0/withAttach","on"
^SCFG: "GPRS/RingOnIncomingData","off"
^SCFG: "PowerSaver/Mode9/Timeout","20"
^SCFG: "Radio/Band/HandOver","0"
^SCFG: "Tcp/IRT","3"
^SCFG: "Tcp/MR","10"
^SCFG: "Tcp/OT","6000"
^SCFG: "Tcp/WithURCs","on"
^SCFG: "URC/CallStatus/CIEV","restricted"
^SCFG: "URC/CallStatus/SLCC","verbose"
^SCFG: "URC/Datamode/Ringline","off"
^SCFG: "URC/Ringline","local"
^SCFG: "URC/Ringline/ActiveTime","2"

OK
"

>"at^sics?
^SICS: 0,"conType","GPRS0"
^SICS: 0,"alphabet","0"
^SICS: 0,"inactTO","20"
^SICS: 0,"user",""
^SICS: 0,"passwd","*****"
^SICS: 0,"apn",""
^SICS: 1,"conType",""
^SICS: 2,"conType",""
^SICS: 3,"conType",""
^SICS: 4,"conType",""
^SICS: 5,"conType",""

OK
"

>"at^sics=0,conType,GPRS0

OK
"

>"at^sics=0,apn,you.vpn

OK
"

>"at^sics?
^SICS: 0,"conType","GPRS0"
^SICS: 0,"alphabet","0"
^SICS: 0,"inactTO","20"
^SICS: 0,"user",""
^SICS: 0,"passwd","*****"
^SICS: 0,"apn","you.vpn"
^SICS: 1,"conType",""
^SICS: 2,"conType",""
^SICS: 3,"conType",""
^SICS: 4,"conType",""
^SICS: 5,"conType",""

OK
"

>"at^siss?
^SISS: 0,"srvType","Transparent"
^SISS: 0,"conId","0"
^SISS: 0,"alphabet","0"
^SISS: 0,"address","192.168.1.10:2222:timer=200"
^SISS: 0,"tcpMR","10"
^SISS: 0,"tcpOT","6000"
^SISS: 1,"srvType",""
^SISS: 2,"srvType",""
^SISS: 3,"srvType",""
^SISS: 4,"srvType",""
^SISS: 5,"srvType",""
^SISS: 6,"srvType",""
^SISS: 7,"srvType",""
^SISS: 8,"srvType",""
^SISS: 9,"srvType",""

OK
"

>"at^siss=0,srvType,Transparent

OK
"

>"at^siss=0,conId,0

OK
"

>"at^siss=0,address,192.168.1.10:2222:timer=200

OK
"

>"at^siss?
^SISS: 0,"srvType","Transparent"
^SISS: 0,"conId","0"
^SISS: 0,"alphabet","0"
^SISS: 0,"address","192.168.1.10:2222:timer=200"
^SISS: 0,"tcpMR","10"
^SISS: 0,"tcpOT","6000"
^SISS: 1,"srvType",""
^SISS: 2,"srvType",""
^SISS: 3,"srvType",""
^SISS: 4,"srvType",""
^SISS: 5,"srvType",""
^SISS: 6,"srvType",""
^SISS: 7,"srvType",""
^SISS: 8,"srvType",""
^SISS: 9,"srvType",""

OK
"

>"at^sisc=0

OK
"

>"at^siso=0

OK
"

>"at^siso?
^SISO: 0, "Transparent","4","2","0","0","192.168.1.9:4210","192.168.1.10:2222"
^SISO: 1, ""
^SISO: 2, ""
^SISO: 3, ""
^SISO: 4, ""
^SISO: 5, ""
^SISO: 6, ""
^SISO: 7, ""
^SISO: 8, ""
^SISO: 9, ""

OK
"

После открытия соединения следует знать что, для перехода в режим прозрачного стека, необходима команда at^sist. Она переключает режим общения с сервером, теперь не надо использовать команду чтения или отправки данных. Теперь все данные пишутся непосредственно в порт. Естественно ответ на эти данные также приходит в порт после того, как сервер их отправляет.

Я сделал тестовый сервер, который принимает документ xml. Выдергивает из него значение тега id_send и формирует xml документ с этим значением и новым тегом Reply. После чего отправляет его обратно, тому кто прислал запрос.

>"at^siso=0

OK
"

>"at^siso?
^SISO: 0, "Transparent","4","2","0","0","192.168.1.9:4210","192.168.1.10:2222"
^SISO: 1, ""
^SISO: 2, ""
^SISO: 3, ""
^SISO: 4, ""
^SISO: 5, ""
^SISO: 6, ""
^SISO: 7, ""
^SISO: 8, ""
^SISO: 9, ""

OK
"

>"at^sisi?
^SISI: 0,4,0,0,0,0

OK
"

>"at^sist=0
CONNECT
"

>"<?xml version="1.0" encoding="windows-1251" ?><data><id_send>70002</id_send></data>" 

"<?xml version="1.0" encoding="windows-1251" ?><data><id_send>70002</id_send><Reply Status="1"/></data>NO CARRIER
"

>"at^sisi=0
^SISI: 0,6,200,399,137,262

OK
"

>"at^sisc=0

OK
"

>"at^sisi=0
^SISI: 0,2,0,0,0,0

OK
"

Еще один важный момент, при переходе в работу прозрачного стека необходимо будет выйти из него чтобы вернуться в режим AT-команд. Это может сделать как клиент введя последовательность из трёх плюсов (+++) так и сервер, закрыв соединение. В любом случае при удачном завершении появится надпись «NO CARRIER». Это будет означает что сеанс с прозрачным TCP/IP завершен. Далее необходимо завершить подключение командой at^sisc. Вот и всё, вроде бы ничего сложного. Но так как это мой первый опыт работы с такими модемами, то разбирался с этим пару-тройку дней.

Используемые в статье файлы:

Запись опубликована в рубрике программирование, цифровая электроника, электроника с метками , , . Добавьте в закладки постоянную ссылку.

48 комментариев на «Создание прозрачного TCP-соединения через модем с использованием AT-команд»

  1. Ivan говорит:

    Не могу разобраться как состыковать 2 модема MC52 с выделенным ip

    • alexei говорит:

      Эээ. ну как бы стандартно. Один сервер, другой клиент. Тот который сервер, может быть им только в режиме Socket, который клиент — в режиме Socket или Transparent.

      • Nikita говорит:

        Выше приведена настройка клиента? Чем будет отличаться настройка сервера для TCP/IP помимо замены Transparent на Socket и назначения адреса в at^siso в виде socktcp://…?

      • Nikita говорит:

        Вы описали настройку клиента. В чем разница с настройкой сервера, помимо Сокета и at^siss=0,address,socktcp://…

        • alexei говорит:

          Оооо, сейчас уже не помню кокнретно что как писать, смогу посмотреть через пару недель. А так в основном сервер отличается от клиента в данном случае тем, что необходимо самому мониторить входящие соединения. На сколько я помню их может быть максимум 5-7. Соответственно при входящем соединение открывается сокет, а дальше читается и пишется в него также как и в клиенте.

  2. alexei говорит:

    С помощью AT-команд? У меня на одном компе был запущен сервер который работает на винде. АТ-командами я только на одном модеме подключался к уже запущеному и работающему серваку. Но задачка интересная, я чет не задумывался об этом. Надо как то на одном поднять на одном модеме «ожидающее» соединение, а со второго модема подрубиться как у меня написано в статье. Ты как пытаешься поднять соединение?

  3. Ivan говорит:

    Привет.
    С MC52 пробую работать но работал Wavecom Q2406 вот листинг
    как мне перегнать данны листинг в MC52

    ATE0
    AT@ATSRM=»0″
    AT@ATSAPPLMODE=»4″
    AT@ATSSIMCARD=»2″
    AT@ATSPINCODE=»0000″
    AT@ATSPINCODEREZ=»0000″
    AT@ATSGPRS=»internet»,»gdata»,»gdata»
    AT@ATSGPRSREZ=»internet.mts.ru»,»mts»,»mts»
    AT@ATSSERVERIP=»222.111.165.65″
    AT@ATSPORT=»5068″
    AT@ATSLISTEN=»2″
    AT@ATSTCPORUDP=»0″
    AT@ATSMYSTATIP=»255.255.255.255″
    AT@ATSREMSTATIP=»255.255.255.255″
    AT@ATSATSWPINTERFACE=»3″
    AT@ATSSPEED=»9600″
    AT@ATSSPEED2=»9600″
    AT@ATSICFUART2=»3″,»4″
    AT@ATSADMINREMNOM=»номер телефона модема с которого идет запрос»
    AT@ATSREMNOM=»»
    AT@ATSTNLIST=»»,»»,»»,»»,»»,»»,»»,»»,»»,»»
    AT@ATSPRRESET=»3000″
    AT@ATSNTREZ=»3000″
    AT@ATSEGCRESET=»300″
    AT@ATSATSWP=»1″
    AT@ATSATSWP2=»1″
    AT@ATSATSWPPING=»600″
    AT@ATSATSWPSIU=»siusiu»,»4″
    AT@ATSATSWPSIUPASSIVINIT=»1″
    AT@ATSALARMSMS=»0″
    AT@ATSUINIDENT=»1″
    AT@ATSMYUIN=»o2320″
    AT@ATSREMUIN=»SEC4″
    AT@ATSDBGMSG=»0″
    AT@ATSBYTEENDOFPACKET=»0″
    AT@ATSNOTCONNATTEMPT=»0″
    AT@ATSBESTOP=»0″
    AT+WAIP=1
    AT+WFM=1,B
    AT+WFM=0,A
    AT+WIND=0
    AT+WFM=1,61
    AT+WHCNF=0,0
    AT+WGPRS=9,1
    AT+CREG=0
    AT+CGREG=0
    AT+CBST=71,0,1
    AT+IPR=9600
    AT+ICF=3,4
    AT+IFC=0,0
    AT&D0
    ATS0=4
    AT+WMFM=0,1,2
    AT&S0
    AT&W

  4. alexei говорит:

    Рядом с модемами я окажусь только в конце августа. Пока что могу только отправить к документации пункту «10.12.2 Configuring Socket Listener». Там говориться:
    at^siss=4,srvType,socket Select service type Socket.
    OK
    at^siss=4,conId,0 Select connection profile 0.
    OK
    at^siss=4,address,»socktcp://listener:
    65534″
    The host specifies its local port 65534 to be used for
    the Socket listener service. The local IP address will
    be dynamically assigned

    Надеюсь поможет. 🙂

  5. ak-el-a говорит:

    Здраствуйте!
    У нас есть модем Cinterion MC52i. Сейчас он работает в режиме GSM. Хотим попробывать организовать связь через GPRS. Есть карточка МТС, статического адреса нет. Пробую создать HTTP соединение. Но на команду
    at^siso=0
    получаю ошибку
    +CME ERROR: network is down.
    И на команду
    at^siso?
    ^SISO: 0, «Http»,»2″,»1″,»0″,»0″,»0.0.0.0:0″,»0.0.0.0:0″
    ^SISO: 1, «»
    ^SISO: 2, «»
    ^SISO: 3, «»
    ^SISO: 4, «»
    ^SISO: 5, «»
    ^SISO: 6, «»
    ^SISO: 7, «»
    ^SISO: 8, «»
    ^SISO: 9, «»
    В чем может быть проблема?

    • alexei говорит:

      Я тоже не мог сначала подрубиться так как банально забыл подключить антенну к модему. Модем не мог подключиться к сети и следовательно открыть соединение.

      Второе это неправильные настройки, киньте выводы команд: «at^scfg?», «at^sics?», «at^siss?».

  6. Ivan говорит:

    ok/
    буду пробывать

  7. Евген говорит:

    Здравствуйте!
    У меня вопрос по автоматическому поднятию сокета модемом MC52. У меня стоит задача, чтобы при включении питания данный модем автоматически грузился и ждал коннекта извне. Симка со статическим IP-адресом. Модем подключен к пассивному устройству, которое отвечает только на запросы по протоколу MODBUS RTU через RS-232. Когда я подключаюсь через TCP/IP по конкретному порту к модему необходимо, чтобы он был в режиме ПРОЗРАЧНОГО МОСТА, то есть все что я пошлю по данному айпишнику должно непосредственно приходить прибору и ответы от него должны приходить также на данный айпишник. Возможно ли реализовать подобную схему? Программа, опрашивающая данный прибор, не предусматривает общение с модемом командами sisw и sisr. Если это возможно, то можете продемонстрировать как это сделать? В проспектах по модему говорится, что обмен по TCP поддерживает прозрачный режим, но в документации написаны примеры с использованием sisw и sisr, других примеров я не увидел.

    • alexei говорит:

      Как это, в режиме прозрачного TCP как раз все выполняется без at-команд, таких как at^sisr и at^sisw. Смотри последний листинг, команда at^sist переводим модем в прозрачный режим, и обмен идет без at команд.

      Теперь одно НО =) Куда же без него, данный модем позволяет использовать прозрачный режим только в качестве клиент. Это означает что если необходимо сделать модем сервером, то есть чтобы модем ожидал входящего соединения, придется использовать подключения типа сокет. А в этом режиме используются ат-команды, как раз те самые at^sisr и at^sisw. Причем еще надо использовать команды для проверки есть ли входящее подключение.

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

      Думаю в данном случае не обойтись без какого нибудь контроллера который будет проверять входящие соединения на модем, вынимать из него полученные данные, транслировать/преобразовывать их в MODBUS RTU и передавать устройству. Может быть и есть готовые модемы с такой функцией, либо устройства с поддержкой управления модемами. Но на сколько я знаю, модемы управляются вручную. Вот тут есть схема на с примером использования модема одно фирмы (http://www.owen.ru/catalog/68511956) показывающая что модем должен подключаться к какой либо программируемой логики. В частности, там либо комп либо ПЛК.

  8. HammerOk говорит:

    Здравствуйте. Есть комп с кабельным интернетом + Cinterion MC52i модемом. На обьекте установлен прибор, к нему подключен модем. На данный момент данный с прибора передаются по GSM связи. Скажите есть ли возможность передавать данные по TCP/IP с помощью кабельного интернета на модем или с помощью GPRS канала между двумя модемами???

    • alexei говорит:

      По кабельному интернету: Если связь между модемами происходит внутри своей сети, то тогда написать прогу которая с кабельного инета, будет передавать инфу с кабельного на модем, как бы своеобразный маршрутизатор. Только непонятно обмен по модемам происходит на уровне AT-команд и кто-то из них сервер?

      С помощь GPRS (я так понимаю что в данном контексте эта технология обозначалась GSM =) ): конечно, так же как и они обмениваются. Только необходимо определить кто из них сервер. Если сервер — прибор, то останется выяснить протокол обмена. Если сервер комп, то надо как то взвести сервер на приборе либо чтобы он смог отправлять данные на еще один адрес.

      ЗЫ. Сложно что-то конкретное написать при такой скудной информации. А описывать все возможные варианты слишком накладно, можно книгу накатать =)

    • leila говорит:

      Добрый день, HammerOk!
      У нас похожая задача, у нас комп с кабельным интернетом подключен к Cinterion MC52i модему, нам нужно получать данные с удаленного прибора, который также подключен к Cinterion MC52i модему.
      А Вы смогли поличить данные с прибора? МОжете подсказать какие команды необходимо для этого использовать? У нас пока нет никакой связи.
      Заранее спасибо.

      мы никак не можем получить данные при

  9. Али говорит:

    ДД. Подскажите что я делаю неправильно, ввожу at^siss=0,srvType,Transparent выходит ошибка. Перепробовал /ftp/Socket/POP3/smtp/http отклик положительный, а Transparent ERROR.
    Модем IRZ
    AT+CGMI «Cinterion»
    AT+CGMM «MC52i»
    AT+CGMR «REVISION 01.200»

    • Али говорит:

      Отвечу на свой вопрос сам. В версии прошивки REVISION 01.200 нет поддержки функции Transparent. Вопрос можно ли перепрошить модем на версию 01.201? Гугл внятного ответа не дал.

      • alexei говорит:

        Посмотрел описание «Hardware Interface Description» на свой модем, там на странице 8:

        1.1 Related Documents
        [1] MC52i Terminal AT Command Set
        [2] MC52i Terminal Release Notes
        [3] Application Note 16: Upgrading Firmware
        [4] Application Note 24: Application Developer’s Guide
        [5] Multiplexer User’s Guide
        [6] Multiplex Driver Developer’s Guide
        [7] Multiplexer Driver Installation Guide

        Сейчас нет диска от модема, но скорее всего этот документ (выделен жирным) там есть.

      • alexei говорит:

        Посмотрел русское описание:

        Дополнительные возможности
        ▪▪ Драйвер модема с послед. интерфейсом для
        подключения к устройствам на базе Microsoft®
        Windows 7™, Windows XP™ и Windows Vista™
        ▪▪ Обновление микропрограммного обеспечения
        через последовательный интерфейс

        ▪▪ Часы реального времени, реализация функций
        таймирования
        ▪▪ RIL драйвер Windows Mobile 6

  10. Ali говорит:

    Спасибо alexei за ответ, только бы найти прошу и как её залить в модем. Добился передачи данных, но не получается нормально разорвать коннект, модем висит и на ат команды не реагирует. Мутил с командами и заливал скрипт в ПОС, теперь коннектица, но не долго держит связь с серваком, т.е. сессия соединения разорвалась на серваке, данные не в полном объемепереданы , а модем соединение держит? Я вот думаю может мне Сокет нужен? Не подскажите примеры?

  11. Alex говорит:

    Здравствуйте. Вожусь сейчас с контроллером, который должен отправлять данные на сервер. Когда команды модему шлю через гипертерминал, все работает, данные передаются, сервер принимает. А вот когда контроллер шлет, данных нет. Смотрел ответы от модема, все в порядке. Соединение устанавливается, в Transparent переходит, после передачи выходит из Transparent плюсами и закрывает соединение, а на сервере данных нет. В документации на модем никаких требований к передаваемым данным не нашел. Может есть какие подводные камни?

    • alexei говорит:

      Каких то подводных комней я не помню с режимом Transparent… Может быть не идет из-за того, что контроллер цепляете напрямую к модему? В контроллере юарт, а в модеме rs232 на сколько я помню. Хотя если от модема идут данные во время управления с контроллером… Странно, а как проверяете что модем все делает правильно при работе с контроллера?

      • Alex говорит:

        линии RX и TX завел на отдельные порты компьютера и смотрю что там творится. Соответственно вижу что идет в модем и что модем отвечает. Раньше передача информации через СМС была, все работало четко, сейчас вот дальше пошел. Между передаваемыми данными задержки по 100 мс попробовал поставить, все равно ничего.

        • alexei говорит:

          Как это на отдельные порты компьютера? Может лучше осциллограф подцепить? Может быть такое что соединение еще не открыто, а вы уже отправляете информацию. Там есть какой то режим (сейчас уже точно не помню), но при открытие, если не ошибаюсь команда siso пишет что соединение открыто, но на самом деле надо ждать прихода строки с «^SISR: 1,x,x», если опять же не ошибаюсь. Было что-то подобное, но что-то конкретное сейчас сказать не могу, в то время был огромный дефицит времени, так что есть только смутные воспоминания. 🙂

          • Alex говорит:

            Rx подключил к RX одного порта компьютера, TX к линии RX другого порта компьютера. На оба порта запустил слушалки. Строка от модема SISW 0,1 приходит. После команды SIST модем отвечает Connect. Передаю данные, затем +++. Модем отвечает Ok. На осциллографе не удобно смотреть, видно будет что что-то идет, а что именно не понятно. Так я вижу в текстовом виде весь трафик между контроллером и модемом. Вот только на сервере данных нет. Вот и не могу понять что не так.

          • alexei говорит:

            Вот нашел. Пример из документации, если включен юрс режим, то после siso, должен появляться ^SISW после открытия сокета. Затем уже можно переходить в транспарент режим. Ну а так совет проверить все ли циферки прально совпадают, у меня самая частая ошибка была это, не соответсвия циферок(siso=1 и т.п.) в командах. =)
            at^siso=1
            OK
            ^SISW: 1,1 <<<<<<<<<<<<< at^sist=1 CONNECT ...DATA... +++ OK

  12. Alex говорит:

    Благодарю за помощь. С циферками у меня все в порядке было. Слишком рано закрывал соединение. Модем еще не успевал передать данные. Пока поставил задержку побольше и все нормально стало передаваться. Теперь делаю основную программу, чтобы это все по человечески работало.

    • alexei говорит:

      А про это задержку есть что нибудь в документации??? То есть при вводе +++ модем тупо закрывает все соединения даже если данные еще не передались??? Хм, я транспарент моде у себя убрал за ненадобностью, сейчас через сокеты и прием и передача.

  13. PdP говорит:

    Здравствуйте.
    Использую данный модем для передачи коротких сообщений через сокет. Столкнулся с такой проблемой: каждый раз, когда нужно отправить новое сообщение модем должен заново подсоединиться к GPRS, а уже потом конектится к серверу. Подключение к GPRS может занимать до 10 секунд, что очень долго. Нет ли какого-нибудь способа постоянного поддержания GPRS соединения, а конектится к сокету сервера уже по-требованию?

  14. Euromobile говорит:

    Здравствуйте
    для не разрыва GPRS через 20сек не активности, требуется изменить параметр “inactTO“.
    Для квалифицированного ответа пишите компании продавцу или официальному дистрибьютору Cinterion — euromobile.ru

  15. Dream говорит:

    Добрый день!
    Подскажите возможна работа с несколькими открытыми сокетами(например Web на устройстве + отправка технической информации на сторонний сервер) в прозрачном режиме? Если да, то как разделять пакеты от разных сокетов?

    • alexei говорит:

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

  16. Максим говорит:

    Добрый день, стоит такая тестовая задача:
    На стороне веб-сервера настроил скрипт, обрабатывающий параметры в адресной строке вида: http://www.nppesn.ru/test?login=login&password=password&testint=12345 — цифровое значение заносится в базу данных после проверки пароля.

    Клиент — программируемый логического контроллер ОВЕН ПЛК-100 на объекте отправляет информацию на веб-сервер через GPRS модем ОВЕН ПМ-01. Как организовать передачу запроса вида: http://www.nppesn.ru/test?login=login&password=password&testint=12345 через модем и AT-команды?

  17. ridd говорит:

    Скажите пожалуйста можно ли с помощью модема MAESTRO 100 соединиться к счетчику Меркурий 230

  18. Юленок говорит:

    Здравствуйте. У меня еще на этапе установления GPRS подключения к яндексу, после ввода at^siso=0 модем виснет. Ни подтверждения, ни сообщения об ошибке. И команды не вводятся. Модем IRZ MC52PU, AT+CGMI «Cinterion», AT+CGMM «MC52i» 🙁
    Подскажите, пожалуйста, как быть?

  19. Дмитрий говорит:

    Прежде всего, спасибо за примеры.
    Вопрос — как узнать какой динамический IP адрес получил наш модем? at+cgpaddr=1 тут не работает. И, кстати, почему?
    Заранее спасибо.

  20. willrast говорит:

    Добрый день. Мне нужно пройти идентификацию на сайте(любой сайт). Как с помощью АТ команд можно это сделать?
    P.S. Очень полезная статья, спасибо!

  21. willrast говорит:

    Неужели никто не занимался этим?

  22. Роман говорит:

    Подскажите пожалуйста, есть ли такой файл на русском языке: mc52it_hd_v01201a — аппаратное описание модема. Если такой существует, скиньте ссылку, очень нужно! Заранее спасибо!

  23. Юрий говорит:

    о-о-о-о-чень полезная и точная информация! спасибо Вам!

  24. Prof32 говорит:

    Добрый день.

    Не подскажите, можно ли с помощью модема MC52i отправлять файлы по E-mail?
    как отправлять текстовые E-mail я разобрался. (Настройка SMTP сервер)

  25. Виталий говорит:

    Здравствуйте! У нас имеется около 150 GSM модемов Cinterion MC52i. Мы с помощью их опрашиваем приборы учета по каналу CSD. На всех модемах установлены сим карты оператора мегафон.Вопрос:
    1. Можно ли все эти модемы перевести на GPRS канал и опрашивать приборы?
    2. На сим динамический IP. если вдруг пропала связь, или электричество через некоторое время модем включился чтоб он переподключался к серверу? Т.е устанонавливал соединение по TCP/IP? Чтоб не ехать на объект и делать переподключение…
    3. Можно ли в данный модем устанавливать другие модули?
    4. Существуют ли прошивки на эти моджемы для улучшения каких либо конфигураций?
    5. Можно ли установить функцию GPRS по-вызову?

  26. Петр говорит:

    Здравствуйте. Подскажите, как сохранить настройки подключения по GPRS после отключения питания модема?

    • alexei говорит:

      Давно это было… На сколько я помню, я инициализировал из кода при включении. Хотя какая-то возможность сохранять настройки и сбрасываться к ним вроде бы там есть.

  27. Андрей говорит:

    Алексей, подскажите пожалуйста. Имеется объект на котором установлен узел учета. Есть родной софт который может общаться по COM порту с прибором и получать с него данные. Есть 2 модема Cinterion MC52i. Возможно ли создать прозрачный канал связи (CSD) между этими модемами?

    • alexei говорит:

      Добрый день, к сожаленю, очень давно не работал с модемами. Очень слабо помню, но вроде что то подобное там было. Или это я путаю с модемами компании ОВЕН… К сожалению, сейчас уже врядли чем-то могу помочь.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*