Gsm модем sim900. Некорректный GET-запрос на сервер


Здравствуйте!
Встала тут задача по управлять загородным домом, последить за температурой, дверями, окнами. И тут же возник вопрос о среде передачи данных. Ну провода и радиоканал отпадают из-за дороговизны, ВОЛС просто мечты, а вот GSM то что нужно. Сначала пал глаз на старые телефоны "Motorola", "Nokia", "SonyEricsson". Посмотрел, повертел и передумал. Первое, не хотел подпаиваться к контактам кнопок, да и обратной связи нет. Второе, разбираться с ПО телефона, ну это совсем не в кассу. В общем в творческих раздумьях и плавая в просторах всемирной паутины, изловив пару вирусов был найден компромисс. И работа с ПО и без всяких кнопок. Все это предлагает модуль SIM900D . Чем он мне приглянулся.
- Первое это простота монтажа. В этом вы убедитесь позже. - Второе это общение через UART. (Это значит МК + SIM900D = нормальная связь) - Третье это питание модуля от 3 до 4.8 вольт. Хош AVR, хош ARM. По вкусу. Ну лирики хватит, пора по делу.
Выглядит сей модуль так.

По поводу монтажа. Как видите модуль заточен на поверхностный монтаж. Размеры контактных площадок достаточно большие даже для ЛУТа. Ниже картинка моего устройства.

Как видите ничего сложного. Теперь давайте поговорим о схеме подключения этого чуда. Глядим мануал. И видим распиновку.

Да, много всего, но все использовать не будем. Первое что нам потребуется это обвязать все выводы "GND". Если глянуть на правый верхний угол, то можно заметить три отдельных вывода. Два "GND" и "ANT". Эти выводы расположены таким образом не просто так. Глянем в документацию на картинку подключения антенны.

59 и 61 контакты должны находиться как можно ближе к выводу антенны. Дополнительные схемы выделенные пунктиром, нужны для подключение антенн с кабелем. Поэтому я впаял SMA разъем как можно ближе к выводам 59, 60, 61 и не стал заморачиваться со схемой согласования, при этом с антенной на 3-х метровом кабеле и в месте очень плохого приема, выжал из модуля 13 балов из 31. Разъем видно на картинке выше. Точнее ноги от него)) Сам разъем с другой стороны. При этом контакты 59 и 61 как бы обнимают антенну. Ну как-то так. Далее давайте поговорим о SIM-карте. Для ее установки я использовал вот такой разъем (SIM ICA-501-006-01-F7)

Самое интересное то что я нашел 3 варианта распиновки SIM-карт. Какую использовать? Не буду вносить интриги, а для простоты привожу распиновку данного разъема. Вид сверху.

Но это еще не все. Если глянуть в монуал на схему включения SIM-карты, то там можно увидеть некую микросхемку под названием SMF05C . Эта микросхема содержит защитные диоды аж 5 штуков. Нужна для зашиты контактов SIM-карты. Конечно можно ее и не ставить, но тогда будьте внимательны и не трогайте контакты пальцами!!! Я как грешный человек за себя не ручаюсь, поэтому микруху припоял. А вот и сама схема.

Она конечно приведена для 8-и контактной SIM-карты, но для 6-ти будет тоже самое. Есть правда две засады с этой микросхемой. Первая это то что ее хрен где сыщешь. А вторая то что размер ее... Я когда получил заказ и достав положил ее на стол... Короче на втором рисунке сверху она впаяна между SIM-картой и батарейкой. Для сравнения резисторы 0805. Ну а справа транзистор в корпусе SOT-23. Так ну вроде с SIM-картой разобрались, поехали дальше. А дальше светотехника. Вообще говоря это на любителя. Так как все эти сигналы можно завести прямо в МК и он там сам пускай разбирается. Я все их вывел из чувства к прекрасному. Так что решайте сами.
- Первое это сигнал включен модуль или нет (STATUS) лог 1 - Второе это сигнал наличия регистрации сети (NETLIGHT) лог 1/0 (мигает) Если мигает с одинаковой частотой, значит не зарегистрировался в сети Если длинный промежуток, значит есть конект к сети. - Третье это сигнал звонка/sms (RING) лог 0 Горит если есть входящий звонок и моргнет при получении sms-сообщения. Первые два сигнала нужно подключать через NPN транзистор в ключевом режиме.

А третий сигнал (RING) нужно подключать через PNP транзистор. Еще один не мало важный сигнал, это кнопка включения и выключения модуля. (куда же без нее). Вот что нам предлагает мануал.

То есть подали лог 1 на базу транзистора на 1 секунду и модуль включился.
Теперь давайте поговорим о питании. Да, я бы ща от хорошей тарелочки борьща не отказался бы, а вы? Ну ладно, едем дальше. Питается модуль напругой от 3 до 4.8 вольтов. Вроде все просто, да не так. В момент звонка, передачи sms, поиска сети модуль может потребовать аж до 2А. Во как. Так что любители LM7805 и КРЕНок могут огорчиться. К счастью в мануале присутствуют две схемы на микросхемах MIC29302 (я так в продаже ее и не нашел) и LM2596 (эту купить можно). Но я лениииивый и собирать питалово с таким большим количеством обвязки просто не захотел. Я пошукал в интернете и нашел. Есть такой хороший стабилизатор для процессоров типа "Пень", "AMD" на 3.3в и до 7.5А. Во, думаю то что надо и ARM запитать можно и модуль. Вот схема этого чуда.

А вот как это выглядит в собранном виде.

Радиатор поставил со страху, в принципе микросхема не греется даже во время звонка. И последнее на что следует обратить внимание, это на батарейку. Она нужна для поддержания жизни часов реального времени. Самое важное что оставлять этот вывод в воздухе нельзя. Лично я сошелся на подключении батарейки чего и вам желаю. Можно конечно две АА влепить)) но как-то крупновато, а вот в форме таблетки 2032 на 3v то что надо. Благо они стоят не дорого и отсеки паять можно прям на плату. По моему это самое простое решение. Решать вам. Ну вроде и все. Вот как это все безобразие выглядит вместе и в работающем состоянии.

В следующей статье я расскажу как ломал этот модуль но уже программно через терминал при помощи АТ команд.
Выкладываю схемы в PCAD-2006
Архив с файлами модуля GSM.
Архив с файлами блока стабилизации.
Продолжение цикла статей о GSM модуле.
AT-Команды.
Связь модуля с ATmega8515.
Отладочная плата на базе SIM900D


Foli 14.03.13

Хотелось бы подробней о АТ командах, UARTу и непосредственно работы с этим в CodeVision

Алексей 15.03.13

С АТ командами разбираюсь. Не хочу выкладывать половину работы, так как есть некоторые вопросы. А с UARTтом и CVAVR там все просто. Как только разберусь с АТ командами сразу выложу и какие команды и как из CVAVR их подать.

Anatok 04.11.13

Все это красиво. А вот если сигнализация работала хотя бы при минус 30-и градусах и зарядилась скрытыми солнечными батареями особенно зимой, то желающих иметь такой аппарат было бы очень много.

Алексей 04.11.13

GSM модуль жрет до 2А при регистрации в сети или звонке или связи по GPRS. Для таких ресурсов требуется хороший аккумулятор, а при -30 АКБ долго не проживет. Даже в метеостанциях на уличных датчиках рекомендуют использовать простые батарейки.

Мишка 11.11.13

Если еще актуально и интересно...помотри на EAT для SIM900. В нем внутри ARM и есть SDK в котором можно загружать приложения в SIM900 из которых можно много всего делать...например посылать те-же AT команды...+клавиатура + SPI дисплей... + 2 АЦП:) Нескучного вечера:)

Мишка 11.11.13

А све-таки для него очень красиво делать для него питание на L5973D. Да про 2А написана в даташите...но практически это очень кратковременные импульсы. У меня он прекрасно работает например с Arduino Mega которая сама питается от USB порта (у которога ток 0.5 А)

Алексей 11.11.13

В этом-то и загвоздка. Я тоже по началу питал от 7805, все работало, а потом бац... И при подключении к сети все гаснет, а потом в рестарта идёт. Видимо сторожевая собака по припадке питания рестартует. А с L7953D будет красиво, но где её взять и скопа она будет стоить:) Поэтому я перешёл на IRU1075

Алексей 11.11.13

Прошу прощения за ошибки, это чертов ГУДРОЙД горбыли лепит за меня. Думает он умнее. Не буду править, пусть Гуглу стыдно будет за их работу.

дядяМиша 24.12.13

У меня при регистрации в сети атмега в перезагруз уходит. Хотя стоит импульсный dcdc. Конденсаторов на 200мкф. А бывает, работает стабильно. Замучался уже.

Алексей 25.12.13

Схему в студию. Со слов довольно сложновато понять проблему.

дядяМиша 25.12.13
дядяМиша 25.12.13

Http://ybex.com/d/tk7kgiefpklpeujb1zbl4lo5 mrkf7ayvci04ouq3.html МК запитан от 2.8 (пробовал даже 3.7) Вольт, чтобы не городить преобразователь уровня.

Алексей 25.12.13
сергей 19.07.14

Алексей здравствуйте! у вас есть готовые платы с сим900, можно ли купить?

Алексей 19.07.14

В каком смысле готовые? Сам модуль уже собран и остается под конкретный девайс изготовить плату с требуемыми выходами и входами. Та что в данной статье это лишь демо плата для отладки программ. Для конкретного девайса требуются размеры, расположение разъемов, выходов на наушники и микрофон. Где будет антенный разъем. Дайте более подробную информацию о том что Вам нужно.

Андрей 28.09.14

Я так понимаю это прототип той платки которую я жду не дождусь. Только в коммерческом варианте её поженили с блоком питания и облагородили аудио выходами. Что есть большой гуд.

Алексей 28.09.14

Собственно так и есть. Я просто сразу убил несколько зайцев. Решил извечную проблему с питанием и согласованием уровней на UART. И для шика добавил аудио вход и выход. Фактически готовый сотовый телефон.

Андрей 28.09.14

Хотел бы внести рацуху на будущее. по сути данная плата законченный узел. И её ПРАКТИЧЕСКИ можно использовать в готовом изделии. однако есть одно НО. При мезонном навесе её по любому лучше ставить сверху (разъем антены, доступ к симкарте) поэтому вполне целесообразно параллельно всем штырькам для "периферии" оставлять отверстия для таких же штырьков с возможностью впайки оных направлением "вниз". Т.е. захотел я данный девайс насадить на плату микроконтроллера, развёл под твой, запаял ответные разъемы в него и состыковал. Ещё и с

Андрей 28.09.14

Сожрало полмессаги, но мысль надеюсь понятна-)

Алексей 28.09.14
Сергей 01.02.15

Подскажите почему модуль греется и неловит сеть?

Алексей 01.02.15

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

Сергей 01.02.15

Платы у меня заводские, МастерКит BM8039 и на обеих одна и та же проблема..вставляешь симку модуль начинает грется и нет сети.

Алексей 01.02.15

Довольно сложно сказать. Схема заводская, надо по плате полазить. Из документации видно что на плате нет рекомендуемых защитных диодов для SIM-карты. Сама карта и разъем по пинам совпадают? 300 модуль старый и по моему он работает только с симками 5 вольтовыми, а сейчас они все на 3в. Но я могу и ошибаться. Надо смотреть саму плату, так сложно что-то сказать. Если симптом на обеих один и тот же, то я бы какпал в сторону разъема и вольтажа симок. Еще раз, современные симки на 3-х вольтовые.

Сергей 01.02.15

Стоит sim900D...диодов нет.Когда вставляю карту появляется питание на модуле и он начинает греться,но на симку напр. с 9 ноги не идёт..

Сергей 01.02.15

Изначально работали нормально..потом что то коратнуло...не могу понять что..

Сергей 01.02.15

Можно как то проверить модуль не выпаивая?

Алексей 01.02.15

А что именно коротнуло? Если питание на симку не идет, то я боюсь сдохла линия для симки. А симка сколько ног? 6 или 8? Для проверки можно не вставляя симки пообщаться с модулем по шине UART 3, 4 ноги. Если откажется принимать АТ команды, то я думаю можно его хоронить.

АНОНИМ 01.02.15

Что коротнуло точно незнаю..ног 8 ..а как пообщаться то?

Алексей 01.02.15

А на разъеме тоже 8? Берем микросхему FT232RL, собираем переходник USB<->TTL, припаеваемся к UART модуля, запускаем терминал, например Putty, пишем AT и давим ентер. Если вернет ОК, значт еще не все потеряно. Если тишина... На помойку. А да, какие светодиоды а плате? как определяется наличие регистрации в сети?

Сергей 02.02.15 03:12

На разъёме тоже 8..на плате два светодиода зелёный и красный,наличие сети определяется по морганию зелёного раз в три секунды...можно как то вставить фото платы?

Алексей 02.02.15 07:42

Проще перейти на форум.

Сергей 02.02.15 14:02

Если не вставлять симку значит нужно подать питание на модуль?

Алексей 02.02.15 15:48

Я не могу гадать на кофейной гуще. Мне нужна либо схема, либо плата. И причем тут питание модуля и сим карта? Там скорее всего еще с каким-то микроконтроллером пересекается. Он и подает питание. В общем нужна схема. А так это как диагноз по телефону ставить.

Сергей 02.02.15 15:56

Где на форуме можно выложить схему?

Сергей 02.02.15 15:57

Питание на модуль приходит только когда вставляешь симку

Алексей 02.02.15 19:27

Ну нет такого у модуля SIM900D. Для включения модуля необходимо удержать низкий уровень на ножке 12, а потом поднять. Сим карту вообще нельзя вставлять или вынимать при включенном модуле, есть вероятность сжечь порт. Если посмотреть документацию, то можно там найти рекомендации по установке защитных диодов на линии порта сим карты. На форуме . Создать тему и выложить фото.

Евгений 08.09.15 12:04

У меня при подаче напряжения на модуль, на 12 ноге присутствует положительный потенциал, на 5 ноге так же положительный (при условии, что данные ноги висят в воздухе). Подскажите пожалуйста, ведь на 5 ноге вроде должен быть ноль? Если не так, пожалуйста поправьте меня.

Алексей 08.09.15 13:21

12 ножка это включения модуля. На ней при подаче питания висит 1. Для включения модуля нужно прижать на пару секунд 12-тую ножку к общему проводу, то есть подать 0. При подаче питания на модуль 5 ножка должна быть подтянута к общему проводу двумя резисторами (это видно из схемы включения транзистора в ключевом режиме) и на ней должен быть 0, так как базу нужно подтянуть к нулю для полного закрытия транзистора. После прижатия 12 ноги к нулю, на 5 ножке должна появится 1, а через некоторое время меандр с указанием статуса наличия и подключения к сети.

GSM и GPRS модуль в проектах Ардуино позволяет подключаться к удаленным автономным устройствам через обычную сотовую связь. Мы можем отправлять команды на устройства и принимать информацию от него с помощью SMS-команд или через интернет-подключение, открытое по GPRS. В этой статье мы рассмотрим наиболее популярные модули для Arduino, разберемся с подключением и рассмотрим примеры программирования.

Модули GSM GPRS

GSM модуль используется для расширения возможностей обычных плат Ардуино – отправка смс, совершение звонков, обмен данными по GPRS. Существуют различные виды модулей, наиболее часто используемые – SIM900, SIM800L, A6, A7.

Описание модуля SIM900

Модуль SIM900 используется в различных автоматизированных системах. С помощью интерфейса UART осуществляется обмен данными с другими устройствами. Модуль обеспечивает возможность совершения звонков, обмен текстовыми сообщениями. Работа модуля релизуется на компоненте SIM900, созданным фирмой SIMCom Wireless Solution.

Технические характеристики:

  • Диапазон напряжений 4,8-5,2В;
  • В обычном режиме ток достигает 450 мА, максимальный ток в импульсном режиме 2 А;
  • Поддержка 2G;
  • Мощность передачи: 1 Вт 1800 и 1900 МГц, 2 Вт 850 и 900 МГц;
  • Имеются встроенные протоколы TCP и UDP;
  • GPRS multi-slot class 10/8;
  • Рабочая температура от -30С до 75С.

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

Описание модуля SIM800L

Модуль выполнен на основе компонента SIM800L и используется для отправки смс, реализации звонков и обмена данными по GPRS. В модуль устанавливается микро сим карта. Устройство обладает встроенной антенной и разъемом, к которому можно подключать внешнюю антенну. Питание к модулю поступает от внешнего источника либо через DC-DC преобразователь. Управление осуществляется с помощью компьютера через UART, Ардуино, Raspberry Pi или аналогичные устройства.

Технические характеристики:

  • Диапазон напряжений 3,7В – 4,2В;
  • Поддержка 4х диапазонной сети 900/1800/1900 МГц;
  • GPRS class 12 (85.6 кБ/с);
  • Максимальный ток 500 мА;
  • Поддержка 2G;
  • Автоматический поиск в четырех частотных диапазонах;
  • Рабочая температура от –30С до 75С.

Описание модуля A6

Модуль A6 разработан фирмой AI-THINKER в 2016 году. Устройство используется для обмена смс-сообщениями и обмена данными по GPRS. Плата отличается низким потреблением энергии и малыми размерами. Устройство полностью совместимо с российскими мобильными операторами.

Технические характеристики:

  • Диапазон напряжений 4,5 – 5,5В;
  • Питание 5В;
  • Диапазон рабочих температур от -30С до 80С;
  • Максимальное потребление тока 900мА;
  • GPRS Class 10;
  • Поддержка протоколов PPP, TCP, UDP, MUX.

Модуль поддерживает карты формата микросим.

Описание модуля A7

A7 является новейшим модулем от фирмы AI-THINKER. По сравнению со своим предшественником A6 имеет встроенный GPS, позволяющий упрощать конструкцию устройства.

Технические характеристики:

  • Диапазон рабочих напряжений 3,3В-4,6В;
  • Напряжение питания 5В;
  • Частоты 850/900/1800/1900 МГц;
  • GPRS Class 10: Макс. 85.6 кбит;
  • Подавление эха и шумов.

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

Где купить GSM модули для ардуино

Традиционно, прежде чем начать, несколько советов и полезных ссылок на продавцов Aliexpress.

Очень качественный модуль KEYES SIM900 GSM GPRS Модуль SIM800C для ардуино от проверенного поставщика
Шилд для разработки, совместимый с Ардуино, на базе модуля SIM900 GPRS/GSM Недорогой модуль mini A6 GPRS GSM

Подключение GSM GPRS шилда к Arduino

В этом разделе мы рассмотрим вопросы подключения GSM – модулей к плате адуино. За основу почти во всех примерах берется Arduino Uno, но в большинстве своем примеры пойдут и для плат Mega, Nano и т.д.

Подключение модуля SIM800

Для подключения нужны плата Ардуино, модуль SIM800L, понижающий преобразователь напряжения, провода для соединения и батарея на 12В. Модуль SIM800L требует нестандартное для ардуино напряжение в 3,7В, для этого нужен понижающий преобразователь напряжения.

Распиновка модуля SIM800 приведена на рисунке.

Плату Ардуино нужно подключить к компьютеру через USB кабель. Батарею на 12 В подключить через преобразователь: -12В на землю Ардуино, от земли в преобразователь в минус, +12В в преобразователь в плюс. Выходы с модуля TX и RX нужно подключить к пинам 2 и 3 на Ардуино. Несколько модулей можно подключать к любым цифровым пинам.

Подключение модуля A6

Модуль A6 стоит дешевле, чем SIM900, и его очень просто подключать к Ардуино. Модуль питается напряжением 5В, поэтому для соединения не нужны дополнительно понижающие напряжение элементы.

Для подключения потребуются плата Ардуино (в данном случае рассмотрена Arduino UNO), GSM модуль А6, соединительные провода. Схема подключения приведена на рисунке.

Вывод RX с модуля GSM нужно подключить к TX на плате Ардуино, вывод TX подключить к пину RX на Ардуино. Земля с модуля соединяется с землей на микроконтроллере. Вывод Vcc на GSM модуле нужно соединить с PWR_KEY.

Подключение с помощью GSM-GPRS шилда

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

Перед подключением к Ардуино нужно установить сим-карту на GSM-GPRS шилд. Также нужно установить джамперы TX и RX, как показано на рисунке.

Подключение производится следующим образом – первый контакт (на рисунке желтый провод) с шилда нужно соединить с TX на Ардуино. Второй контакт (зеленый провод) подключается к RX на Ардуино. Земля с шилда соединяется с землей с аруино. Питание на микроконтроллер поступает через USB кабель.

Макет соединения шилда и платы Ардуино изображен на рисунке.

Для работы потребуется установить библиотеку GPRS_Shield_Arduino.

Для проверки правильности собранной схемы нужно сделать следующее: соединить на Ардуино RESET и GND (это приведет к тому, что данные будут передаваться напрямую от шилда к компьютеру), вставить сим-карту в шилд и включить питание шилда. Плату Ардуино нужно подключить к компьютеру и нажать кнопку включения. Если все соединено правильно, загорится красный светодиод и будет мигать зеленый.

Краткое описание взаимодействия через AT-команды

AT-команды – это набор специальных команд для модема, состоящий из коротких текстовых строк. Чтобы модем распознал поданную ему команду, строки должны начинаться с букв at. Строка будет восприниматься, когда модем находится в командном режиме. AT-команды можно отправлять как при помощи коммуникационного программного обеспечения, так и вручную с клавиатуры. Практические все команды можно разделить на 3 режима – тестовый, в котором модуль отвечает, поддерживает ли команду; чтение – выдача текущих параметров команды; запись – произойдет записывание новых значений.

Список наиболее используемых AT-команд:

  • AT – для проверки правильности подключения модуля. Если все исправно, возвращается OK.
  • A/ – повтор предыдущей команды.
  • AT+IPR? – получение информации о скорости порта. Ответом будет +IPR: 0 OK (0 в данном случае – автоматически).
  • AT+ICF? – настройка передачи. В ответ придет +ICF: бит, четность.
  • AT+IFC? – контроль передачи. Ответом будет +IFC: терминал от модуля, модуль от терминала (0 – отсутствует контроль, 1 – программный контроль, 2 – аппаратный).
  • AT+GCAP – показывает возможности модуля. Пример ответа – +GCAP:+FCLASS,+CGSM.
  • AT+GSN – получение IMEI модуля. Пример ответа 01322600XXXXXXX.
  • AT+COPS? – показывает доступные операторы.
  • AT+CPAS – состояние модуля. Ответ +CPAS: 0. 0 – готовность к работе, 3 – входящий звонок, 4 – голосовое соединение, 2 – неизвестно.
  • AT+CCLK? – информация о текущем времени и дате.
  • AT+CLIP=1 – включение/выключение АОН. 1 – включен, 0 – выключен.
  • AT+CSCB=0 – прием специальных смс-сообщений. 0 – разрешено, 1 – запрещено.
  • AT+CSCS= “GSM” – кодирование смс-сообщения. Можно выбрать одну из следующих кодировок: IRA, GSM, UCS2, HEX, PCCP, PCDN, 8859-1.
  • AT+CMEE=0 – получение информации об ошибке.
  • AT+CPIN=XXXX – ввод пин-кода сим-карты.
  • AT&F – сброс до заводских настроек.
  • AT+CPOWD=1 – срочное(0) или нормальное(1) выключение модуля.
  • ATD+790XXXXXXXX – звонок на номер +790XXXXXXXX.
  • ATA – ответ на вызов.
  • AT+CMGS=”+790XXXXXXXX”>Test sms – отправка смс-сообщения на номер +790XXXXXXXX.

В данном случае рассмотрены основные команды для модуля SIM900. Для разных модулей команды могут незначительно отличаться. Данные для модуля будут подаваться через специальную программу «терминал», которую нужно установить на компьютер. Также подавать команды модулю можно через монитор порта в Arduino IDE.

Скетчи для работы с модулем GSM

Отправка СМС на примере SIM900

Перед тем, как отправить сообщение, нужно настроить модуль. В первую очередь нужно перевести в текстовый формат передаваемое сообщение. Для этого существует команда AT+CMGF=1. Нужно перевести кодировку на GSM командой AT+CSCS=»GSM». Эта кодировка наиболее удобная, так как там символы представлены в ASCII коде, который легко понимает компилятор.

Затем нужно набрать смс-сообщение. Для этого посылается команда с номером абонента AT+CMGS=»+79XXXXXXXXX» r, в ответ предлагается набрать текст смс. Нужно выполнить отправку сообщения. По окончании требуется отправить код комбинации Ctrl+Z, модуль позволит отправку текста адресату. Когда сообщение будет отправлено, вернется OK.

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

Получение смс. Для чтения смс-сообщения используется команда AT + CNMI = 2,2,0,0,0. Когда на модуль придет текстовое сообщение, он отправит в последовательный порт +CMTI: «SM»,2 (в данном случае 2 – порядковый номер сообщения). Чтобы его прочитать, нужно отправить команду AT+CMGR=2.

Прием голосового звонка. В первую очередь для разговора нужно подключить к модулю динамик и микрофон. При получении звонка будет показан номер, с которого он совершен. Для осуществления работы нужно включить библиотеку GSM:

#include

Если сим-карта заблокирована, нужно ввести ее пин-код. Если пин-код не требуется, это поле нужно оставить пустым.

#define PINNUMBER “”

В setup() должна быть произведена инициализация передачи данных на компьютер. Следующим шагом будет создание локальной переменной, чтобы отследить статус подключения к сети. Скетч не будет запущен, пока сим-карта не подключена к сети.

boolean notConnected = true;

С помощью функции gsmAccess.begin() происходит подключение к сети. При установлении соединения вернется значение GSM_READY.

vcs.hangCall(); – функция, показывающая, что модем готов принимать звонки.

getvoiceCallStatus() – определяет статус скетча. Если кто-то звонит, она возвращает значение RECEIVINGCALL. Для записи номера нужно воспользоваться функцией retrieveCallingNumber(). Когда будет совершен ответ на звонок, вернется TALKING. Затем скетч будет ждать символа новой строки, чтобы прервать разговор.

Установить GPRS-соединение и отправить данные на удаленный сервер

Сначала нужно установить библиотеку SoftwareSerial, которая позволяет обеспечивать последовательную передачу информации и связать GSM-модуль и микроконтроллер Ардуино.

Для отправки данных на сервер нужно отправить следующие команды:

AT+SAPBR=1,1 – открытие Carrier.

Следующие три команды связаны с установкой настроек подключения к сети.

AT+SAPBR=3,1,\”APN\”,\”internet.mts.ru\” – выбор оператора mts, имя точки доступа.

AT+SAPBR=3,1,\”USER\”,\” mts \” – выбор пользователя mts.

AT+SAPBR=3,1,\”PWD\”,\” mts \”

AT+SAPBR=1,1 – установка соединения.

AT+HTTPINIT – инициализация http.

AT+HTTPPARA=”URL”, – URL адрес.

AT+HTTPREAD – ожидание ответа.

AT+HTTPTERM – остановка http.

Если все выполнено правильно, в мониторе порта будут появляться строчки с АТ командами. Если отсутствует связь с модемом, то будет показывать по одной строке. При успешной установке GPRS-соединения на модуле начнет мигать светодиод.

Не так давно друг предложил мне работу, связанную с созданием прошивки для микроконтроллера, который должен был связываться с сервером при помощи GSM-модуля SIM900D . Ранее я с программированием микроконтроллеров дела не имел, да и на C программировал последний раз в студенческие времена, но любопытство перевесило и я принялся за работу. Документация по данной железке присутствует в интернете, однако хороших примеров работы с TCP/IP в коде найти не удалось. Ничего не оставалось, кроме как обложиться документацией, запастись сигаретами и чаем и приступить к лавированию между граблями. А граблей оказалось немало. Собственно, поэтому я и написал эту статью - чтобы другим было легче.

Что было нужно

Требовалось написать код, который мог бы инициализировать GSM-модуль, устанавливать подключение с сервером, получать и отправлять произвольные данные, проверять состояние подключения и работать без сбоев. А также быть достаточно компактным, чтобы уместиться в ограниченной памяти микроконтроллера и оставить место для основной функциональности и еще чуть-чуть про запас.

Что получилось в итоге

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

Код требует функций/макросов для работы с последовательным портом, а также наличия функций memset и memcpy. Так что его с относительной легкостью можно перенести на другую платформу, не зацепив по пути кучу библиотек.

И как оно выглядит?

Программирование и тестирование проводилось под Windows 7. Код, полученный в результате, стал основным материалом для этой статьи. Я не стану приводить код полностью и комментировать его, а вместо этого покажу алгоритм настройки и работы с GSM-модулем.

Функции, которые требуются коду:

  • uint16_t init_serial_port(char *port_name) Эта функция настраивает указанный последовательный порт. Под Windows.
  • uint16_t puts_serial(uint8_t *buffer, uint16_t size) А эта пишет строку байт в этот порт.
  • gets_serial(uint8_t *buffer, uint16_t size) Эта, соответственно, читает строку байт из последовательного порта.
Функции, которые код предоставляет:
  • init_gprs() & stop_gprs() Соответственно инициализируют и вырубают GSM-модуль.
  • uint16_t connect_gprs(uint8_t index, uint8_t mode, char *address, char *port) Устанавливает подключение с сервером. Стоит отметить, что модуль умеет работать с протоколами TCP и UDP как в качестве клиента, так и будучи клиентом. Поддерживается максимум 8 одновременных подключений.
  • uint16_t close_gprs(uint8_t index) Закрывает указанное подключение.
  • uint16_t send_gprs(uint8_t index, uint8_t *buffer, uint16_t size) Отправка сообщения через указанное подключение.
  • uint16_t recv_gprs(uint8_t index, uint8_t *buffer, uint16_t size) Получение сообщения. Неблокирующая функция, что значит она не будет ждать появления данных в потоке, а вернет управление, если получать нечего. Стоит отметить, что такое поведение реализовать проще, чем блокирующее.

Как работать с последовательным портом

Это достаточно просто. Под целевой микроконтроллер есть макросы для отправки/получения данных через USART , но так как отлаживать такой код проще со стационарного компьютера, мне была предоставлена связка из переходника USB<->USART и GSM-модуля. Оставалось только научиться работать с последовательным портом под Windows. Это оказалось просто. Вкратце, последовательный порт представляется в ОС обычным файлом, передача информации осуществляется функциями ReadFile и WriteFile . Нужно только установить кое-какие параметры при помощи функций SetCommTimeouts и SetCommState .

Вот как выглядит функция инициализации порта:
uint16_t init_serial_port(char *port_name) { COMMTIMEOUTS timeouts; DCB parameters; int result; serial_port_handle = CreateFile(port_name, // "\\\\.\\COMx" GENERIC_READ | GENERIC_WRITE, 0, // Значения последующих параметров фиксированы при работе с портом NULL, OPEN_EXISTING, 0, NULL); if (serial_port_handle == INVALID_HANDLE_VALUE) { printf("Error opening a serial port!\n"); return 1; } // Максимальное время между чтением двух байт подряд timeouts.ReadIntervalTimeout = 100; // Следующее значение умножается на количество читаемых из порта символов timeouts.ReadTotalTimeoutMultiplier = 0; // и прибавляется к этому значению, получается максимальное время на выполнение // всей операции timeouts.ReadTotalTimeoutConstant = 1000; // Значение то же, что и у предыдущих двух параметров, однако таймаут считается на запись. timeouts.WriteTotalTimeoutMultiplier = 0; timeouts.WriteTotalTimeoutConstant = 1000; result = SetCommTimeouts(serial_port_handle, &timeouts); if (result == 0) { printf("Error setting timeouts for serial port!\n"); close_serial_port(); return 1; } // В параметры порта занесены самые простые настройки - без контроля // четности, без управления потоком, 1 стоп-бит. memset(¶meters,0,sizeof(parameters)); parameters.DCBlength = sizeof(DCB); GetCommState(serial_port_handle, &parameters); parameters.BaudRate = (DWORD)BAUD_RATE; parameters.ByteSize = 8; parameters.Parity = NOPARITY; parameters.StopBits = ONESTOPBIT; parameters.fAbortOnError = TRUE; parameters.fDtrControl = DTR_CONTROL_DISABLE; parameters.fRtsControl = RTS_CONTROL_DISABLE; parameters.fBinary = TRUE; parameters.fParity = FALSE; parameters.fOutX = FALSE; parameters.fInX = FALSE; parameters.XonChar = (uint8_t)0x00; parameters.XoffChar = (uint8_t)0xff; parameters.fErrorChar = FALSE; parameters.fNull = FALSE; parameters.fOutxCtsFlow = FALSE; parameters.fOutxDsrFlow = FALSE; parameters.XonLim = 128; parameters.XoffLim = 128; result = SetCommState(serial_port_handle, &parameters); if (result == 0) { printf("Error setting serial port parameters!\n"); close_serial_port(); return 1; } return 0; }

Как происходит общение с GSM-модулем

После того, как последовательный порт настроен, в него можно отправлять AT-команды. Первой командой должна быть последовательность "AT\r" , позволяющая модулю автоматически настроить скорость передачи по последовательному порту. Ответ, который можно получить после этого из порта, будет выглядеть как "AT\r\r\nOK\r\n" .

Команда является простой строкой из ASCII-символов. Чтобы команду воспринял модуль, в ее конце нужно поставить символ перевода каретки "\r" . В ответ модуль передаст строку символов, состоящую из двух частей - команды, на которую модуль отвечает и отделенным от нее символами "\r\r\n" ответом, заканчивающимся символами "\r\n" . Чтобы было удобнее разбирать ответы я создал макрос, который устанавливает указатель на начало ответа в принимающем буфере. Если хочется вывести ответ в консоль, нужно добавить нулевой символ в конец принятого сообщения.

Void at_send(char *cmd, uint16_t size) { uint16_t result; cmd = "\r"; result = puts_serial(cmd, size); return; } uint16_t at_recv(uint8_t *buffer, uint16_t size) { uint16_t result; result = gets_serial(buffer, size); return result; }
Примерно так и выглядят вспомогательные функции для отправки команды и получения ответа.

Инициализация модуля

Самая большая функция в коде отвечает за настройку модуля. При инициализации отправляется много AT-команд. Я опишу их в порядке посылки модулю. Специально не расписываю аргументы и варианты ответов подробно, ибо их можно найти в документации.
  • "AT+CPIN=pin-code" Как несложно догадаться, эта команда разблокирует SIM-карту путем ввода пин-кода. Чтобы проверить, требуется ли пин-код, можно использовать команду "AT+CPIN?" .
  • "AT+CREG?" Эта команда возвращает статус регистрации модуля в сети. Нужно выполнять ее, пока модуль не ответит, что в сети он зарегистрирован.
  • "AT+CGATT=1" Заставляет модуль подключиться к GPRS. Проверить, подключен ли он, можно командой "AT+CGATT?" .
  • "AT+CIPRXGET=1" Включает получение данных, переданных через соединение, вручную. По умолчанию этот параметр отключен и данные передаются в последовательный порт сразу после получения. Это не слишком удобно, хотя и не критично - можно настроить модуль так, чтобы вместе с данными он передавал и заголовки IP, по которым можно определить, от кого был получен пакет. Я решил, что вручную данные получать проще и не ошибся. Как я понял, данная команда воспринимается только GSM-модулями SIM.COM.
  • "AT+CIPMUX=1" По умолчанию модуль может устанавливать только одно подключение. Этот параметр включает возможность создавать несколько подключений. Отправка и прием данных будут отличаться только на один параметр - индекс подключения.
  • "AT+CSTT="internet"" APN - Access Point Name, имя точки доступа для GPRS. Для моего провайдера выглядит именно так.
  • "AT+CIICR" Устанавливает беспроводное подключение GPRS. Может занять некоторое время, так что ее нужно выполнять в цикле и проверять ответ.
  • "AT+CIFSR" Возвращает IP-адрес модуля. Я использую ее чтобы проверить, подключен ли модуль к интернету.
  • "AT+CDNSCFG="8.8.8.8","8.8.4.4"" Этой командой устанавливаются сервера DNS, которые будет использовать модуль.
  • "AT+CIPSTATUS" Помимо данных о состоянии подключений эта команда дает информацию о том, готов ли модуль к установке соединений. Так что нужно проверить ее ответ.
После выполнения этих команд модуль будет готов к работе. Ну или не будет. Тут уж как повезет.

Установка и разрыв подключений

Создание подключения производится командой "AT+CIPSTART=index,"mode","address","port"" .
  • index указывает порядковый номер подключения, может принимать значения от 0 до 7.
  • mode определяет протокол, который будет использоваться соединением. Может быть «TCP» или «UDP».
  • address задает адрес сервера. Если при настройке были указаны DNS-сервера, то можно использовать как IP-адрес, так и доменное имя.
  • port задает порт сервера, с которым будет устанавливаться соединение.
Замечу, что при использовании протокола UDP по умолчанию датаграммы будут отсылаться и приниматься только с одного адреса. Для того, чтобы использовать UDP на полную катушку и отсылать/принимать данные с любых адресов, можно использовать так называемый расширенный режим UDP, настраиваемый командой "AT+CIPUDPMODE" . За подробностями отсылаю к документации.

В ответ на команду можно получить несколько вариантов ответов. Если все хорошо, то после стандартного "OK" через небольшой промежуток времени можно получить один из трех ответов:

  • "index,ALREADY CONNECT" это значит, что подключение с заданным индексом уже установлено и стоит его поискать.
  • "index,CONNECT OK" тут все очевидно.
  • "index,CONNECT FAIL" означает, что возникли проблемы с установкой соединения.
Разорвать соединение можно командой "AT+CIPCLOSE=index" . Разорвать все соединения и деактивировать интерфейс GPRS можно командой "AT+CIPSHUT" .

Передача данных

Данные передаются командой "AT+CIPSEND=index,length" , где index указывает подключение, по которому нужно передать данные, а length задает длину пакета данных. Кстати, узнать MTU для каждого подключения можно при помощи команды "AT+CIPSEND=?" .

Если все хорошо, то модуль в ответ на команду выдаст приглашение ">" , после которого нужно переслать в последовательный порт данные. Как только модуль получит количество байт, равное length , он скажет что-то типа "index,SEND OK" . Вообще, можно не использовать параметр length , однако в таком случае окончание пакета данных должно быть указано явно при помощи символа 0x1A , в терминале сочетание Ctrl+Z. Для передачи произвольных данных такой вариант, очевидно, не подходит.

Как видите, передача данных - процесс не слишком сложный. Поэтому переходим к самому интересному - приему данных.

Прием данных

Как только GSM-модуль принимает данные, он сигнализирует об этом, посылая в последовательный порт строку вида "+CIPRXGET:1,index\r\n" . Я честно не знаю, что означает единица, ибо данная функция модуля документирована достаточно слабо, но у меня она фигурирует во всех сообщениях о приеме пакета.

Мне не доставляла радости мысль о том, что придется тем или иным образом отслеживать сообщения модуля. Однако, немного поигравшись с дебаггером, я выяснил, что никаких других асинхронных сообщений модуль не посылает, а также то, что после выполнения любой AT-команды это сообщение оказывается в начале буфера. Так как я составил макрос для отделения ответа от команды путем поиска подстроки "\r\r\n" , меня это никоим образом не задевало. Так что функция приема данных была реализована достаточно просто.

Так вот, принимать данные можно командой "AT+CIPRXGET=2,index,length" . Двойка означает режим приема, в данном случае байты просто высыпаются в последовательный порт. Можно также задать получение данных в виде HEX-текста, видимо, ради предотвращения конфликтов с программным управлением потоком . Мне это не потребовалось, ибо управление потоком я вообще не использую. Параметр length задает размер пакета данных, который мы желаем получить за один раз.

В ответ мы получим нечто вида "+CIPRXGET:2,index,received,excess\r\n__DATA__\r\nOK\r\n" . В поле received будет находиться количество байт, находящихся в пакете данных __DATA__ , а поле excess будет содержать количество байт, ожидающих своей очереди в буфере модуля. Так что если поле received равно нулю, можно с чистой совестью заявлять, что получать нечего. Собственно, пользуясь этим, я и реализовал неблокирующую функцию для приема данных.

В заключение

Настоятельно рекомендую перед написанием кода освоиться в AT-командах при помощи PuTTY , который прекрасно работает с последовательным портом.

Надеюсь, информация из этой статьи поможет кому-нибудь написать код для своего SIM900. Вполне возможно, что принципы работы с GSM-модулем, изложенные выше, можно применить и к модулям других моделей, а, возможно, и производителей.

Теги:

  • микроконтроллеры
  • программирование
  • gsm
  • gprs
Добавить метки

Опыт использования SIM900, описанный ниже будет более полезен тем, кто уже успел немного поработать с модулем. Для тех же читателей, кто только начинает изучение данной микросхемы и планирует использовать её для обмена данными через интернет мы подготовили серию уроков на эту тему. Вот .

Итак, SIM900 – GSM-модуль компании SIM COM, управляется AT-командами, умеет посылать SMS, совершать звонки, организовывать прямое CSD-соединение, обмениваться информацией по GPRS.

В моих руках оказалась заказанная из Китая отладочная плата SIM900 GPRS shield – совместимая с платформой Arduino.

На плате находится сам чип SIM900, разъёмы для микрофона и наушников, переключатель источника питания (от внешнего разъёма или от Arduino), антенна, несколько светодиодов для индикации режимов работы, разъём для батарейки (если нужны часы реального времени), кнопка включения/выключения. Хорошее описание я нашёл на wiki производителя . Там же приведён код для управления модемом в различных режимах.

Как заявляет нам производитель плата отлично совместима с Arduino Uno. Действительно, плата SIM900 просто втыкается в Uno и сразу же начинает работать. Однако, как выяснилось, Arduino Uno может оказаться «слабоватой» для реализации некоторых функций, но об этом я расскажу чуть ниже.

С Arduino Mega плата работает с некоторыми ограничениями. Это связано с тем, что у Меги в отличие от Uno пины 7 и 8, недоступны для использования в качестве software serial (программный USART). Это решается переключением интерфейса USART на ноги 0 и 1, для этого на плате SIM900 предусмотрены джамперы.

Вообще, плату можно подключить к любому контроллеру с интерфейсом USART. Например, пробовал управлять модемом с помощью контроллера STM32F4.

SIM900: SMS-сообщения и звонки

Испытания модуля для обмена SMS-сообщениями и звонков прошли «на УРА»! Модуль справился с этими задачами без особых проблем, для этого я просто скопировал c того же сайта , скомпилировал и прошил в Arduino Uno вот этот код:

//Serial Relay - Arduino will patch a //serial link between the computer and the GPRS Shield //at 19200 bps 8-N-1 //Computer is connected to Hardware UART //GPRS Shield is connected to the Software UART #include SoftwareSerial GPRS(7, 8); unsigned char buffer; // buffer array for data recieve over serial port int count=0; // counter for buffer array void setup() { GPRS.begin(19200); // the GPRS baud rate Serial.begin(19200); // the Serial port of Arduino baud rate. } void loop() { if (GPRS.available()) // if date is comming from softwareserial port ==> data is comming from gprs shield { while(GPRS.available()) // reading data into char array { buffer=GPRS.read(); // writing data into array if(count == 64)break; } Serial.write(buffer,count); // if no data transmission ends, write buffer to hardware serial port clearBufferArray(); // call clearBufferArray function to clear the storaged data from the array count = 0; // set counter of while loop to zero } if (Serial.available()) // if data is available on hardwareserial port ==> data is comming from PC or notebook GPRS.write(Serial.read()); // write it to the GPRS shield } void clearBufferArray() // function to clear buffer array { for (int i=0; i

Для того, чтобы посылать модулю команды, его нужно подключить к компьютеру. Это можно сделать, используя USB порт Arduino. На компьютере для этого нужен любой монитор COM-порта. Его можно скачать отсюда , а можно использовать монитор, встроенный в Arduino IDE.

Всё, что делает прошитая программа Arduino, — «ловит» команды пользователя и посылает их модулю, а затем возвращает пользователю ответы SIM900. Таким образом, передавая модулю AT-команды в ручном режиме, я опробовал приём и передачу SMS-сообщений, а подключив в соответствующие разъёмы микрофон и наушники — воспользовался модулем SIM900 в качестве мобильного телефона.

Передача данных по GPRS с помощью SIM900

Свои первые опыты по передаче данных через GPRS я начал, используя для управления SIM900 платформу Arduino UNO (просто потому, что она была под рукой). Для начала купил хостинг с сервером под Apatche и развернул на нём простейшее приложение, которое умело отвечать на GET-запросы. Получилось! Я все так же посылал команды с ПК контроллеру Arduino, который в свою очередь пересылал их SIM900.

Всё работало корректно до тех пор, пока GET-запросы были достаточно короткими (до 100 символов). Но как только запросы стали длиннее — начались сбои: запросы передавались не полностью. Было замечено, что глюки могут появиться или исчезнуть даже при увеличении/уменьшении управляющей программы Arduino на несколько строк. Впоследствии выяснилось, что сбои связаны с программным USARTом, которой Arduino UNO использует для общения с SIM900, т.к. такой USART целиком и полностью зависит от программного цикла ядра контроллера. При малом количестве данных, они успевают передаваться всегда, а при увеличении их количества — результат передачи зависит от длительности программного цикла.

Вывод из всего вышесказанного: использовать программный USART при общении с SIM900 НЕЛЬЗЯ , особенно когда речь идёт о большом количестве передаваемых данных.

У Arduino Uno всего один «железный» интерфейс USART, который был занят под обмен с ПК, поэтому пришлось отказаться от UNO, заменив её на Arduino Mega, которая не страдает недостатком «железных» USARTов. После такой «рокировки» работа устройства стала стабильной и корректной.

SIM900: TCP-IP стек или HTTP? Что лучше?

Изучая руководство по управлению модемом, я обнаружил что существует две группы AT-команд. Первая группа используется для передачи данных через встроенный TCP-IP стек, а вторая использует HTTP протокол уже реализованный внутренней логикой SIM900. Сколько я ни мучал Google и Яндекс пытаясь узнать, чем же отличаются данные способы, каковы плюсы и минусы каждого из них, — ничего не нашёл, поэтому попробовал оба и делюсь своим практическим опытом тут.

Оба способа рабочие и имеют право на существование.

TCP-IP стек немного сложнее инициализируется (больше команд нужно передать модулю), им немного сложнее управлять. Для того, чтобы передать запрос, необходимо открыть соединение, дождаться ответа и корректно закрыть его.

HTTP — это, говоря простыми словами, браузер встроенный в SIM900. Он прост в инициализации, для того чтобы начать обмен с сервером необходимо открыть сеанс. При этом открытие и закрытие соединения при каждом запросе и решение других «организационных задач» ложиться на плечи SIM900. Это удобно, к тому же передача данных таким способом происходит несколько быстрее, как раз из-за того, что у SIM900 быстрее получается выполнять все «вспомогательные операции», чем это может делать управляющий контроллер.

Таким образом, при выборе способа обмена я все-таки остановился на протоколе HTTP.

Некорректный GET-запрос на сервер

В самом начале своей работы по передаче данных по GPRS я допустил ошибку, которая стоила мне не одного дня мучений. Не имея достаточного опыта работы по взаимодействию с сервером посредством GET-запросов, я, набравшись поверхностных знаний в интернете, составил запрос вида:

GET http://xxx.ru/d_command.php?UC=1111 HTTP/1.1
HOST: xxx.ru

Этот запрос не является корректным, однако его отлично «кушал» браузер и прокси сервер, с которого я отправлял запросы для отладки — именно поэтому я считал запрос верным.

Самое удивительное то, что SIM900 тоже отлично справлялся с «плохим» запросом (а отправлял запросы я тогда через TCP-IP стек). Однако, в один прекрасный день сервер начал отвечать на такие запросы ошибкой 404. Произошло это по так и не выясненным обстоятельствам, то ли хостинг-провайдер поменял алгоритмы обработки запроса (он открещивается от этого), то ли это сделал мобильный оператор. Но факт остаётся фактом. Тогда же я попробовал передать тот же запрос через HTTP — всё работало. Объясняется это тем, что внутренний HTTP протокол модуля SIM900 (как я уже говорил, по-сути встроенный браузер) умеет сам правильно «распарсивать» некорректные запросы и транслировать в сеть уже в правильном виде. Это еще один плюс (сомнительный, конечно же) использования HTTP, поскольку позволяет программисту некоторые неточности. А вообще, конечно, запрос должен быть написан правильно и выглядеть вот так:

GET /d_command.php?UC=1111 HTTP/1.1
HOST: xxx.ru

С таким корректным запросом SIM900 успешно обменивается и через TCP-IP стек, и через HTTP.

Зависание SIM900

Иногда при обмене по GPRS возникают ситуации, после которых модуль может зависнуть. Этому виной могут быть некорректные данные, пришедшие по сети и загнавшие в ступор SIM900, или помехи на линии обмена модуля и контроллера, при которых SIM900 получил «не то, что ждал», или ещё какие-то неведомые проблемы. Производитель чипа предупреждает о том, что это может происходить и предлагает в таких случаях перезагружать модуль с помощью специальной последовательности импульсов, подаваемых на вход PWRKEY.

Однако, как выяснилось, это не всегда помогает — после такой перезагрузки модуль может «проснуться» всё ещё «глюкнутым». И об этом тоже нас предупреждает производитель, если внимательно читать DataSheet на модуль. Вот что рекомендуется в документации:

NOTE: It is recommended to cut off the VBAT power supply directly instead of using external reset pin when SIM900 can not respond to the AT command “AT+CPOWD=1” and PWRKEY pin.

Поэтому самым правильным способом перезагрузки модуля является полное снятие с него питания (с ножки VBAT), выдержка некоторой паузы (хотя бы секунду на всякий случай) и повторная подача питания. Для перезагрузки модуля на плате лучше предусмотреть реле или транзисторный ключ, управляемый контроллером.

Заключение

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

До свидания! Следите за обновлениями на LAZY SMART .



Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: