Як послати flash-sms

Як послати flash-sms

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

Формат переданого SMS-повідомлення в режимі PDU

зображений на картинці:

Як послати flash-sms

Назва поля PDU

Отже, розглянемо призначення окремих полів пакету PDU переданого повідомлення.

2. PDU Type - тип PDU

Як послати flash-sms

2.1 RP (Reply Path)
0 - шлях для відповіді не визначено,
1 - шлях для відповіді визначено, використовується той же Центр SMS (SMSC).

2.2 UDHI (User Data Header Included):
0 - поле UD містить тільки саме повідомлення,
1 поле UD містить повідомлення і додатковий заголовок.

2.3 SRR (Status Report Request):
0 - статус повідомлення не запитується,
1 статус повідомлення запитується.

2.4 VPF (Validity Period Format):
00 - поле VP відсутня,
01 - зарезервовано,
10 - поле VP містить часЛ дані в відносному форматі,
11 - поле VP містить часЛ дані в абсолютному форматі.

2.5 RD (Reject Duplicates):
0 - SMSC слід переслати повідомлення одержувачу в разі, якщо воно має ті ж значення полів MR і DA, що і попереднє повідомлення.
1 - SMSC слід відхилити повідомлення в разі, якщо воно має ті ж значення полів MR і DA, що і попереднє повідомлення.

2.6 MTI (Message Type Indicator):
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.1 Кількість цифр в номері одержувача підраховується без урахування знака «+» і представляється в шістнадцятковому форматі.
Наприклад, для номера +70123456789 значення байта «Кількість цифр в номері одержувача» дорівнює 0x0B (11 в десятковій системі числення).

4.2 Тип номера одержувача.
У разі міжнародного формату номера байт «Тип номера одержувача» встановлюється рівним 0x91, в разі місцевого формату - 0x81.

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

Наприклад, для номера +70123456789 поле «Номер отримувача» матиме вигляд: 0721436587F9, а цілком поле DA - 0B910721436587F9.

6. DCS (Data Coding Scheme) - кодування повідомлення.
Ось це і є те саме поле, яке нас найбільше зараз цікавить! Для відправки повідомлень кириличними символами необхідно використовувати кодування UCS2.
Значення поля DCS в нашому випадку слід встановити рівним 0x18 - це і є секретна комбінація, що дозволяє відправити flash-SMS кириличними символами (0x08 - звичайне SMS).

7. VP (Validity Period) - час життя повідомлення.

7.1 Поле VP не використовується (пам'ятаєте, ми домовлялися, що і не будемо його використовувати в нашому прикладі?).
У цьому випадку довжина поля VP - 0 байт, біти VPF повинні бути встановлені в значення 00 (як ми вже і зробили).

7.2 Поле VP містить дані про час життя в відносному форматі.
У цьому випадку довжина поля VP - 1 байт, біти VPF повинні бути встановлені в значення 10 (в двійковій системі).
Можливі значення поля VP в разі використання відносного формату часу і формули для розрахунку відповідного часу життя повідомлення наведені в наступній таблиці:

Значення VP шестнадцатеричное

Значення VP десяткове

Відповідне значення VP час

При цьому кожен байт містить по два десяткових числа, переставлених місцями. Наприклад, байт 2 в разі місяця травня буде мати значення 0x50.
Рік представлений останніми двома цифрами.
Часовий пояс вказує різницю між місцевим часом і часом за Гринвічем (GMT), виражену в чвертях години. При цьому перший біт вказує знак цієї різниці: 0 - різниця позитивна, 1 - різниця негативна. Тобто байт 7 в разі часового поясу GMT + 3 матиме значення 0x21.

Так як ми вирішили не використовувати поле VP і встановили два біта VPF поля PDU Type в значення 00, то в пакеті PDU нашого прикладу поле VP буде відсутній.

8. UDL (User Data Length) - довжина поля UD в байтах.
У разі використання цікавить нас кодування UCS2 значення поля UDL можна обчислити, помноживши кількість символів в переданому повідомленні на 2 (кожен символ кодується двома байтами). Для повідомлення «Привіт!» Поле UDL одно 0x1A (26 в десятковій системі).

9. UD (User Data) - повідомлення
Для відправки повідомлення кирилицею необхідно використовувати кодування UCS2, в цьому кодуванні кожна буква або символ кодується двома байтами.
Таблиця кодування UCS2 - тут
Повідомлення «Привіт!» В кодуванні UCS2 буде виглядати так:
П: 041F
р: 0440
і: 0438
в: 0432
е: 0435
т: 0442
. 002C
. 0020
Х: 0425
а: 0430
б: 0431
р: 0440
. 0021

Процес відправки SMS-повідомлення

Як тільки пакет PDU сформований, процес відправки SMS не становить труднощів і складається з двох простих кроків:

1. Введення команди відправки SMS із зазначенням кількості байт в пакеті PDU за винятком поля SCA. Звучить не дуже дружелюбно, але якщо не використовується номер Центру SMS, то поле SCA одно 0x00 (як у нас) і це число дорівнює кількості байт в пакеті PDU мінус один. Для «Привіт!» Ця величина - 39:

Важливо, щоб ця команда завершувалася символом 'r' (0x0D), без добавок.
Після цього GSM-модем видає запрошення '>' ввести дані пакета PDU.

Введення даних пакета PDU повинен закінчуватися байтом 0x1A

У разі успішного відправлення SMS-повідомлення модем відповість:

+CMGS: Message_Reference
OK

де Message_Reference - порядковий номер повідомлення, встановлений модемом (див. опис поля MR пакета PDU).

Схожі статті