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 | Сообщение |
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 байт |
Например, для номера +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 недели |
В этом случае длина поля 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
-
Ключевые Навыки Программиста Python
19 Oct, 24 -
Упростить! = Улучшить
19 Oct, 24 -
Как Мы Сжимали Шарики
19 Oct, 24