Как работать с SMS в модемах RX?

Как работать с SMS в модемах RX?

← Все разделы FAQ

Разделы FAQ:

Оглавление

Введение

Модемы TELEOFIS серии RX умеют отправлять и принимать SMS (СМС), что удобно для оповещений с объекта, аварийных сообщений и удалённой диагностики. Управление SMS выполняется AT-командами — вручную из терминальной программы или из вашего ПО.

В статье на примере модема TELEOFIS RX301-R4 и терминальной программы HTerm разобрано, как отправить SMS через AT-команды в текстовом режиме и в режиме PDU (в том числе SMS на русском языке, кириллицей), как прочитать и раскодировать входящие сообщения, как удалить их из памяти модема и какие ошибки встречаются при работе с SMS.


Теоретическая часть

Длина сообщения и кодировки

SMS (Short Message Service — служба коротких сообщений) — технология передачи коротких текстовых сообщений, входящая в стандарты сотовой связи. Максимальный размер полезной нагрузки одного SMS — 140 байт (1120 бит). Сколько символов в них помещается, зависит от кодировки:

Кодировка Символов в одном SMS Применение
7 бит (алфавит GSM) 160 Латиница, цифры, основные знаки препинания
8 бит 140 байт Двоичные и служебные сообщения
16 бит (UCS2) 70 Кириллица, китайский, арабский и другие национальные алфавиты

Таким образом, SMS кириллицей не может быть длиннее 70 символов. Более длинный текст передаётся несколькими сообщениями (составное SMS), каждое из которых несёт заголовок с номером части.

Текстовый режим и режим PDU

Модем работает с SMS в одном из двух режимов, который задаётся командой AT+CMGF:

  • AT+CMGF=1 — текстовый режим. Простой: номер и текст вводятся как есть. Но параметрами сообщения управлять нельзя, а отправить кириллицу «как есть» не получится. Некоторые модемы текстовый режим не поддерживают вовсе.
  • AT+CMGF=0 — режим PDU (Protocol Data Unit). Сообщение передаётся строкой шестнадцатеричных байтов, в которой закодированы все его параметры, включая кодировку. Подходит для любых сообщений, в том числе на русском языке.

Основные AT-команды для работы с SMS:

Команда Назначение
AT+CMGF Выбор режима: 0 — PDU, 1 — текстовый
AT+CMGS Отправка SMS
AT+CPMS Выбор области памяти для хранения SMS
AT+CMGL Чтение списка сообщений
AT+CMGR Чтение одного сообщения по индексу
AT+CMGD Удаление сообщений

Как подключиться к модему и подавать AT-команды, описано в статье «Как подавать AT-команды в модемы RX», список терминальных программ — в статье «Программы для настройки модемов серии RX».


Отправка SMS в текстовом режиме

  1. Проверьте текущий режим:
    AT+CMGF?
    +CMGF: 0
    
    Ответ 0 означает, что модем работает в режиме PDU.
  2. Переведите модем в текстовый режим:
    AT+CMGF=1
    OK
    
  3. Укажите номер получателя:
    AT+CMGS="89514562536"
    >
    
    В ответ модем выводит приглашение > — можно вводить текст сообщения.
  4. Введите текст латиницей, например Hello world, без перевода строки. В HTerm для этого в поле окончания строки выберите None вместо CR.
  5. Завершите ввод комбинацией Ctrl+Z — в терминале её отправляют байтом 1A в шестнадцатеричном виде.
Примечание: в зависимости от модели модуля номер в команде AT+CMGS вводится либо в кавычках, как в примере, либо без них.

Если сообщение отправлено, модем вернёт его порядковый номер:

> Hello world
+CMGS: 4

Так выглядит ввод номера и текста в HTerm:

Ввод номера и текста SMS в HTerm

Отправка завершающего байта 1A и ответ модема +CMGS:

Отправка Ctrl+Z и ответ модема в HTerm

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


Отправка SMS в режиме PDU

Структура PDU

Сообщение в режиме PDU состоит из двух частей: SMS = SCA + TPDU, где:

  • SCA (Service Center Address) — номер SMS-центра, через который отправляется сообщение. Значение 00 означает «использовать SMS-центр, записанный на SIM-карте»;
  • TPDU (Transport Protocol Data Unit) — номер получателя, текст сообщения и служебные поля.

Кодирование сообщения

Отправим слово «Привет!!!» кириллицей. Для перевода текста в PDU воспользуйтесь онлайн-конвертером PDU Converter и заполните поля:

  • Receiver — номер получателя в международном формате, обязательно с + в начале (российский номер — +7...);
  • Alphabet Size — 7 для латиницы, 16 для кириллицы;
  • Text — текст сообщения.

Остальные параметры отключите или очистите. Нажмите Convert — в поле PDU Message Entry/Display появится строка для отправки:

0001000B919715542635F6000812041F04400438043204350442002100210021

Отправка

  1. Переведите модем в режим PDU:
    AT+CMGF=0
    OK
    
  2. Подайте команду AT+CMGS с длиной сообщения:
    AT+CMGS=31
    >
    
    Параметр — длина только блока TPDU в байтах, без SCA. В примере строка состоит из 32 байтов, первый из которых (00) — это SCA, поэтому длина равна 31.
  3. После приглашения > вставьте PDU-строку.
  4. Отправьте завершающий байт 1A (Ctrl+Z).

Ввод PDU-строки в HTerm:

Отправка SMS в режиме PDU в HTerm

Если всё введено верно, модем вернёт порядковый номер отправленного сообщения:

+CMGS: 5

Если ваше ПО должно рассылать SMS на русском языке, в него нужно встроить кодирование сообщений в PDU либо использовать готовое ПО (см. раздел «Отправка и приём SMS через специализированное ПО»).


Чтение входящих SMS

Области памяти

Память модема для SMS делится на три логические секции:

  1. для просмотра, чтения и удаления сообщений;
  2. для сохранения и отправки исходящих сообщений;
  3. для только что полученных сообщений.

Каждой секции назначается одна из физических областей памяти:

  • SM — память SIM-карты;
  • ME — память модема;
  • MT — общая память SIM-карты и модема (SM + ME);
  • BM — память для широковещательных сообщений сети;
  • SR — память для отчётов о доставке.

Для чтения входящих нужна первая секция и область SM, ME или объединяющая их MT. Набор поддерживаемых областей зависит от модуля — список выводит команда AT+CPMS=?.

  1. Посмотрите, какие области назначены секциям:
    AT+CPMS?
    +CPMS: "MT",29,255,"ME",29,255,"ME",29,255
    
  2. Назначьте первой секции общую память:
    AT+CPMS="MT"
    +CPMS: 29,255,29,255,29,255
    
    Для каждой секции модем выводит пару чисел: сколько сообщений хранится (29) и сколько помещается (255).

Команды чтения

AT+CMGL выводит сразу все сообщения с заданным статусом, AT+CMGR — одно сообщение по индексу.

AT+CMGL=<stat>
AT+CMGR=<index>

Значения <stat> в режиме PDU (в текстовом режиме им соответствуют строки в кавычках):

PDU Текстовый режим Сообщения
0 "REC UNREAD" Полученные непрочитанные
1 "REC READ" Полученные прочитанные
2 "STO UNSENT" Сохранённые неотправленные
3 "STO SENT" Сохранённые отправленные
4 "ALL" Все
Примечание: нумерация индексов зависит от модуля и области памяти — с 0 или с 1. Актуальные индексы сообщений показывает AT+CMGL=4.

Пример чтения сообщения

Прочитаем сообщение с индексом 0:

AT+CMGR=0
+CMGR: 1,"",155
07919762929090F040038111F10008511121304343218C0500033F0302043E0431044904380442044C00200431043B04380437043A0438043C0020043E00200412043004480435043C0020043D043E0432043E043C0020043D043E043C0435044004350020043F04400438002004370432043E043D043A04350020043D043000200441044204300440044B0439002E0020041F043E04340440043E0431043D04350435

OK

В режиме PDU модем выдаёт сообщение целиком в виде шестнадцатеричной строки, а в заголовке +CMGR — статус и длину TPDU. В текстовом режиме заголовок становится читаемым, но кириллический текст по-прежнему выводится шестнадцатеричной строкой в кодировке UCS2:

+CMGR: "REC READ","111","","15/11/12,03:34:34+12"

Чтобы раскодировать сообщение, вставьте PDU-строку в поле PDU Message Entry/Display конвертера PDU Converter и нажмите Convert. В поле Result появится расшифровка:

SMS DELIVER (receive)
Receipt requested: no
SMSC: 79262909090
Sender: 111
TOA: 81 unknown, Numbering Plan: unknown
TimeStamp: 12/11/15 03:34:34 GMT +03:00
TP-PID: 00
TP-DCS: 08
TP-DCS-desc: Uncompressed Text, No class
Alphabet: UCS2 (16bit)
User Data Header: 05 00 03 3F 03 02

общить близким о Вашем новом номере при звонке на старый. Подробнее

Заголовок User Data Header: 05 00 03 3F 03 02 означает, что это вторая часть (02) составного сообщения из трёх (03), поэтому текст начинается с середины слова. Остальные части хранятся под другими индексами.


Удаление SMS

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

AT+CMGD=<index>[,<delflag>]

где <index> — индекс сообщения в памяти, <delflag> — необязательный критерий удаления:

  • 0 — удалить сообщение с указанным индексом (по умолчанию);
  • 1 — удалить все прочитанные;
  • 2 — удалить прочитанные и отправленные;
  • 3 — удалить прочитанные, отправленные и неотправленные;
  • 4 — удалить все сообщения.

При <delflag> от 1 до 4 индекс игнорируется. Например, удалить все сообщения:

AT+CMGD=1,4
Примечание: удаление необратимо. Перед AT+CMGD=1,4 убедитесь, что нужные сообщения прочитаны и сохранены.

Отправка и приём SMS через специализированное ПО

Вручную кодировать и раскодировать PDU неудобно, поэтому для постоянной работы с SMS используют готовые программы. Например:

  • SMSGate — платное ПО для Windows;
  • Gnokii — бесплатное консольное ПО, в основном для Linux.

SMSGate

Окно настройки подключения к модему:

Настройка подключения в SMSGate

Основное окно работы с сообщениями:

Интерфейс SMSGate

Подробнее — в руководстве по SMSGate.

Gnokii

Gnokii работает из консоли; версии для Windows тоже существуют. В Linux модем отображается как файл устройства, например USB-модем TELEOFIS RX301-R4 — как /dev/ttyUSB0.

Настройки хранятся в файле /etc/gnokiirc:

[global]
port = /dev/ttyUSB0
model = AT
initlength = default
connection = serial
use_locking = no
serial_baudrate = 115200
smsc_timeout = 10

Пример отправки SMS:

echo 'Hello!!!' | gnokii --sendsms +79260000000

Подробности — в репозитории Gnokii. Кроме этих программ существуют другие системы и онлайн-сервисы для рассылки SMS; при необходимости можно написать и собственное ПО на основе описанных выше команд.


Диагностика ошибок

Ошибки при отправке и приёме SMS модем возвращает в формате +CMS ERROR: <код>. Наиболее частые:

Ошибка Причина и решение
+CMS ERROR: 304
(Invalid PDU mode parameter)
Неверная PDU-строка или длина в AT+CMGS. Проверьте содержимое PDU и длину TPDU, попробуйте указать номер SMS-центра (SCA) явно.
+CMS ERROR: 330
(SMSC address unknown)
Не задан номер SMS-центра, часто встречается на 3G-модемах. Узнайте номер у оператора и задайте его командой AT+CSCA или в поле SCA PDU-строки.
+CMS ERROR: 331
(No network service)
Модем не в сети. Проверьте уровень сигнала (AT+CSQ) и баланс SIM-карты; если не помогает — обратитесь к оператору связи.
+CMS ERROR: 500
(Unknown error)
Общая ошибка, возникает на разных этапах отправки. Возможные причины:
  • модем не зарегистрирован в сети;
  • на счёте недостаточно средств;
  • сеть перегружена и не может принять сообщение;
  • задан неверный номер SMS-центра;
  • задан неверный номер получателя;
  • используемое ПО некорректно работает с модемом.

Заключение

Для отправки SMS латиницей достаточно текстового режима и пары AT-команд. Сообщения на русском языке отправляются и читаются в режиме PDU, где текст кодируется в UCS2 и вручную преобразуется конвертером или вашим ПО. Командами AT+CPMS, AT+CMGL, AT+CMGR и AT+CMGD вы управляете входящими сообщениями и памятью модема. Для регулярной работы с SMS удобнее использовать готовое ПО, которое берёт кодирование на себя.