Обзор.
Протокол SMPP позволяет , как не трудно догадаться, "внешним" устройствам обмениваться сообщениями с мобильной сетью (PLMN) посредством SMSC и определяет:
Таким образом, вызову команды соответствует отправка PDU, поэтому мы иногда вместо "вызвать submit_sm" будем говорить "послать submit_sm" и наоборот. Следует также обратить внимание на то, что каждая из команд в рамках сессии должна быть подтверждена ответным пакетом (ACK), единственное исключение -- alert_notification PDU (впрочем, эта команда нам на первых порах не понадобится).
Сессии SMPP.
Обмен сообщениями с SMSC в формате протокола SMPP (кстати говоря -- не только) носит сессионный характер. Это означает, что обмен должен предваряться некоторой процедурой инициализации сессии и, в безошибочном варианте, за обменом должна следовать процедура закрытия сессии. В ходе процедуры открытия сессии ESME открывает соединение на уровне сокета, авторизуется и сообщает о цели открытия сессии:
Процедура инициализации выполняется с помощью вызова одной из команд bind_*:
формат которых мы рассмотрим чуть ниже. Таким образом, сессия может находиться в следующих состояниях:
Кроме того, SMSC в любой момент может послать команду outbind. В ответ на эту команду ESME обязана снова выполнить один из запросов bind_*. Правда, в реальной практике эта команда встречается редко, но к ее обработке следует быть готовым.
Команды (PDU) SMPP
Протокол SMPP версии 3.4 предоставляет следующий набор команд:
SMPP PDU Name |
Required SMPP Session State |
Issued by ESME |
Issued by SMSC |
bind_transmitter |
OPEN |
Yes |
No |
bind_transmitter_resp |
OPEN |
No |
Yes |
bind_receiver |
OPEN |
Yes |
No |
bind_receiver_resp |
OPEN |
No |
Yes |
bind_transceiver |
OPEN |
Yes |
No |
bind_transceiver_resp |
OPEN |
No |
Yes |
outbind |
OPEN |
No |
Yes |
unbind |
BOUND_TX |
Yes |
Yes |
unbind_resp |
BOUND_TX |
Yes |
Yes |
submit_sm |
BOUND_TX |
Yes |
No |
submit_sm_resp |
BOUND_TX |
No |
Yes |
submit_sm_multi |
BOUND_TX |
Yes |
No |
submit_sm_multi_resp |
BOUND_TX |
No |
Yes |
data_sm |
BOUND_TX |
Yes |
Yes |
data_sm_resp |
BOUND_TX |
Yes |
Yes |
deliver_sm |
BOUND_RX |
No |
Yes |
deliver_sm_resp |
BOUND_RX |
Yes |
No |
query_sm |
BOUND_TX |
Yes |
No |
query_sm_resp |
BOUND_TX |
No |
Yes |
Команды с суффиксом _resp означают responce, т. е. ACK (мы также употребляем термин квитанция, и говорим, что ACK "квитирует" команду). Жирным помечены команды, которые мы рассмотрим (остальные в нашем простейшем случае нам пока не понадобятся).
Режимы (Modes) сообщений.
Протокол SMPP v3.4 поддерживает три режима обмена сообщениями. Мы не будем на этом особо останавливаться, просто упомянем, что в дальнейшем будем работать в т. н. Store and Forward Message Mode. В данном режиме сообщение сначала сохраняется в базе данных SMSC, а потом предпринимаются попытки его доведения, и, в зависимости от запроса, ESME уведомляется о достижении сообщением финального состояния (доведено/не доведено). Поддерживаются также Datagram Mode и Transaction Mode, о которых можно прочесть в соответствующей документации.
Типы данных SMPP
Все определяемые протоколом PDU представляют собой совокупность полей определенных типов, выстроенные друг за другом в определенном порядке. При работе в сети принято использовать понятие октет (octet) -- совокупность восьми битов (то что принято называть в программировании байтом) для того, чтобы подчеркнуть "восьмибитовость". Все определяемые SMPP типы привязаны к октету. Вот они:
Формат PDU
Каждый пакет (PDU) состоит из двух частей:
Формат заголовка общий для всех PDU.
Заголовок (header)
Заголовок имеет длину 16 октетов и состоит из 4-х полей:
Некоторые PDU (в частности, большинство ACK'ов) состоят только из заголовка и этой информации оказывается достаточно.