Оглавление
- Введение
- Теоретическая часть
- Отправка SMS в текстовом режиме
- Отправка SMS в режиме PDU
- Чтение входящих SMS
- Удаление SMS
- Отправка и приём SMS через специализированное ПО
- Диагностика ошибок
- Заключение
Введение
Модемы 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 в текстовом режиме
-
Проверьте текущий режим:
AT+CMGF? +CMGF: 0
Ответ0означает, что модем работает в режиме PDU. -
Переведите модем в текстовый режим:
AT+CMGF=1 OK
-
Укажите номер получателя:
AT+CMGS="89514562536" >
В ответ модем выводит приглашение>— можно вводить текст сообщения. - Введите текст латиницей, например
Hello world, без перевода строки. В HTerm для этого в поле окончания строки выберите None вместо CR. - Завершите ввод комбинацией Ctrl+Z — в терминале её отправляют байтом
1Aв шестнадцатеричном виде.
AT+CMGS вводится либо в кавычках, как в примере, либо без них.
Если сообщение отправлено, модем вернёт его порядковый номер:
> Hello world +CMGS: 4
Так выглядит ввод номера и текста в HTerm:
Отправка завершающего байта 1A и ответ модема +CMGS:
В других терминальных программах интерфейс отличается, но последовательность команд та же.
Отправка 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
Отправка
-
Переведите модем в режим PDU:
AT+CMGF=0 OK
-
Подайте команду
AT+CMGSс длиной сообщения:AT+CMGS=31 >
Параметр — длина только блока TPDU в байтах, без SCA. В примере строка состоит из 32 байтов, первый из которых (00) — это SCA, поэтому длина равна31. - После приглашения
>вставьте PDU-строку. - Отправьте завершающий байт
1A(Ctrl+Z).
Ввод PDU-строки в HTerm:
Если всё введено верно, модем вернёт порядковый номер отправленного сообщения:
+CMGS: 5
Если ваше ПО должно рассылать SMS на русском языке, в него нужно встроить кодирование сообщений в PDU либо использовать готовое ПО (см. раздел «Отправка и приём SMS через специализированное ПО»).
Чтение входящих SMS
Области памяти
Память модема для SMS делится на три логические секции:
- для просмотра, чтения и удаления сообщений;
- для сохранения и отправки исходящих сообщений;
- для только что полученных сообщений.
Каждой секции назначается одна из физических областей памяти:
SM— память SIM-карты;ME— память модема;MT— общая память SIM-карты и модема (SM+ME);BM— память для широковещательных сообщений сети;SR— память для отчётов о доставке.
Для чтения входящих нужна первая секция и область SM, ME или объединяющая их MT. Набор поддерживаемых областей зависит от модуля — список выводит команда AT+CPMS=?.
-
Посмотрите, какие области назначены секциям:
AT+CPMS? +CPMS: "MT",29,255,"ME",29,255,"ME",29,255
-
Назначьте первой секции общую память:
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
Окно настройки подключения к модему:
Основное окно работы с сообщениями:
Подробнее — в руководстве по 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 латиницей достаточно текстового режима и пары AT-команд. Сообщения на русском языке отправляются и читаются в режиме PDU, где текст кодируется в UCS2 и вручную преобразуется конвертером или вашим ПО. Командами AT+CPMS, AT+CMGL, AT+CMGR и AT+CMGD вы управляете входящими сообщениями и памятью модема. Для регулярной работы с SMS удобнее использовать готовое ПО, которое берёт кодирование на себя.