Базы данныхИнтернетКомпьютерыОперационные системыПрограммированиеСетиСвязьРазное
Поиск по сайту:
Подпишись на рассылку:

Назад в раздел

SMS-приложение. Часть 3

div.main {margin-left: 20pt; margin-right: 20pt}

С.Кадаков
sgerr@clubpro.spb.ru
SMS-приложение. Часть 3. Отправка/прием сообщений.

Мы продолжаем обсуждать команды протокола. Нам осталось рассмотреть две самые интересные команды, с помощью которых, собственно, и осуществляется прием/передача сообщений. Это команды submit_sm и deliver_sm. Первая служит для отправки SMS от ESME в PLMN, а вторая -- для приема SMS из PLMN.

submit_sm. command_id = 0x04

Тело пакета submit_sm состоит из следующих полей:

Field name Size (octets) Type Description
service_type Var. max 6 C-Octet String Используется для доступа к специальным функциям SMSC. Может принимать значения: ““ (NULL) Default “CMT” Cellular Messaging “CPT” Cellular Paging “VMN” Voice Mail Notification “VMA” Voice Mail Alerting “WAP” Wireless Application Protocol “USSD” Unstructured Supplementary Services Data

Если не используется (в большинстве случаев), выставляется в NULL.

source_address_ton 1 Integer Тип номера источника (см. пред. статью)
source_address_npi 1 Integer Индикатор плана номеров источника (см. пред. статью)
source_address 20 C-Octet String Адрес источника, если неизвестен выставляется в NULL
dest_address_ton 1 Integer Тип номера получателя (см. пред. статью)
dest_address_npi 1 Integer Индикатор плана номеров получателя (см. пред. статью)
dest_address 20 C-Octet String Адрес получателя. Для mobile-terminated (т. е. предназначенных для передачи непостредственно на сотовый телефон) сообщений это в точности номер телефона.
esm_class 1 Integer Указывает на тип сообщешия и его режим (mode). Может принимать следующие значения:
Bits 7 6 5 4 3 2 1 0 Meaning
Messaging Mode (bits 1-0)
x x x x x x 0 0 Default SMSC Mode (e.g. Store and Forward)
x x x x x x 0 1 Datagram mode
x x x x x x 1 0 Forward (i.e. Transaction) mode
x x x x x x 1 1 Store and Forward mode (use to select Store and Forward mode if Default SMSC Mode is non Store and Forward)

Message Type (bits 5-2)
x x 0 0 0 0 x x Default message Type (i.e. normal message)
x x 0 0 1 0 x x Short Message contains ESME Delivery Acknowledgement
x x 0 1 0 0 x x Short Message contains ESME Manual/User Acknowledgement

GSM Network Specific Features (bits 7-6)
0 0 x x x x x x No specific features selected
0 1 x x x x x x UDHI Indicator (only relevant for MT short messages)
1 0 x x x x x x Set Reply Path (only relevant for GSM network)
1 1 x x x x x x Set UDHI and Reply Path (only relevant for GSM network)

При работе в т. н. Store and Forward mode и отказе от использования дополнительных свойств (что верно в большинстве случаев) это поле будет содержать 0.
protocol_id 1 Integer Идентификатор протокола (специфично для сети). В стандарте GSM этот параметр регулируется документом GSM 03.40 (т. н. "Библией SMS") и используется для указания на низлежащий протокол связи ESME с SMSC. В простейшем случае -- 0.
priority_flag 1 Integer При передаче по GSM сетям: 0 -- приоритет отсутствует, 1-3 -- приоритет (равноправны). >3 -- не используется
schedule_delivery_time 1 или 17 C-Octet String Время отложенного доведения (в формате SMPP -- см. ниже) или 0 для немедленного доведения.
validity_period 1 или 17 C-Octet String Срок годности (в формате SMPP -- см. ниже) или 0 для срока годности, установленного SMSC по умолчанию
registered_delivery 1 Integer Запрос на подтверждение доставки от SMSC (delivery_receipt). 1 -- требуется, 0 -- не требуется
replace_if_present_flag 1 Integer Флаг, указывающий, должно ли сообщение заместить уже имеющееся с совпадающими полями source address, destination address и service_type
data_coding 1 Integer Указывает на то, каким образом представлены данные. Может принимать значения:
Bits 7 6 5 4 3 2 1 0 Meaning
0 0 0 0 0 0 0 0 SMSC Default Alphabet
0 0 0 0 0 0 0 1 IA5 (CCITT T.50)/ASCII (ANSI X3.4) (b)
0 0 0 0 0 0 1 0 Octet unspecified (8-bit binary) (b)
0 0 0 0 0 0 1 1 Latin 1 (ISO-8859-1) (b)
0 0 0 0 0 1 0 0 Octet unspecified (8-bit binary) (a)
0 0 0 0 0 1 0 1 JIS (X 0208-1990) (b)
0 0 0 0 0 1 1 0 Cyrllic (ISO-8859-5) (b)
0 0 0 0 0 1 1 1 Latin/Hebrew (ISO-8859-8) (b)
0 0 0 0 1 0 0 0 UCS2 (ISO/IEC-10646) (a)
0 0 0 0 1 0 0 1 Pictogram Encoding (b)
0 0 0 0 1 0 1 0 ISO-2022-JP (Music Codes) (b)
0 0 0 0 1 0 1 1 reserved
0 0 0 0 1 1 0 0 reserved
0 0 0 0 1 1 0 1 Extended Kanji JIS(X 0212-1990) (b)
0 0 0 0 1 1 1 0 KS C 5601 (b)
0 0 0 0 1 1 1 1 reserved
:
1 0 1 1 1 1 1 1 reserved
1 1 0 0 x x x x GSM MWI control - see [GSM 03.38] (d)
1 1 0 1 x x x x GSM MWI control - see [GSM 03.38] (d)
1 1 1 0 x x x x reserved
1 1 1 1 x x x x GSM message class control - see [GSM 03.38] (e)

Notes:
a. These coding schemes are common to GSM, TDMA and CDMA. The SMPP protocol allows ESME applications to use the same DCS value (i.e. the GSM 03.38 value) for all three technologies.
b. In cases where a Data Coding Scheme is defined for TDMA and/ or CDMA but not defined for GSM, SMPP uses GSM 03.38 reserved values.
c. There is no default setting for the data_coding parameter.
d. The data_coding parameter will evolve to specify Character code settings only. Thus the recommended way to specify GSM MWI control is by specifying the relevant settings in the optional parameters _ms_msg_wait_facilities and ms_validity.
e. The data_coding parameter will evolve to specify Character code settings only. Thus the recommended way to specify GSM message class control is by specifying the relevant setting in the optional parameter dest_addr_subunit.
sm_default_msg_id 1 Integer Указывает на "предопределенное" ("canned") сообщение, т. е. заранее сохраненное на SMSC. Может принимать значение 0-254 (0 если не используется).
sm_length 1 Integer Длина в октетах следующего поля
short_message Var 0-254 Octet String Собственно, сообщение :). Обратим внимание, что это поле расширено до 254 остетов (против 160-ти). Это связано с тем, что возможна передача сообщений в различных кодировках.

Далее в пакете могут быть необязательные параметры в TLV формате. Все они связаны с использованием дополнительных возможностей, предоставляемых SMPP и в нашем конкретном случае не надобны. Еще раз хотим обратить внимание, что в этой статье мы не собирались давать подробный перевод спецификации протокола, равно как и документов GSM. Напротив, мы хотели "спроецировать" тот необходимый минимум, который позволит создать работающее SMS-приложение. Дальнейшее его развитие -- дело ума чести и совести каждого :). Посему мы сейчас не станем детально останавливаться на описании каждого поля (там, где было возможно, мы посторались указать на наиболее употребительные значения). Позже мы приведем пример работающего кода и многое станет более понятно. На вопросы, как обычно мы отвечаем в форуме.

submit_sm_resp. command_id = 0x80000004

Тело пакета submit_sm_resp состоит из следующих полей:

Field name Size (octets) Type Description
message_id Var. max 65 C-Octet String Идентификатор сообщения, назначенный SMSC

В том случае, если поле command_status заголовка пакета не содержит нулевого значения (т. е. указывает на ошибку), тело пакета не передается. Идентификатор, назначенный SMSC используется для дальнейших операций с сообщениями, как то: запросы, удаление, замещение. Кроме того, он же будет фигурировать в delivery_receipt-е. От внимательного читателя не укрылось, что длина идентификатора в 65 октетов (символов), вообще говоря, не позволяет хранить его ни в каком из цифровых форматов. Тем не менее, на практике почти всегда это поле содержит значение, укладывающееся в 32-х битное целое (по крайней мере, другого не наблюдалось). Так что выбор формата хранения smsc_id целиком на совести разработчика ESME ибо чаще всего эти значения хранятся в поле таблицы базы данных, а поиск цифрового значения гораздо более эффективен, нежели строки.

Формат представления даты в SMPP.

В данной версии протокола все поля, связанные с датой и временем должны быть представлены в формате “YYMMDDhhmmsstnnp” где:

‘YY’ последние две цифры года  (00-99) ‘MM’ месяц  (01-12) ‘DD’ день месяца  (01-31) ‘hh’ час (00-23) ‘mm’ минута (00-59) ‘ss’ секунда (00-59) ‘t’ десятая секунды (0-9) ‘nn’ различие в четвертях часа между локальным временем и временем  UTC(Universal Time Constant) (00-48). ‘p’ =  “+”локальное время опережает UTC. ‘p’ =  “-” локальное время отстает от UTC. ‘p’ = “R” локальное время задано относительно времени SMSC.

В зависимости от значения параметра "p" (+/- или R) различают абсолютный (+/-) или относительный (R) формат даты. Абсолютный формат указывает на точно специфицированный момент времени (как показано выше), а относительный -- промежуток времени относительно текущего времени SMSC. Например, '020610233429000R' будет истолковано как 2 года, 6 месяцев, 10 дней, 23 часа, 34 минуты и 29 секунд от текущего времени SMSC.

В ответах SMSC дается его локальное время в формате “YYMMDDhhmmss”.

deliver_sm. command_id = 0x5

Формат пакета deliver_sm полностью совпадает с форматом пакета submit_sm  (в части описанных обязательных параметров), посему мы не будем здесь его еще раз повторять. Упомянем только о специфике в значениях некоторых полей:

schedule_delivery_time не используется и выставляется в 0. Поле validity_period не используется и выставляется в 0. Поле registered_delivery указывает что необходимо подтверждение ESME (ESME acknowledgement). Для отправки подтверждения ESME   должно использовать пакет submit_sm со специальным значением (см. выше) поля esm_class. Поле replace_if_present_flag не используется и выставляется в 0. Поле sm_default_msg_id не используется и выставляется в 0.

Напомним, что SMSC использует этот пакет как для доставки входящих (для ESME) сообщений так и для передачи подтверждений доставки (delivery_receipt). Тип сообщения (входящее/подтверждение) указывается, как и для submit_sm, в поле esm_class:

Bits 7 6 5 4 3 2 1 0 Meaning
Message Mode (bits 1-0)
x x x x x x x x not applicable - ignore bits 0 and 1
 
Message Type (bits 5-2)
x x 0 0 0 0 x x Default message Type (i.e. normal message)
x x 0 0 0 1 x x Short Message contains SMSC Delivery Receipt
x x 0 0 1 0 x x Short Message contains SME Delivery Acknowledgement
x x 0 0 1 1 x x reserved
x x 0 1 0 0 x x Short Message contains SME Manual/User Acknowledgment
x x 0 1 0 1 x x reserved
x x 0 1 1 0 x x Short Message contains Conversation Abort (Korean CDMA)
x x 0 1 1 1 x x reserved
x x 1 0 0 0 x x Short Message contains Intermediate Delivery Notification
all other values reserved deliver_sm_resp. command_id = 0x80000005 Формат пакета deliver_sm_resp в точности совпадает с форматом пакета submit_sm_resp с тем исключением, что поле message_id не используется и выставляется в 0.

Формат подтверждения доставки.

Как уже говорилось, для поттверждения доставки SMSC использует пакет deliver_sm со специальным (см. выше)  значением поля esm_class. Обычно оно содержит значение 0x4, но, как видно, младшие два бита могут содержать любое значение. Сама информация подтверждения содержится в поле short_message. Точное значение этого поля зависит от производителя и модели SMSC, но, в большинстве случаев, подчиняется рекомендованному формату: “id:IIIIIIIIII sub:SSS dlvrd:DDD submit date:YYMMDDhhmm done date:YYMMDDhhmm stat:DDDDDDD err:E text: . . . . . . . . .” Где:

Field name Size (octets) Type Description
id 10 C-Octet String (Decimal) Идентификатор сообщения, назначенный SMSC
sub 3 C-Octet String (Decimal) Количество посланных сообщений. Используеся, если сообщения послано нескольким получателям. Дополняется ведущими нулями
dlvrd 3 C-Octet String (Decimal) Количество доведенных сообщений. Используеся, если сообщения послано нескольким получателям. Дополняется ведущими нулями
submit date 10 C-Octet Fixed Length String Время, когда сообщение было отправлено в формате 'YYMMDDhhmm'
done date 10 C-Octet Fixed Length String Время, когда сообщение достигло финального состояния (доведено/не может быть доведено) в формате 'YYMMDDhhmm'
stat 7 C-Octet Fixed Length String Состояние. (см. ниже)
err 3 C-Octet Fixed Length String Может содержать код ошибки (если необходимо)
text 20 C-Octet String Первые 20 символов исходного сообщения.

State Stat field value  Description
DELIVERED DELIVRD Сообщение доведено получателю
EXPIRED EXPIRED Истек срок годности сообщения
DELETED DELETED Сообщение было удалено
UNDELIVERABLE UNDELIV Сообщение не может быть доведено
ACCEPTED ACCEPTD Было прочитано вручную от имени подписчика
UNKNOWN UNKNOWN Сообщение в некорректном состоянии
REJECTED REJECTD Сообщение отвергнуто
Unbind.

Команды unbind и unbind_resp имеют значения command_id 0x6 и 0x80000006 соответственно и не содержат тел (т. е. состоят из одного header'а)

Заключение

Теперь, думается, мы знаем достаточно для того, чтобы написать наше первое настоящее SMS-приложение, чем мы и займемся в следующей статье.


  • Главная
  • Новости
  • Новинки
  • Скрипты
  • Форум
  • Ссылки
  • О сайте




  • Emanual.ru – это сайт, посвящённый всем значимым событиям в IT-индустрии: новейшие разработки, уникальные методы и горячие новости! Тонны информации, полезной как для обычных пользователей, так и для самых продвинутых программистов! Интересные обсуждения на актуальные темы и огромная аудитория, которая может быть интересна широкому кругу рекламодателей. У нас вы узнаете всё о компьютерах, базах данных, операционных системах, сетях, инфраструктурах, связях и программированию на популярных языках!
     Copyright © 2001-2024
    Реклама на сайте