Перейти к основному содержимому

Руководство по эксплуатации: интеграция по протоколу SMPP 3.4

1. Описание протокола

SMPP — (Short Message Peer-to-Peer) короткие сообщения одноранговой Сети.

Протокол SMPP является открытым стандартом, который разработан, чтобы обеспечить интерфейс для передачи коротких сообщений между устройствами, приложениями, СМС-шлюзами и СМС-центрами.

В данной статье для ознакомления доступно два варианта описания протокола — на английском (оригинал) и русском (перевод) языках.

В русскоязычном варианте описания протокола SMPP можно встретить неточности перевода и неверную трактовку некоторых терминов, поэтому рекомендуем использовать только оригинальную версию на английском языке.

2. Ограничения

В рамках взаимодействия с партнерами, протокол SMPP используется по части подключения, обмена, получения, отправки сообщений и поддержания сессий.

Не предусмотрена функциональность, реализующая пакетную отправку, замену и отмену отправленных сообщений.

В данном документе представлены базовые термины, необходимые для запуска сервиса, с полным описанием можно ознакомится непосредственно в спецификации SMPP v3.4.

3. Требования по взаимодействию

ОписаниеЗначение
Версия SMPP3.4
Количество сессий по-умолчанию1
Количество сессий по-согласованиюдо 20
Режим работы подключения по-умолчаниюTransceiver
Режим работы подключения по-согласованиюTransmitter, Receiver
Интервалы между Enquire_link30 секунд
Таймаут для переподключения после потери SMPPне менее 60 секунд
data_coding для передачи символов латиницы0
data_coding для передачи символов юникод8

4. Правила сегментации сообщений

При использовании протокола SMPP для правильной сегментации многосоставных сообщений важно соблюдение следующих правил:

  • Каждый сегмент должен быть передан отдельным submit_sm
  • В каждом submit_sm многосоставных сообщений должен быть задан UDH (User Data Header) — специальный заголовок, который содержит информацию о конкатенации частей: идентификатор части (reference number), общее количество сегментов (total number of parts) и номер текущего сегмента (part's number)
  • Использование метода payload запрещено. (Payload — метод, когда весь контент многосоставного сообщения передается в одном submit_sm)

Мы выполняем проверку длины каждого сегмента. Крайне важно верно указать Message length в submit_sm, в противном случае сообщение может быть отклонено и не доставлено до получателя.

Ниже приведена информация по размерности сообщений в зависимости от используемой кодировки.

encodingsdata_codingКоличество символов для сегмента односоставного сообщенияКоличество символов для сегмента многосоставного сообщения
7-bit (ASCII, GSM7bit)0x00160153
8-bit (Binary, Latin-1)0x03140134
16-bit (Unicode/UCS-2)0x087067

При выборе data_coding используйте следующие значения:

  • 0x00 (ASCII, GSM)
  • 0x03 (Latin-1)
  • 0x08 (Unicode/UCS-2)

Любые другие варианты будут интерпретироваться как бинарные сообщения.

Следует обратить особое внимание на использование символов "^", "{", "}", "\\", "[",  "~", "]", "|", "" (далее спецсимволы, всего 9 таких символов), которые при передаче в сигнальную сеть оператора кодируются в 2 байта, фактически используют место 2 (двух) обычных символов. При формировании submit_sm необходимо считать каждый такой спецсимвол за два обычных символа.

5. Установка соединения (BIND)

Для установки соединения необходимо послать BIND_TRANSCEIVER (или BIND_TRANSMITTER, или BIND_RECEIVER), в команде должны быть следующие поля:

ПараметрОписаниеПример
system_idИдентификатор подключения. Допустимые символы 0...9a...zA...Z_ Максимальная длина 16 символовclient_1
passwordПароль, максимальная длина 9 символовyh5rC23K
system_typeТип подключения. Необходимо оставить пустым

Ответ будет передан командой BIND_TRANSCEIVER_RESP (или BIND_TRANSMITTER_RESP, или BIND_RECEIVER_RESP), в поле command_status будет передано одно из значений из справочника.

6. Разрыв соединения (UNBIND)

При необходимости разорвать подключение необходимо послать команду UNBIND, в ответ будет передана команда UNBIND_RESP и закрыто TCP-соединение.

Как клиент, так и сервер (платформа SevenTech) должны регулярно проверять связность между собой посылом команды ENQUIRE_LINK.

Интервал посыла команды ENQUIRE_LINK должен находится в промежутке от 30 до 180 секунд.

Каждая из сторон при получении ENQUIRE_LINK должна ответить ENQUIRE_LINK_RESP в течение 30 секунд.

СобытиеДействие
Клиент не получил ENQUIRE_LINK_RESP от сервераПослать команду UNBIND, получить UNBIND_RESP, после чего, не разрывая TCP-соединение, выждав 60 секунд, установить соединение, послав команду BIND. Если результат не получен, закрыть TCP-соединение и выполнить подключения заново.
Клиент не вернул ENQUIRE_LINK_RESP серверуСервер закрывает соединение с клиентом. Клиент восстанавливает соединение самостоятельно.

8. Отправка сообщений (SUBMIT_SM)

Для отправки сообщений абоненту необходимо выполнить команду SUBMIT_SM, используемые параметры:

ПараметрОписание
source_addrИмя отправителя. Сообщение абоненту будет отправлено с номера, указанного в данном параметре. Допустимая длина 2-11 символов. Допустимые символы: 0...9a...zA...Z!@#$%^&*()/';:,+-_ и пробел.
destination_addrНомер абонента в международном формате. Пример 79031234567
esm_classРежим работы и тип сообщения
data_codingТип кодирования сообщения. Рекомендуем использовать 0 для латинских сообщений и 8 для передачи символов юникода.
registered_deliveryФлаг для запроса отчета о статусе доставки. 0 — отчет не нужен, 1 — передать отчет

9. Получение отчетов о доставке (DELIVER_SM)

Отчет о статусе доставки будет передан в пакете DELIVER_SM, в ответ партнер должен передать команду DELIVER_SM_RESP с указанием command_status равном 0, любой другой статус либо задержка в ответе более 30 секунд приведет к повторной отправке DELIVER_SM.

Отчет о доставке будет сформирован только на сообщение, при иницииации которого в пакете SUBMIT_SM был указан запрос на получения статуса (registered_delivery=1).

Используемые параметры DELIVER_SM:

ПараметрОписание
source_addrНомер абонента в международном формате
destination_addrСервисный номер
esm_classРежим работы и тип сообщения. Будет использован x x 0 0 0 1 x x

Используемые TLV-параметры DELIVER_SM:

ПараметрКод TLVТип данныхРазмер (октетов)Описание
receipted_message_id0x001EOctet String1-65Идентификатор сообщения
message_state0x0427Integer1Статус доставки сообщения абоненту. Значения из справочника
network_error_code0x0423Integer3Расширенный код ошибки. Значения из справочника
message_type0x1440Octet String3, 4 или 6Тип сообщения. В случае использования каскада, целевое сообщение может быть доставлено абоненту по каналу, отличного от исходного. Примеры: VIBER, VK, SMS (оканчивается 0x00 байтом)

10. Коды ошибок

10.1 BIND_RESP

КодЗначениеОписание
0x00000000ESME_ROKПодключение установлено
0x0000000DESME_RBINDFAILСоединение не установлено, необходимо повторить попытку
0x00000005ESME_RALYBNDПодключение уже установлено
0x0000000FESME_RINVSYSIDНеверный system_id
0x0000000EESME_RINVPASWDНеверный password

10.2 SUBMIT_SM_RESP

КодЗначениеОписание
0x00000000STATUS_OKСообщение принято
0x00000001STATUS_INVMSGLENНеверная длина сообщения
0x00000003STATUS_INVCMDIDПередан неверный набор TLV-параметров
0x00000008STATUS_SYSERRСистемная ошибка
0x0000000ASTATUS_INVSRCADRЗапрещена отправка от данного имени отправителя
0x0000000BSTATUS_INVDSTADRЗапрещена отправка сообщений на данный номер
0x00000058STATUS_THROTTLEDПревышение установленной для подключения скорости
0x00000104ESME_RINVDCSВыбранная Data coding не поддерживается

10.3 DELIVER_SM_RESP

10.3.1 Стандартные коды ошибок

КодЗначениеОписание
2DELIVEREDСообщение успешно доставлено
3EXPIREDВремя жизни сообщения истекло
5UNDELIVEREDСообщение не может быть доставлено
8REJECTEDСообщение отклонено

10.3.2 Расширенные коды ошибок

КодЗначениеОписание
0no_extra_statusВ случае успешной доставки
1unknownНеизвестная причина недоставки сообщения
6absent-subscriberАбонент недоступен. Например, из-за уровня сигнала, выключения телефона
8unknown-subscriberНомер телефона не существует (или не обслуживается, не распознан оператором, абонент не зарегистрирован в сети оператора и т.п.)
11sms-unavailableСервис коротких сообщений не предоставляется. Например, услуга СМС не подключена или временно заблокирована
12subscriber-errorОшибка в телефоне абонента
13call-barredУ абонента включен запрет на прием сообщений или абонент временно заблокирован оператором (например, в связи с отрицательным балансом)
245timeoutВремя ожидания статуса доставки истекло
252filter-destination_addrЗаблокировано спам-фильтром: запрещена отправка SMS на данный номер телефона.
253filter-messageЗаблокировано спам-фильтром: текст сообщения содержит запрещенные слова.
254filter-source_addrЗаблокировано спам-фильтром: запрещена отправка SMS с данного короткого номера.
255failureВнутренняя ошибка оператора. Например, ошибка маршрутизации, ошибка коммутатора (внутренняя ошибка передачи данных) и т.п.
500Абонент заблокировал имя отправителя (для мессенджеров)
501У абонента отсутствует приложение для получения сообщения (для мессенджеров)