У режимі PDU SMS-повідомлення являє собою набір даних, що передаються модему у вигляді символів ASCII.
Давайте розглянемо формат переданого SMS-повідомлення, послідовність команд, що подаються на GSM-модем, а також сформуємо пакет PDU і пошлемо flash-SMS «Привіт!» На гіпотетичний номер +70123456789.
Формат переданого SMS-повідомлення в режимі PDU
зображений на картинці:
Назва поля PDU
Отже, розглянемо призначення окремих полів пакету PDU переданого повідомлення.
2. PDU Type - тип PDU
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).