Как Отправить Флеш-Смс?

Flash-SMS – это SMS, текст которого сразу отображается на экране телефона/смартфона пользователя, а не записывается в память устройства.

Пользователь читает его и решает, сохранять его в памяти или нет. Для отправки flash SMS вам потребуется использовать так называемый режим PDU — Packet Data Unit. Это режим, который позволяет вам контролировать все секретные параметры SMS, описанные в Технической спецификации ETSI GSM GSM 03.40. Для доступа к PDU рекомендуется использовать любой GSM-модем или модуль.

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

я использовал GSM-модуль Neoway M660 , но для модемов/модулей других производителей это тоже должно быть актуально.



Как отправить флеш-СМС?

В режиме PDU SMS-сообщение представляет собой набор данных, отправляемых на модем в виде символов ASCII. Давайте посмотрим на формат передаваемого SMS-сообщения, последовательность команд, отправляемых на GSM-модем, а также сформируем PDU-пакет и отправим flash-SMS «Привет, Хабр!» на гипотетический номер +70123456789.



Формат передаваемых SMS-сообщений в режиме PDU

показано на картинке:

Как отправить флеш-СМС?

Имя поля PDU Длина, байты Краткое описание
SCA, Адрес сервисного центра 1-12 Номер телефона СМС-центра (можно не указывать)
Тип PDU Тип PDU
MR, ссылка на сообщение 1 Порядковый номер сообщения, установленный самим модемом/модулем
DA, адрес назначения 2-12 Номер телефона получателя сообщения
PID, идентификатор протокола 1 Идентификатор протокола
DCS, Схема кодирования данных 1 Кодирование сообщения
Вице-президент по периоду действия 0,1 или 7 Срок действия СМС
UDL, длина пользовательских данных 1 Длина поля пользовательских данных в байтах
УД, Данные пользователя 0-140 Сообщение
Итак, рассмотрим назначение отдельных полей PDU-пакета передаваемого сообщения.

1. SCA (Адрес Сервисного Центра) – номер телефона SMS-Центра (СМСЦ).

Это поле является необязательным, поскольку номер SMSC хранится на SIM-карте и автоматически считывается модулями Neoway GSM. Мы воспользуемся этой возможностью и не будем в нашем примере указывать номер СМС-центра, тем более, что в этом случае содержимое PDU не зависит от используемой SIM-карты.

Если номер SMSC не указан в PDU, поле SCA устанавливается в 0x00. Но если вы все же захотите прочитать номер SMS-центра из GSM-модуля, вы всегда можете сделать это с помощью команды AT+CSCA?.

2. Тип PDU – тип PDU.

Как отправить флеш-СМС?

2.1 RP (Путь ответа) 0 - путь для ответа не определен, 1 – путь для ответа определен, используется тот же SMS-центр (SMSC).

2.2 UDHI (включая заголовок пользовательских данных): 0 – поле UD содержит только само сообщение, 1- Поле UD содержит сообщение и дополнительный заголовок.

2.3 SRR (запрос отчета о состоянии): 0 – статус сообщения не запрашивается, 1 - запрашивается статус сообщения.

2.4 VPF (формат срока действия): 00 – поле ВП отсутствует, 01 – зарезервировано, 10 – поле VP содержит данные времени в относительном формате, 11 – Поле VP содержит данные времени в абсолютном формате.

2.5 RD (Отклонить дубликаты): 0 — SMSC должен переслать сообщение получателю, если оно имеет те же значения полей MR и DA, что и предыдущее сообщение.

1 — SMSC ДОЛЖЕН отклонить сообщение, если оно имеет те же значения полей MR и DA, что и предыдущее сообщение.

2.6 MTI (индикатор типа сообщения): 00 – полученное сообщение (от SMSC к модулю) или подтверждение приема (от модуля к SMSC) 01 – сообщение для отправки (от модуля на SMSC) или подтверждение отправки (от SMSC на модуль), 10 – отчет о доставке (от SMSC к модулю) или SMS-команда (от модуля к SMSC) 11 – зарезервировано.

Для простоты мы не будем использовать поле VP (время жизни SMS, см.

параграф 7) и установим биты VPF в ноль.

Также установите биты RP, UDHI, SRR, RD в ноль.

Биты MTI отправленного сообщения должны быть установлены на 01. Таким образом, значение байта поля PDU Type установлено на 0x01. 3. MR (Message Reference) – порядковый номер сообщения, определяемый самим модулем.

В PDU значение поля установлено в 0x00. 4. DA (Адрес назначения) – номер телефона получателя сообщения.

Поле DA состоит из трёх частей и имеет следующий вид:

Количество цифр в номере получателя Тип номера получателя Номер получателя
1 байт 1 байт 0…6 байт
4.1 Количество цифр в номере получателя рассчитывается без учета знака «+» и представляется в шестнадцатеричном формате.

Например, для номера +70123456789 значение байта «Количество цифр в номере получателя» равно 0x0B (11 в десятичном формате).

4.2 Тип номера получателя.

В случае международного формата номера байт «Тип номера получателя» устанавливается равным 0x91, в случае локального формата – 0x81. 4.3 Номер получателя.

Поле «Номер получателя» формируется следующим образом: а) в случае международного формата номера знак «+» отбрасывается; б) если количество цифр в номере нечетное, в конце добавляется буква «F»; в) цифры числа попарно меняются местами.

Например, для номера +70123456789 поле «Номер получателя» будет иметь вид: 0721436587F9, а все поле DA будет 0B910721436587F9. 5. PID (Protocol Identifier) – идентификатор протокола.

В нашем случае значение поля PID должно быть установлено равным 0x00. Более подробную информацию об особенностях этого поля можно найти в ETSI GSM 03.40, пункт 9.2.3.9. 6. DCS (Data Coding Scheme) – кодирование сообщений.

Это та самая сфера, которая нас сейчас интересует больше всего! Для отправки сообщений кириллицей необходимо использовать кодировку UCS2. Значение поля DCS в нашем случае должно быть установлено 0x18 — это секретная комбинация, позволяющая отправлять flash-SMS кириллическими символами (0x08 — обычное SMS).

7. VP (Validity Period) – срок действия сообщения.

Срок жизни сообщения — время, по истечении которого сообщение уничтожается (стирается из памяти SMS-центра), если оно не доставлено получателю.

Это поле связано с битами VPF поля типа PDU, и существует три способа их совместного использования.

7.1 Поле VP не используется (помните, мы договорились, что не будем его использовать в нашем примере?).

В данном случае длина поля VP равна 0 байт, биты VPF должны быть установлены в 00 (как мы уже сделали).

7.2 Поле VP содержит данные о сроке службы в относительном формате.

В этом случае длина поля VP равна 1 байту, биты VPF должны быть установлены на 10 (в двоичном формате).

Возможные значения поля VP при использовании относительного формата времени и формула расчета времени жизни соответствующего сообщения показаны в следующей таблице:

Шестнадцатеричное значение VP Десятичное значение VP Время, соответствующее значению VP Максимальный срок службы
1.8F 0… 143 (ПО + 1) * 5 минут 12 часов
90.А7 144… 167 12 часов + (ПО – 143)*30 минут 24 часа
А8.С4 168… 196 (ПО – 166) * 1 день 30 дней
C5.FF 197… 255 (ВП – 192) * 1 неделя 63 недели
7.3 Поле VP содержит данные о сроке службы в абсолютном формате.

В этом случае длина поля VP составляет 7 байт, биты VPF должны быть установлены в 11 (в двоичном формате).

Назначение байтов поля VP при использовании формата абсолютного времени показано в этой таблице:

1-й байт 2-й байт 3-й байт 4-й байт 5-й байт 6-й байт 7-й байт
Год Месяц День Час минуты Секунды Часовой пояс
В этом случае каждый байт содержит два переставленных десятичных числа.

Например, байт 2 в случае мая будет иметь значение 0x50. Год обозначается двумя последними цифрами.

Часовой пояс указывает разницу между местным временем и средним временем по Гринвичу (GMT), выраженную в четверти часа.

В этом случае первый бит указывает знак этой разницы: 0 – разница положительная, 1 – разница отрицательная.

То есть байт 7 в случае часового пояса GMT+3 будет иметь значение 0x21. Поскольку мы решили не использовать поле VP и установили два бита VPF поля типа PDU на 00, наш примерный пакет PDU не будет иметь поля VP. 8. UDL (длина данных пользователя) – длина поля UD в байтах.

Если мы используем интересующую нас кодировку UCS2, то значение поля UDL можно вычислить, умножив количество символов в передаваемом сообщении на 2 (каждый символ кодируется двумя байтами).

На сообщение «Привет, Хабр!» поле UDL имеет размер 0x1A (26 в десятичном формате).

9. UD (Пользовательские данные) – сообщение Для отправки сообщения на кириллице необходимо использовать кодировку UCS2; в этой кодировке каждая буква или символ кодируется двумя байтами.

Таблица кодировки UCS2 — здесь Сообщение «Привет, Хабр!» в кодировке UCS2 это будет выглядеть так: П: 041F р: 0440 и: 0438 кому: 0432 е: 0435 т: 0442 ,: 002C : 0020 Х: 0425 а: 0430 б: 0431 р: 0440 !: 0021 Привет, Хабр!: 041F04400438043204350442002C002004250430043104400021

Процесс отправки СМС

После создания PDU процесс отправки SMS становится простым и состоит из двух простых шагов: 1. Ввод команды на отправку СМС с указанием количества байт в пакете PDU, без учета поля SCA. Звучит не очень дружелюбно, но если номер SMS-центра не используется, то поле SCA равно 0x00 (как у нас) и это число равно количеству байтов в пакете PDU минус один.

Для «Привет, Хабр!» это значение равно 39: АТ+ЦМГС=39 Важно, чтобы эта команда заканчивалась символом «\r» (0x0D) без каких-либо префиксов.

После этого модем GSM выдает приглашение «> » для ввода данных пакета PDU. 2. Ввод пакетных данных PDU. В случае сообщения «Привет, Хабр!» PDU выглядит следующим образом: 0001000B91хххххххххххх00181A041F04400438043204350442002C002004250430043104400021 (в текстовом виде), где хххххххххххх – поле номера получателя, с перестановкой цифр и добавлением в конце символа «F» в случае нечетного количества цифр в номере (как описано ранее).

Для номера +79123456789 поле номера получателя будет иметь вид: 9721436587F9, и весь PDU-пакет с сообщением «Привет, Хабр!» отправили на этот номер: 0001000B919721436587F900181A041F04400438043204350442002C002004250430043104400021 Ввод пакетных данных PDU должен заканчиваться байтом 0x1A. Если SMS-сообщение отправлено успешно, модем ответит: +CMGS: Ссылка_сообщения ХОРОШО Где Ссылка_сообщения — порядковый номер сообщения, установленный модемом (см.

описание поля MR пакета PDU).

Теги: #Компьютерное оборудование #Беспроводные технологии #Сделай сам или Сделай сам #Сотовая связь #смс #смс #GPRS #GSM #Neoway #gsm модуль #M660

Вместе с данным постом часто просматривают: