Для разработки IoT устройств приходится использовать различные GSM модули. К сожалению, NB IoT или LoraWAN чипы на данный момент стоят минимум в три раза дороже, поэтому в большинстве проектов их использование неоправданно, пока не снизится стоимость.

Модуль хорошо документирован. Документация здесь. Сайт кривой. Скачать документацию официально не просто. 🙁 Поэтому используем прямую ссылку, не требующую регистрации, на всю необходимую документацию и прошивки для SIM800C. Прямая ссылка на документацию и инструменты прошивки для SIM800x. Документация по схемотехнике.

На Aliexpress есть несколько вариантов модулей SIM800C. Ссылка здесь. В данном примере я рассмотрю вариант с разведенным на плате конвертером уровней TTL 5V

В принципе, можно использовать более дешевый вариант модуля SIM800L, адаптировав уровень TTL под 5V Arduino с помощью резисторного делителя напряжения, либо заказав плату двунаправленного TTL конвертера уровней 5V 3V ценой в районе 0,5 $ и добавив DC-DC down-step модуль для снижения напряжения с 5V до 3,7 V по цене 0,3 $ но в совокупности цена получится примерно такой-же, экономии не будет.

Однако надо понимать, что при добавлении двунаправленного TTL конвертера уровней на него надо подать опорное напряжение равное уровню допустимого напряжения на входе SIM800, а это

2,9 V, а не 3,3 V, которых взять негде, поскольку выход VDD_EXT с чипа SIM800 не выведен.

Батарею можно напрямую подключить к пину Vbat. На этом входе можно замерять напряжение на чипе. Оно составляет 3,7 V, встроенный преобразователь напряжения работает нормально, хоть и схема проще, чем у самого дешевого DC-DC step down конвертера.

Схема платы SIM800C

В datasheet модуля указан максимальный уровень логической единицы на входе RX — 3,1 В (при минимальном 2,1 В). Для конвертации TTL уровней на плате SIM800C разведен конвертер. В принипе достаточно было конвертер поставить только на RX вход, поскольку микроконтроллеры Arduino/ESP8266/ESP32 чувствительны к низкому входному напряжению TTL с SIM800C.

Схема двунаправленного конвертера уровней довольно стандартная и обеспечивает приведение напряжения логической 1 на SIM800 к уровню VDD_EXT. Это напряжение снимается с SIM800 и по datasheet соотвествует 2,8 V.

Напряжение на выходе VDD_EXT чипа SIM800

Соотвественно, на входе модуля SIM800 преобразователь уровней обеспечивает напряжение логической 1 не выше 2,9 V при максимальном значении.

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

Резистивный делитель при подключении входов SIM800 напрямую к Arduino

Вероятно, в данном случае использовали более дорогую схему согласования уровней, чтобы гарантировать, что пользователь неосторожными действиями не сожжет RX порт чипа SIM800. В случае резистивного делителя это можно сделать попутав Rx и Tx. Ну и важно для полноценного согласования уровней SIM800 с микроконтроллером 5-ти вольтовой логики, когда уровень логический единицы может быть высоким, так что микроконтроллер не будет воспринимать уровень логической единицы на выходе Tx.

Замечу, что при использовании дешевого модуля SIM800C/L без конвертера уровней, даже при подключении его напрямую к ESP8266/ESP32 с уровнем логики 3,3 V вместо максимальных 3,1 V, указанных в datasheet, можно вывести SIM800 из строя. По крайней мере у меня один модуль SIM800L перестал реагировать на RX. Видимо, внутри чипа нет защитных диодов, либо они не справились даже с такой небольшой разницей в напряжении.

Поэтому при подключении модуля SIM800 без конвертера уровней к ESP8266/ESP32 тоже нужно добавить хотя-бы резистивный делитель на вход RXD.

Напряжение питания модуля SIM800 (VBAT) 3,4 — 4,5 V, рекомендуемое 4 V при максимальном токе до 2А. Модуль достаточно прожорлив, поэтому его нельзя запитывать от платы Arduino и от маломощных USB зарядок, дажы не вывести их из строя.

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

Слот SIM карты, в отличие от недорогого модуля SIM800L, подключен к чипу с защитой диодной сборкой SMF05C. Она предохраняет чип SIM-карты и SIM800C от статического электричества.

Недостатки платы SIM800C

Не могу сказать, что модуль SIM800C разработан удачно. Замечания такие:

  • Расстояние между гребенками не кратно 2,54 мм, поэтому модуль не встает в breadboard макетные платы. Этой проблемы нет даже у дешевой платы SIM800L. Она встает в макетную плату без проблем. Это очень большой косяк разработчиков.
  • Для понижения напряжения с 5V до 3,7V используется схема с двумя диодами. Как говорится в статье, падение напряжения на диодах в обычном режиме работы порядка 0,6 — 1,2V и SIM800 достаточно напряжения для работы. Однако при пиковых значениях токов падение напряжения возрастает и на чипе напряжение может быть ниже 3,3 V. В результате, например, при запуске, когда энергопотребление высокое, модуль может многократно перегружаться. Поэтому я рекомендую запитывать модуль через вход VBAT подав напряжение 3,8 V c DC-DC конвертера напряжения (DC-DC stepdown converter) или от батареи.

Распиновка платы модуля SIM800C

  • 5V: power supply pin, the only input DC5V, used to power the board.
  • V_TTL: access control board microcontroller core target voltage of 5V / 3.3V (according to its own microcontroller is much to distinguish kernel V), this pin is used to convert the GSM module board TXD and RXD for the corresponding TTL logic. Описание пространное. На этот пин нужно подать 5V при подключении к платам с уровнем логики 5V (например, Arduino) и 3,3V при подключении GSM модуля к ESP8266/ESP32.
  • GND: power supply ground
  • TXD: send pin serial port module, TTL level (not directly connected to RS232 level)
  • RXD : receive pin serial port module, TTL level (not directly connected to RS232 level)
  • DTR: Data Terminal Ready
  • SPKP: Core Audio output pin
  • SPKN: Core Audio output pin
  • MICN: Core Audio input
  • MICP: Core Audio input
  • RI: Ring core pin tips
  • VRTC: RTC pin external battery
  • GND: power supply ground
  • PWR: This pin can turn down or turn off the module. Этот пин должен быть замкнут на GND на время не менее 1 с для включения модуля. Чтобы модуль стартовал сразу при включении — PWR закорачивают на GND.
  • GND: power supply ground
  • VBAT: lithium battery input pin, 3.3v-4.4v

Схема соединения SIM800C c USB-to-TTL конвертером

Перед использованием модуля SIM800C с микроконтроллерами стоит проверить его работоспособность соединив с конвертером USB to TTL.

Таблица соединения SIM800C с USB-to-TTL converter

SIM800C pin USB-to-TTL converter БП +5 V Примечания
TXD RXD
RXD TXD
GND GND GND
+5V +5V Блок питания на пиковы ток не менее 1 А.
V_TTL +5V
PWX GND Закоротить пин PWX на GND, чтобы модуль стартовал сразу при включении питания.

Лучше подавать сначала питание на модуль GSM, а затем уже подключать USB к PC, но это не критично.

Схема соединения SIM800С с ESP32

На картинке нужно добавить соединение между PWX и GND! Детальная схема подключения SIM800L к ESP32 с примером кода в статье.

Схема подключения модуля SIM800C к ESP32

Тестирование SIM800

  • Запускаем Arduino IDE.
  • В настройках порта (Tools -> Port) выбираем порт на котором работает USB-to-TTL конвертер.
  • Переходим в Tools -> Serial Monitor (Ctrl-Shift-M).
  • Выбираем скорость 115200. Где-то проскакивает, что у чипа работает автоопределение скорости. По моим тестам — не работает. 🙂
  • Набираем AT и ввод. Документация по AT коммандам SIM800 здесь.
  • Если модуль рабочий и корректно подключен, то появится хотя-бы ответ «OK». Если модуль определил SIM-ку и зарегистрировался в сети оператора, то будет развернутая информация.
  • Отправляем команду: AT+COPS=?
    После нескольких секунд ожидания появится ответ, вроде: +COPS: (2,»Bee Line GSM»,»BeeLine»,»25099″),(1,»MTS»,»MTS»,»25001″),(1,»MOTIV»,»MOTIV»,»25020″),(1,»MegaFon»,»MegaFon»,»25002″),,(0-4),(0-2). Модуль «видит» ближайшие соты. Уже хорошо.
  • Проверим статус PIN кода на SIM карте командой:
    AT+CPIN? Если появился ERROR — что-то не так.
  • Запускаем команду: AT+CMEE=2. Эта команда при выводе сообщения об ошибке предоставляет максимально детальную информацию. Сохраняем командой: AT&W.
  • Поворяем комунду AT+CPIN? Появляется детальный код ошибки. Например, в моем случае: +CME ERROR: SIM not inserted.
  • Проверяем установку SIM карты. SIM слот распаянный на модуле «без защиты от дурака», т.е. позволяет вставить SIM-ку любым способом, без привычных ограничений как на сотовом телефоне или в других типах слотов. На SIM слоте мелко есть пиктограмма правильной установки карты.
  • Повторяем команду AT+COPS=? Ответ изменился. Появились строчки «Call Ready» и «SMS Ready», значит карта определилась нормально и зарегистрировалась в сети оператора:
  • Отправляем команду AT+CSQ для получения уровня сигнала. Первая цифра в ответе должна быть отлична от нуля. Например, +CSQ: 23,0.
  • Проверяем регистрацию в сети оператора командой AT+CREG? Правильный ответ: +CREG: 0,1
Читайте также:  Оформление клумбы бордюрной лентой

Ошибка +CSQ: 0,0

Если команда получения уровня сигнала AT+CSQ возвращает +CSQ: 0,0, то наверняка будут проблемы с регистрацией в сети. Команда AT+CREG? вернет +CREG: 0,2 вместо +CREG: 0,1. Какие действия для разрешения ошибки:

  • Проверяем в другом устройстве, что SIM-ка корректно регистрируется в сети.
  • Вставляем в SIM800 в соответствии с пиктограммой на слоте и проверяем командой AT+CPIN, что SIM карта определилась корректно.
  • Командой AT+CBAND? проверяем, что SIM800 настроен на все диапазоны частот. На моем модуле, когда он нормально регистрируется в сети Билайна, результат: DCS_MODE,ALL_BANDS.
  • Основной момент на который обратить внимание. Не зависимо от того, какой ток держит блок питания или DC-DC step-down модуль, хоть 3A и вы в этом лично убеждались, попробуйте запустить SIM800 от батареи. Возьмите аккумулятор от мобильного телефона на 3,7 В или Li-Ion элемент 18650 на 3,7 V и присоедините плюс батареи к пину V_BAT , а минус — на GND.
  • Спустя некорое время проверяем уровень сигнала AT+CSQ. Скорее всего проблема с регистрацией разрешится.

Все GSM модули, не важно, дорогой SIM800 или дешевый M590 КРАЙНЕ чувствительны к качеству блока питания. И дело не только в токе, но и в пульсациях. Я запитывал SIM800C от разных БП с макисмальными токами до 2,1 A и он нормально включался, отвечал на AT команды, но не регистрировался в сети. После подключения на батарею TR 18650 сеть сразу нашлась.

Ниже приведены вырезки из design guide для модулей SIM800 и M590. Они почти сходятся в блоке фильтрации. Нужно ставить керамические конденсаторы на 10 pF и 33 pF (у M590 на 100 pF) для сглаживания высокочастотных пульсаций и электролитические хотя-бы на 100 uF, а лучше на 1000 uF.

Фильтры на блок питания для SIM800 Фильтры на блок питания для Neoway M590

Отправка SMS через SIM800

Для теста работы пытаемся отправить SMS. Для начала отправляем команду: AT+CMGF=1. Если возник ERROR — скорее всего не прошла регистрация SIM-ки в сети.

AT команда Ответ Примечания
AT+CMGF=1 OK Переводим в текстовый режим отправки сообщений.
AT+CSCS=»GSM» OK Устаналиваем charset:
«GSM» GSM 7 bit default alphabet (3GPP TS 23.038);
«UCS2» 16-bit universal multiple-octet coded character set (ISO/IEC10646); UCS2 character strings are converted to hexadecimal numbers from 0000 to FFFF; e.g. «004100620063» equals three 16-bit characters with decimal values 65, 98 and 99
«IRA» International reference alphabet (ITU-T T.50)
«HEX» Character strings consist only of hexadecimal bers from 00 to FF;
«PCCP» PC character set Code «PCDN» PC Danish/Norwegian character set «8859-1» ISO 8859 Latin 1 character set
AT+CSCS? +CSCS: «GSM» Проверяем, что нужная кодовая таблица установилась корректно.
AT+CMGS=»+796019xxxxx» > Номер телефона вводить обязательно с +, иначе будет сообщение об ошибке: +CMS ERROR: invalid input value.
После запуска команды появится запрос на ввод текста сообщения, которое должно быть завершено отправкой CTRL-z (0x1A или (char)26). К сожалению, Arduino Serial Monitor не позволяет отправить этот код, так что только программно.

Передача данных по TCP

Далее привожу AT команды для установки tcp соединения через GPRS.

AT команда Ответ Примечания
AT+CPIN? +CPIN: READY
OK
Проверка SIM PIN
AT+CSQ +CSQ: 23,0
OK
Проверка уровня сигнала. Первая цифра — уровень сигнала :
0 — 115 dBm or less
1 -111 dBm
2…30 -110… -54 dBm
31 -52 dBm or greater
99 — not known or not detectable
Вторая цифра — количество ошибок в канале. 0 — хорошо.
AT+CREG? +CREG: 0,1
OK
Первая цифра :
0 — Disable network registration unsolicited result code
1 — Enable network registration unsolicited result code +CREG:
2 — Enable network registration unsolicited result code with location information
Вторая цифра :
0 — Not registered, MT is not currently searching a new operator to register to
1 — Registered, home network — правильный вариант
2 — Not registered, but MT is currently searching a new operator to register to
3 — Registration denied
4 — Unknown
5 — Registered, roaming
AT+CGATT? +CGATT: 1
OK
Статус GPRS Service-а :
0 — Detached
1 — Attached — правильный вариант
AT+CIPSHUT SHUT OK Deactivate GPRS PDP Context. В доке разработчик эта команда не указана, но без неё у меня не проходила команда установки APN.
AT+CSTT=
«internet.beeline.ru»,»beeline»,»beeline»
OK Устанавливаем APN. В примере — для оператора «Билайн».
AT+CSTT? +CSTT:
«internet.beeline.ru»,»beeline»,»beeline»
Проверяем, что APN сохранился.
AT+CIICR OK Переводим в режим беспроводного соединения (GPRS or CSD).
AT+CIFSR 100.89.139.161 Получаем выделенный оператором динамический IP адрес.
AT+CIPSTART=
«TCP»,»116.228.221.51″,»8500″
OK Установка тестового TCP соединения с каким-то китайским тестовым сервером.

Отправка данных по HTTP

AT+SAPBR=3,1,»CONTYPE»,»GPRS»
AT+SAPBR=3,1,»APN»,»internet.beeline.ru»
AT+SAPBR=3,1,»USER»,»beeline»
AT+SAPBR=3,1,»PWD»,»beeline»
AT+SAPBR=1,1 — Устанавливаем GPRS соединение
AT+HTTPINIT — Инициализация http сервиса
AT+HTTPPARA=»CID»,1 — Установка CID параметра для http сессии
AT+HTTPPARA=»URL»,»http://www.ya.ru» — адрес web сервера
AT+HTTPACTION=0 — GET запрос.
-> +HTTPACTION: 0,302,0 — 302 код ошибки — Found.

Fritzing part for SIM800C

Поскольку не нашел нужного fritzing part для SIM800C, пришлось нарисовать. Файл здесь.

В предыдущей статье мы говорили о модуле SIM800l. В этой статье я хотел бы рассказать об управлении этим модулем. Как было сказано ранее — модуль управляется через UART интерфейс посредством AT команд. Конечно, все AT команды я перечислять не буду — для этого существует даташит, в котором все они подробно расписаны. Даташит вы можете скачать в конце статьи. Остановимся на самых распространенных и необходимых AT командах управления модулем SIM800l. Но прежде, я вкратце расскажу о том как подключить модуль. Итак, с питанием понятно — напряжение 4В и ток не менее 2А. Также понадобится переходник USB-UART, например такой. Подключаем переходник в свободный USB порт компьютера устанавливаем драйвера, далее подключаем RX вывод переходника к TX выводу модуля, а TX вывод модуля к RX выводу переходника. Вот и все. Запускаем любую терминальную программу (Hyper Terminal или PuTTy), и вносим настройки. Собственно по настройкам:

  1. Номер COM порта (смотрим в диспетчере устройств),
  2. Скорость соединения — 9600 (Хотя изначально модуль настроен на автоопределение).
  3. Четность — (8-N-1 4)
  4. Управление потоком — нет.

После подключения шлем модулю первую команду — AT и жмем Ентер. Если все правильно модуль должен ответить — OK. Теперь несколько команд для принудительной настройки UART порта модуля:

AT+IPR=115200 — эта команда настраивает скорость порта на 115200. Можно поставить любое значение: 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200. Если поставить 0, то это означает автоопределение скорости (настройка по умолчанию). На команду модуль отвечает OK, или ERROR — если что-то не так. Чтобы узнать текущую установленную скорость даем команду AT+IPR?

AT+ICF=3,3 — эта команда служит для установки четности порта модуля. Имеет два параметра. Первый — отвечает за кол-во бит в посылке/четность/стопбит. Вот все варианты: 1 – 8/0/2, 2 – 8/1/1, 3 – 8/0/1, 4 – 7/0/2, 5 – 7/1/1, 6 – 7/0/1. Второй параметр — четность. Варианты: 0 – нечётный, 1 – чётный, 3 – нет. Т.е. команда AT+ICF=3,3 означает 8/0/1 (8 бит посылка, четность нет, стоп бит — 1). Для проверки текущей четности вводим AT+ICF?.

Далее команды о состоянии модуля. Думаю принцип понятен и их я приведу уже в виде таблиц для удобства.

Читайте также:  Leben пылесос вертикальный проводной циклонного типа
Команда Ответ Описание
AT+GCAP +GCAP:+FCLASS,+CGSM
OK
Возможности модуля
AT+GMM SIMCOM_SIM900
OK
Идентификатор модуля
AT+GMR Revision:1137B09SIM900M64_ST
OK
Ревизия
AT+GSN 01322600XXXXXXX
OK
IMEI
AT+COPS? +COPS: 0,0,»MTS-RUS»
OK
Информация об операторе
AT+COPS=? +COPS: (2,»MTS RUS»,»»,»25001″),(1,»MOTIV»,»MOTIV»,»25035″),(1,»Utel»,»Utel»,»25039″),,(0,1,4),(0,1,2)
OK
Доступные операторы
AT+CPAS +CPAS: 0
OK
Информация о состояние модуля
0 – готов к работе
2 – неизвестно
3 – входящий звонок
4 – голосовое соединение
AT+CREG? +CREG: 0,1
OK
Тип регистрации сети
Первый параметр:
0 – нет кода регистрации сети
1 – есть код регистрации сети
2 – есть код регистрации сети + доп параметры
Второй параметр:
0 – не зарегистрирован, поиска сети нет
1 – зарегистрирован, домашняя сеть
2 – не зарегистрирован, идёт поиск новой сети
3 – регистрация отклонена
4 – неизвестно
5 – роуминг
AT+CSQ +CSQ: 17,0
OK
Уровень сигнала:
0 -115 дБл и меньше
1 -112 дБл
2-30 -110..-54 дБл
31 -52 дБл и сильнее
99 – нет сигнала.
AT+CCLK? +CCLK: «00/01/01,04:21:27+00»
OK
Текущая дата и время телефона.
AT+CBC +CBC: 0,95,4134
OK
Монитор напряжения питания модуля
Первый параметр:
0 – не заряжается
1 – заряжается
2 – зарядка окончена
Второй параметр:
1-100 % — уровень заряда батареи
Третий параметр:
Напряжение питание модуля (VBAT), мВ
AT+CADC? +CADC: 1,7
OK
Значение АЦП (до 2,8В)

Команды настроек вызовов

Команда Ответ Описание
AT+CLIP=1 OK АОН
1 – вкл / 0 – выкл
AT+GSMBUSY=0 OK Запрет входящих звонков
0 – разрешены
1 – запрещены
ATS0=0 OK Автоответ
0 – ручной
1-более – автомотический после заданного количества звонков

Команды настроек СМС

Команда Ответ Описание
AT+CMGF=1 OK Текстовый режим
1 – включить
0 – выключить
см. примечание
AT+CSCS= «GSM» OK Кодировка текстового режима
Доступны следующие кодировки:
IRA, GSM, UCS2, HEX, PCCP, PCDN, 8859-1
см. примечание
AT+CSCB=0 OK Приём специальных сообщений
0 – разрешен (по умолчанию)
1 – запрещен

Прочие команды настроек модуля

Команда Ответ Описание
ATE0 OK ЭХО
1 – вкл (по умолчанию) / 0 – выкл
ATV1 OK Формат ответа модуля
0 – только ответ
1 – полный ответ с ЭХО (по умолчанию)
AT+CMEE=0 OK Информация об ошибках
0 – отключён (по умолчанию)
1 – код ошибки
2 – описание ошибки
AT+CCLK=»13/09/25,13:25:33+05″ OK Установка часов
«yy/mm/dd,hh:mm:ss+zz»
Где:
год/месяц/дата,
часы:минуты:секунды
+часовой пояс
AT+CPIN=XXXX Ввод PIN кода
ATZ0 Сброс настроек до значений по умолчанию (не до заводских)
0 или 1 – выбор профиля
AT&F Сброс настроек до заводских
AT&W OK Сохранение настроек для текущего профиля
Параметр 0 или 1 — выбор профиля
Параметр указывать сразу за командой (AT&W0)
AT+CPOWD=1 NORMAL POWER DOWN Выключение модуля
0 – срочное
1 – нормальное
AT+CFUN=1,1 Энергосберегающий режим и перезагрузка
Первый параметр:
0 – минимальный функционал
1 – нормальный режим (по умолчанию)
2 – выключения цепей приёма и передачи сигнала
Второй параметр:
0 – выполнить без перезагрузки
1 – перезагрузить (доступно только в нормальном режиме, т.е. параметры = 1,1)

Команды для осуществления телефонных звонков

Команда Ответ Описание
ATD+380XXXXXXXX; OK Позвонить на номер +380XXXXXXXX;
NO DIALTONE
BUSY
NO CARRIER
NO ANSWER
Нет сигнала
Если вызов отклонён
Повесили трубку
Нет ответа
ATDL OK Позвонить по последнему исходящему номеру
ATA OK Ответить на звонок
ATH0 OK Повесить трубку/ разорвать соединение
RING Входящий звонок
AT+CLIP=1 OK см. настройки
RING

+CLIP: «+380XXXXXXXX»,145,»»,,»»,0

Входящий звонок с включенным АОН
Где:
Первый параметр – номер телефона входящего звонка
2 – тип входящего номера
129 – не определен
161 – национальный
145 – интернациональный
177 – сетевой, специальный

Команды для отправки СМС сообщений

Команда Ответ Описание
AT+CMGS=

«+380XXXXXXXX»
>Test sms.elschemo.ru

>
+CMGS: 15
OK Отправка СМС.
Указываем номер получателя в кавычках и отправляем модулю с символом переноса строки (13 в ASCII).
После приглашения «>» вводим текст сообщения.
Для отправки в конце сообщения отправляем символ SUB (26 в ASCII) или ESC (27) для отмены. AT+CMGF=1
AT+CSCS= «GSM» Режим и кодировка.
см. настройки и примечание +CMTI: «SM»,4 Уведомление о приходе СМС.
Второй параметр номер пришедшего СМС. AT+CMGL=»REC UNREAD» +CMGL: 4,»REC UNREAD»,»+380XXXXXXXX»,»

«,»13/09/24,23:02:22+24»
Test2.
OK

Чтение групп СМС.
Всего 5 групп:
REC UNREAD – входящие непрочитанные
REC READ – входящие прочитанные
STO UNSENT – Пользовательские непрочитанные
STO SENT – пользовательские прочитанные
ALL – прочитать все сообщения AT+CMGR=2 +CMGR: «REC READ»,»+380XXXXXXXX»,»

«,»13/09/21,11:57:46+24»
Test sms. elschemo.ru
OK

Чтение SMS сообщений.
Запрос:
Первый параметр – номер сообщения.
Второй параметр (необязателен):
0 – обычный режим (по умолчанию)
1 – не изменять статус сообщения
Ответ:
Первый параметр – группа сообщений, см предыдущий пункт.
Второй параметр – номер отправителя
3 – дата отправки
Далее следует текс сообщения. AT+CMGDA=»DEL SENT» OK Удаление групп СМС:
DEL READ — прочитанные
DEL UNREAD — не прочитанные
DEL SENT — отправленные
DEL UNSENT — не отправленные
DEL INBOX — полученные
DEL ALL — всех сообщения AT+CMGD=4 OK Удаление СМС.
Первый параметр – номер сообщения
Второй параметр:
0 – удаление указанного сообщения (по умолчанию)
1 – удаление прочитанных сообщений
2 – удаление прочитанных и отправленных сообщений
3 – удаление прочитанных, отправленных и не отправленных сообщений
4 – удаление всех сообщений AT+CSCA? +CSCA: «+380991234567»,145
OK Возвращает номер сервис центра отправки сообщений.

Тоновый набор (DTMF)

Тоновые сигналы: 0-9,#,*,A-D

Команда Ответ Описание
AT+VTD=3 OK Длительность тоновых сигналов для AT+VTD.
Значение параметра 1..255
AT+VTS=»1,4,#,A,6,7,0″ OK Отправить последовательность тоновых сигналов (до 20).
Длительность задается командой AT+VTS.
AT+CLDTMF=7, «1,4,#,A,6,7,0» OK Проиграть на модуле (через аудио выход) тоновые сигналы.
Первый параметр — длительность 1-100
Второй параметр – строка тоновых сигналов, до 20.

USSD

Команды приведены для текстового режима и в GSM кодировке.

В этой статье цикла будут подробно описаны вопросы работы с USSD-запросами и получения ответов на них и их обработки, будет описана работа с кодировкой UCS2, в том числе и в USSD-ответах, а также подробно описан процесс отправки SMS-сообщений в PDU-формате на языках отличных от латиницы ( кириллица — русский и пр.).

У данной статьи есть видеоверсия!
Подписывайтесь на канал, чтобы быть в курсе обновлений!

Здесь и далее в статье, в примерах с модулем SIM800L используется одна схема:

Часто бывает полезно, чтобы GSM-модуль сам отслеживал состояние баланса SIM-карты и вовремя информировал владельца о приближении окончания денег. Как известно самый простой способ узнать об остатке — отправить USSD-запрос.

Если в коде не предусмотрена обработка кодировки UCS2 и для работы используется текстовый режим ( Text Mode), то необходимо использовать USSD-команды, возвращающие сообщения не на кириллице.
Например, стандартный USSD-запрос проверки баланса для оператора Билайн — *102# вернет ответ в кодировке UCS2 вида:

Для возврата ответа в текстовом режиме должен использоваться другой USSD-запрос — #102# . Он вернет уже понятный ответ:

Для отправки USSD-запроса существует команда AT+CUSD= [, [, ]] ( по-умолчанию установлена кодировка IRA).

07 На заметку:
Описание Команда Параметр(ы) Ответ Пример(ы)
Отправить USSD-запрос AT+CUSD= [, [, ]]

Незапрашиваемое уведомление:
+CUSD: [, [, ]]

задает статус ответа:

— строка запроса в кавычках
— схема кодирования данных ( целое число, по умолчанию — 0)
— текст ответ на USSD-запрос

OK AT+CUSD=1,"*100#"

Исполнение команды, в случае корректного её исполнения, вернет ответ OK. Но непосредственно USSD-ответ будет получен в виде незапрашиваемого уведомления +CUSD. Именно его нужно отслеживать и обрабатывать, когда оно придет. Пример кода:

Далее, не составит труда получить необходимую информацию и задать требуемую логику приложения. Функция по « извлечению» состояния баланса из сообщения:

11 Arduino (C++)
14 Arduino (C++)

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

Рассмотрим на примере отправленного USSD-запроса баланса и полученного ответа, что нужно делать, чтобы получить вменяемый результат. Отправляем USSD-запрос:

Полученный USSD-ответ 003700360031002E003200330440002E представляет из себя строку в кодировке UCS2 ( по сути это первый, устаревший вариант кодировки Unicode спецификации до версии 1.1, не поддерживающий суррогатные символы). В данной кодировке каждый символ имеет фиксированную ширину — 2 байта ( 16 бит), при этом каждый из байт представлен в HEX-формате. Таким образом каждые четыре знака UCS2-последовательности кодируют всего один символ:

Таблица кодов UCS2 для кириллических символов. С её помощью нетрудно в ручном режиме осуществить преобразование любой строки в UCS2-формате:

Для того, чтобы автоматически преобразовывать UCS2-строку в читаемый вид, автором написана функция UCS2ToString() :

17 Arduino (C++)
Читайте также:  Уроки автоэлектрика от начала до конца
27 Arduino (C++)

Полный пример запроса баланса посредством USSD, с последующим декодированием ответа и парсингом суммы из полученной строки:

29 Arduino (C++)

Отправка SMS на русском языке ( кириллице, и не только) — PDU-формат

Раз тема UCS2 уже затронута, нельзя обойти обратную операцию — конвертация обычного текста в UCS2-строку. Такую задачу нужно решать при отправке SMS на языках, отличных от латиницы, на кириллице в том числе. Делается это при помощи представления сообщения в, специально созданном для таких целей, PDU-формате.

PDU ( англ. Protocol Description Unit ( не Protocol Data Unit)) — один из протоколов передачи SMS-сообщений в GSM-сетях.

Протокол PDU также очень подробно описан на Wikipedia.

Но перед тем, как приступить к самой конвертации, нужно разобрать процедуру отправки SMS в PDU-формате, так как она совершенно отличается от отправки SMS в текстовом формате ( Text Mode).

33 Arduino (C++)
Описание Команда Параметр(ы) Ответ Пример(ы)
Выбор формата SMS AT+CMGF= — формат сообщений, значения:
OK AT+CMGF=0 формат SMS в PDU-формат ( PDU Mode) Отправить SMS в формате PDU AT+CMGS=
— размер сообщения в PDU-пакете
— начало строки, после отправки, модуль переходит в режим приема PDU-пакета

— PDU-пакет сообщения
После того как текст сообщения передан, необходимо отправить либо для отправки сообщения, либо для отмены. +CMGS:

OK

AT+CMGS=23
>
0001000B919782198144F400080A04220435044104420021
>
+CMGS: 122

38 На заметку:

В данном разделе будут использоваться следующие обозначения для представления чисел:

  • b – двоичное представление,
  • d – десятичное представление,
  • h – шестнадцатеричное представление.

Поскольку PDU-пакет будет формироваться из байт в шестнадцатеричном представлении, каждый из них должен быть представлен двумя символами. Например, шестнадцатиричное представление байта 00001011b — Bh ( число 11 в десятичном формате — 11d ) должно быть дополнено нулем до двух знаков — 0Bh .

00001011b = 11d = 0Bh.

39 На заметку:

Для простой конвертации значений в бинарный ( двоичный) / десятичный / шестнадцатиричный формат, можно использовать штатный калькулятор Windows в варианте « Программист». Для этого, необходимо ввести значение в существующем представлении и переключить режим отображения на заданный:

Для формирования PDU-пакета, необходимо ознакомиться с его структурой — из каких полей он состоит, и какой длины эти поля могут быть. Структура PDU-пакета:

Описание полей PDU-пакета:

Название поля Длина, байт Описание SCA (Service Center Address) 1. 12 Номер телефона Центра SMS PDU Type 1 Тип PDU MR (Message Reference) 1 Порядковый номер сообщения DA (Destination Address) 2. 12 Номер телефона получателя сообщения PID (Protocol Identifier) 1 Идентификатор протокола DCS (Data Coding Scheme) 1 Кодировка сообщения VP (Validity Period) 0,1 или 7 Время жизни SMS UDL (User Data Length) 1 Длина поля User Data в байтах UD (User Data) 0. 140 Сообщение

Теперь, для того, чтобы все стало понятно, вместе с подробным описанием каждого из полей PDU-пакета, будет поэтапно показано, как формируется PDU-пакет на примере сообщения с текстом "Тест формата PDU!", отправляемого на номер +7 ( 890) 123-45-67.

  • SCA (Service Center Address)
    Данное поле является необязательным, так как номер SMS-центра ( SMSC) по умолчанию зашит в SIM-карте. При этом значение поля SCA должно быть равно 00h . Применение дефолтного номера SMSC удобно ещё и тем, что сформированный PDU-пакет не привязан к конкретному мобильному оператору и является универсальным. PDU-пакет:
  • PDU-type
    Каждый бит этого однобайтового поля PDU-type имеет различное назначение:
  • RP (Reply Path) – путь для ответа:
    0 — не определен,
    1 — определен, используется тот же SMSC (центр отправки SMS).
  • UDHI (User Data Header Included) – содержит ли поле User Data, помимо сообщения, дополнительный заголовок:
    0 — не содержит,
    1 — содержит.
  • SRR (Status Report Request) – запрос статуса сообщения:
    0 — не запрашивается,
    1 — запрашивается.
  • VPF (Validity Period Format) – формат поля VP (Validity Period, время жизни SMS):
    00 — поле VP отсутствует,
    01 — зарезервировано,
    10 — поле VP содержит временные данные в относительном формате,
    11 — поле VP содержит временные данные в абсолютном формате.
  • RD (Reject Duplicates) – правила обращения с дубликатами сообщений (при одинаковых полях MR и DA). Используется в случаях, когда в SMS-центр поступает сообщение с такими же значениями полей MR и DA, что и у предыдущего сообщения:
    0 — переслать сообщение,
    1 — отклонить сообщение.
  • MTI (Message Type Indicator) – тип сообщения:
    00 — принимаемое сообщение или подтверждение приема отправленного SMS,
    01 — отправляемое сообщение или подтверждение отправки SMS,
    10 — отчет о доставке SMS или SMS-команда (от модуля к SMSC),
    11 — зарезервировано.

При использовании значений по умолчанию – все биты нулевые, 2 бита MTI – 01 (тип сообщения – отправляемое SMS), байт PDU-type примет значение 1: Таким образом, значение байта PDU-type принимается равным 00000001b = 01h :

  • MR (Message Reference)
    Автоматически присваиваемый модулем идентификатор ( порядковый номер) сообщения. Значение поля MR принимается равным 00h :
  • DA (Destination Address)
    Закодированный специальным образом номер телефона получателя, состоит из 3 полей:
  • PL (Phone Length) — количество цифр в номере телефона получателя, без учета прочих знаков типа "+". Например для телефона +7 (897) 012-34-56 количество цифр – 11. Значение поля PL в шестнадцатиричном формате должно быть 11d = 0Bh .
  • PT (Phone Type) — тип номера получателя. В основном используются 2 значения:
    91h — международный формат (как в примере +7 (897) 01. ),
    81h — местный формат, либо короткие номера.
  • RP (Recipient’s Phone) — специально подготовленный номер получателя. Правила подготовки очень простые. Во-первых, нужно оставить только цифры: было +7 (897) 012-34-56 , стало 78970123456 . Во-вторых, если количество цифр нечетное, то в конце нужно добавить букву F : было 78970123456 , стало 78970123456F . И в-третьих, каждую пару цифр нужно поменять местами: было 78970123456F , стало 8779103254F6 .
  • PID (Protocol Identifier)
    Идентификатор протокола. Для задач, определенных данной статьей, поле принимается равным 00h :
  • DCS (Data Coding Scheme)
    Кодировка сообщения. Поскольку, речь о PDU-формате, идет, исходя из необходимости отправки SMS на русском языке, то данное поле должно устанавливать кодировку UCS2. Для этого можно использовать 2 значения:
  • 08h — для отправки обычных сообщений,
  • 18h — для отправки flash-сообщений.
  • VP (Validity Period)
    Время жизни сообщения определяет срок хранения сообщения в SMSC, в случае если его не удается доставить адресату. Это поле связано со значениями битов VPF поля PDU-type. Подробно об этом будет рассказано далее, а поскольку, в примере заданы нулевые биты VPF — 000 00001 , то это поле не будет входить в состав PDU-пакета.
  • UDL (User Data Length)
    Длина поля UD в байтах. Поскольку каждый символ в кодировке UCS2 кодируется 2 байтами, то для получения значения поля UDL, нужно количество символов в сообщении умножить на 2. Текст примера "Тест формата PDU!" состоит из 17 символов ( включая пробелы), таким образом значение поля UDL будет представлять 17*2 = 34d = 22h :
  • UD (User Data)
    Непосредственно сообщение в кодировке UCS. Пример "Тест формата PDU!" в кодировке UCS2 будет выглядеть так:

Сформированный PDU-пакет будет выглядеть так: 0001000B918779103254F6000822 042204350441044200200444043E0440043C04300442043000200050004400550021 .

Для того, чтобы отправить SMS в PDU-формате, в первую очередь необходимо установить режим отправки PDU:

Далее, командой AT+CMGS= в параметре необходимо передать длину PDU-пакета в байтах без учета поля SCA. Поскольку каждый байт кодируется двумя символами, нужно исключить поле SCA и разделить оставшееся количество символов пополам. Таким образом, значение параметра будет равно 47:

Далее, как и при отправке SMS в текстовом формате — передается PDU-пакет, и в завершение Ctrl+Z .

Отправка SMS в PDU-формате: Arduino

Программная реализация отправки SMS в PDU-формате очень проста, за исключением части, отвечающей за кодирование строки в UCS2-формат. Блок кодирования состоит из нескольких функций и выглядит так:

53 На заметку:
62 Arduino (C++)
63 На заметку:

Функция по отправке SMS в PDU-формате немного отличается от отправки SMS в текстовом формате. Дополнительно вводятся функции по формированию PDU-пакета, по схеме, описанной выше. Полный пример отправки SMS в PDU-формате:

65 Arduino (C++)

Похожие записи: