SMPP (Short Message Peer-to-Peer) — протокол связи для отправки и получения коротких сообщений в пиринговых сетях. SMPP-протокол обеспечивает постоянное подключение, соединение с SMS-сервером не разрывается, что дает возможность рассылать и получать SMS с высокой скоростью (выше чем, при других способах, например через SMS REST API).
Exolve предоставляет учётные данные пользователям для подключения к SMPP-протоколу. Информацию о том, где найти данные для подключения, процесс подключения, как отправить и принять SMS, вы можете найти в следующих статьях:
- Глоссарий - список терминов, используемых в статьях;
- Параметры подключения - инструкция, где найти параметры подключения к SMPP-протоколу в Личном кабинете;
- Подключение - описание процесса подключения к SMPP-протоколу;
- Получение входящих SMS - как принимать входящие SMS через SMPP;
- Требования для отправки сообщения - требования к SMS для отправки через SMPP-протокол.
Решения, где используется SMS SMPP

SMS-рассылки

SMS-шлюз

Рекламные SMS-рассылки
Глоссарий
В статьях раздела SMS SMPP мы будем использовать следующие термины:
ESME (External Short Messaging Entity) — внешняя служба коротких сообщений. Это внешнее приложение, которое подключается к Центру обслуживания коротких сообщений (SMSC) для отправки или получения SMS-сообщений,
PDU (Protocol Data Unit) — пакет данных протокола. SMPP-протокол основан на обмене пар запрос-ответ PDU на 4м уровне OSI (TCP сессии или X25 SVC3),
SMSC (Short Message Service Center) — центр обслуживания коротких сообщений. Отвечает за хранение, передачу, конвертацию и доставку SMS-сообщений,
TLV (Tag-Length-Value) — формат представления данных, используется для передачи дополнительных параметров, настроек и метаданных в сообщениях. Обеспечивает гибкость и расширяемость передачи разнообразной информации в SMS. Каждый объект состоит из трех полей:
- Tag (метка) указывает на тип данных или параметра (обязательно)
- Length (длина) обозначает длину значения данных в байтах (обязательно)
- Value (значение) представляет собой фактические данные или параметры, связанные с этой меткой (опционально)
UDH (User Data Header) — заголовок пользовательских данных. Это двоичная последовательность, которая может присутствовать в начале SMS-сообщения, чтобы указать, как должно обрабатываться сообщение.
Параметры подключения
Вы можете отправлять/получать SMS-сообщения через SMPP-протокол, и получать информацию о статусе отправки/получения, используя систему Exolve.
Exolve поддерживает версию SMPP-протокола 3.4.
| Параметр | Описание/Значение |
|---|---|
| system_id | логин для подключения |
| password | пароль для подключения |
| адрес | smpp.exolve.ru |
| порт | 2775 |
Логин и пароль для подключения вы можете найти в Личном кабинете разработчика:
- Перейдите во вкладку “Приложения” в верхнем меню аккаунта.
- Нажмите на приложение, данные SMPP-аккаунта которого хотите посмотреть.
- Выберите вкладу “Сообщения” → “SMPP-аккаунт” в левом меню.
На открывшейся странице вы увидите логин, пароль и домен для подключения.
Подключение
Поддерживаемые команды
| Команда | Описание | Комментарий |
|---|---|---|
| bind_transceiver | подключение ESME к SMSC в режиме передачи сообщений | режим TRX позволяет отправлять SMS от ESME к SMSC и принимать входящие SMS и отчеты о доставке от SMSC к ESME |
| bind_receiver (получатель) | подключение ESME к SMSC в режиме приема сообщений | используйте эту команду только для приема сообщений от SMSC к ESME |
| enquire_link | проверка соединения с SMSC | для поддержки соединения выполняйте эту команду с периодичностью менее 15 сек, иначе соединение с ESME будет разорвано и уведомления о доставке перестанут приходить |
| submit_sm | отправка сообщения | используйте эту команду для отправки сообщения |
| deliver_sm | отчет о доставке/отправка входящего сообщения | |
| unbind | отключение от SMSC | используйте эту команду для отключения ESME от SMSC |
Подключение
При запуске сессии командой bind_transceiver или bind_receiver установите в PDU следующие параметры:
| Параметр | Описание/Значение |
|---|---|
| system_id | логин для подключения |
| password | пароль для подключения |
Подробнее о команде bind_* вы можете прочитать в спецификации SMPP-протокола 3.4 в разделе 4.1 (стр 45).
Статус подключения
При попытке подключения отправляется ответ о статусе подключения в PDU bind_transceiver_resp или bind_receiver_resp, в зависимости от режима подключения. Статус подключения будет передан в поле command_status.
Ответ при успешном подключении
| PDU | Hex значение command_status | Decimal значение command_status | Описание |
|---|---|---|---|
| bind_transceiver_resp | 0x00000000 | 0 | ошибок при подключении в режиме приема и передачи сообщений нет |
| bind_receiver_resp | 0x00000000 | 0 | ошибок при подключении в режиме приема сообщений нет |
Ответ при неуспешном подключении
| PDU | Hex значение command_status | Decimal значение command_status | Описание |
|---|---|---|---|
| bind_transceiver_resp | 0x0000000d | 13 | подключение в режиме приема и передачи сообщений не удалось |
| bind_receiver_resp | 0x0000000d | 13 | подключении в режиме приема сообщений не удалось |
Все статусы неудачных подключений вы можете найти в спецификации SMPP-протокола 3.4 в разделе 5.1.3 (стр 112).
Отправка сообщений
После установки соединения и аутентификации вы можете отправлять сообщения на SMPP-сервер.
При отправке сообщения командой submit_sm установите в PDU следующие параметры:
| Команда | Описание/Значение |
|---|---|
| source_addr | номер отправителя |
| destination_addr | номер получателя |
| short_message/payload | текст сообщения |
| registered_delivery | индикатор запроса уведомлений. Установите значение “1”, если вам необходимо получать уведомления о доставке в SMSC |
| data_coding | кодировка текста (0x00 - GSM7; 0x08 - UCS2) |
Подробнее о команде submit_sm и дополнительных параметрах вы можете прочитать в спецификации SMPP-протокола 3.4 в разделе 4.4 (стр 58).
Способы передачи текста сообщения
SMPP-сервер поддерживает два способа передачи сообщений: “short_message” и “payload”. Используйте только один из этих параметров при отправке сообщения. Требования по отправке сообщений через каждый параметр вы можете найти в статье “Требования к отправке сообщения”.
Отправка шаблонных сообщений
По SMPP можно отправить персонализированные сервисные, авторизационные или транзакционные SMS от имени отправителя. Для этого зарегистрируйте имя и шаблонный текст сообщения у нужных операторов. Подробнее о шаблонах можно узнать в этой статье.
Для отправки шаблонированного SMS не нужно указывать идентификатор шаблона. Подходящий шаблон будет найден и использован во время отправки при условии согласования операторами и соответствия текста SMS шаблону.
Отчет о доставке сообщения
Отчет о доставке запрашивается установкой registered_delivery=1 в команде submit_sm. Если параметр не установлен, отчет о доставке не гарантируется.
При запросе отчет отправляется в PDU “deliver_sm” в подключении transceiver или receiver. Отчет о доставке сообщения будет иметь поле esm_class со значением 0x04 (Hex).
На каждый полученный от SMSC PDU deliver_sm ESME должно отправить подтверждение о получении deliver_sm_resp со статусом 0 (OK).
В поле short_message будет передана информация отчета, со следующими полями:
| Параметр | Описание/Значение |
|---|---|
| id | message_id, полученный в ответе submit_sm_resp. Для составного сообщения сегменты имеют связанные идентификаторы: базовый ID для первого сегмента и суффиксы _2, _3 и т.д. для следующих |
| sub | количество отправленных сегментов сообщений |
| dlvrd | количество успешно доставленных сообщений |
| submit date | дата и время запроса на отправку сообщения |
| done date | дата и время отправки сообщения |
| stat | код состояния доставки. Описание кодов вы можете найти в спецификации SMPP-протокола 3.4 в разделе Appendix B (стр 168) |
| err | код ошибки, если доставка не удалась |
| text | необязательный параметр, может быть пустым |
Пример отчета о доставке
{
"esm_class":4,
"short_message":
{
"message": "id:456846948280827906 sub:001 dlvrd:001 submit date:2304181526 done date:2304181526 stat:DELIVRD err:0 text:Hello! How"
}
}
Ошибки отправки сообщения
Если сообщение не отправилось, SMSC может передать код ответа в PDU submit_sm_resp или в PDU deliver_sm в виде отчёта о доставке. Даже если сообщение принято к отправке, доставка SMS не гарантирована.
Типичные коды ошибок в submit_sm_resp
Коды ошибок передаются в поле command_status.
| Код | Hex значение | Decimal значение | Описание |
|---|---|---|---|
| ESME_ROK | 0x00000000 | 0 | сообщение принято шлюзом |
| ESME_RINVMSGLEN | 0x00000001 | 1 | превышена длинна сообщения |
| ESME_RINVSRCADR | 0x0000000A | 10 | ошибка в номере, с которого отправляется сообщение |
| ESME_RINVDSTADR | 0x0000000B | 11 | ошибка в номере, на который отправляется сообщение |
| ESME_RSUBMITFAIL | 0x00000045 | 69 | техническая ошибка |
Больше статусов неудачных отправок сообщений вы можете найти в спецификации SMPP-протокола 3.4 в разделе 5.1.3 (стр 112).
Коды ошибок в отчетах о доставке deliver_sm
Коды ошибок передаются в short_message в поле err.
| Код ошибки | Описание/Значение |
|---|---|
| 0 | сообщение доставлено успешно |
| 301 | ошибка при резервации |
| 401 | недостаточно средств на счету |
| 501 | ошибка отправки сообщения |
| 601 | ошибка при оплате |
| 701 | ошибка доставки |
Получение входящих SMS
Вы можете получать входящие SMS на номера вашего приложения через SMPP. Сообщения поступают от сервера Exolve в ваше приложение командой deliver_sm.
Подключение для получения сообщений
Для приема SMS используйте SMPP-реквизиты приложения, которому принадлежит принимающий номер.
Установите соединение с smpp.exolve.ru на порту 2775 и выберите режим подключения:
| Команда | Режим работы |
|---|---|
bind_receiver | Прием входящих SMS |
bind_transceiver | Отправка SMS, прием входящих SMS и отчетов о доставке |
Передайте логин в поле system_id, пароль в поле password. Успешное подключение подтверждается ответом bind_receiver_resp или bind_transceiver_resp с command_status=0.
Для получения входящих SMS вам не нужно отправлять submit_sm или устанавливать registered_delivery=1. Параметр registered_delivery используется для запроса отчетов о доставке исходящих SMS.
Рекомендуем использовать одно принимающее SMPP-подключение на приложение. Входящие сообщения не рассылаются во все подключения приложения.
Формат входящего сообщения
При получении SMS сервер отправляет PDU deliver_sm со следующими параметрами:
| Параметр | Описание |
|---|---|
source_addr | Номер или имя отправителя |
destination_addr | Номер вашего приложения, на который поступило SMS |
short_message | Байты текста сообщения. Для составного SMS в начале поля передается UDH |
data_coding | Кодировка: 0x00 — GSM7, 0x08 — UCS2 |
esm_class | Тип сообщения и признак наличия UDH |
sequence_number | Номер PDU. Используйте его в ответе deliver_sm_resp |
Декодируйте текст в соответствии с data_coding. Для UCS2 используйте порядок байтов Big Endian.
Пример короткого входящего SMS
Ниже показаны значимые поля deliver_sm для сообщения «Hello». Номера приведены для примера.
{
"command": "deliver_sm",
"sequence_number": 101,
"source_addr": "79990000001",
"destination_addr": "79990000002",
"esm_class": "0x00",
"data_coding": "0x00",
"short_message": "48 65 6C 6C 6F"
}
Значение short_message в примере записано в шестнадцатеричном виде. После декодирования GSM7 вы получите текст Hello.
Как отличить входящее SMS от отчета о доставке
Входящие SMS и отчеты о доставке передаются одной командой deliver_sm. Чтобы определить тип полученного сообщения, проверяйте поле esm_class:
| Значение | Содержимое PDU |
|---|---|
0x00 | Обычное входящее SMS |
0x40 | Сегмент входящего SMS с заголовком UDH |
0x04 | Отчет о доставке исходящего SMS |
В обработчике проверяйте биты поля esm_class:
{
"delivery_receipt": "(esm_class & 0x3C) == 0x04",
"udh_present": "(esm_class & 0x40) != 0"
}
Если вы получили отчет о доставке, обрабатывайте его по правилам раздела «Отчет о доставке сообщения». Поле id отчета позволяет связать его с message_id, полученным в ответе submit_sm_resp.
Получение длинного сообщения
Длинное входящее SMS поступает несколькими PDU deliver_sm. Каждый PDU содержит один сегмент сообщения. Сервер устанавливает признак UDH в esm_class и добавляет заголовок в начало поля short_message.
| Кодировка | Одиночное SMS | Сегмент составного SMS |
|---|---|---|
| GSM7 | До 160 единиц кодирования | До 153 единиц кодирования |
| UCS2 | До 70 кодовых единиц | До 67 кодовых единиц |
Большинство символов GSM7 занимают одну единицу кодирования. Символы расширенной таблицы, например ^, {, } и €, занимают две. Одна буква кириллицы в UCS2 занимает одну кодовую единицу, то есть два байта.
Для входящих составных SMS используется UDH с 8-битным идентификатором:
{
"udh": "05 00 03 RR NN SS"
}
| Байты | Значение |
|---|---|
05 | Длина заголовка после первого байта |
00 03 | Признак объединения сегментов с 8-битным идентификатором и длина этих данных |
RR | Общий идентификатор составного сообщения |
NN | Общее количество сегментов |
SS | Номер текущего сегмента, начиная с 1 |
Пример сообщения из двух сегментов
Сообщение из 80 букв «А» передается в UCS2 двумя сегментами: 67 букв в первом и 13 во втором.
| Параметр | Первый сегмент | Второй сегмент |
|---|---|---|
esm_class | 0x40 | 0x40 |
data_coding | 0x08 | 0x08 |
UDH в начале short_message | 05 00 03 2A 02 01 | 05 00 03 2A 02 02 |
| Текст после UDH | 67 букв «А» | 13 букв «А» |
В этом примере 2A — общий идентификатор сообщения. Каждая буква «А» представлена байтами 04 10. Заголовок UDH и байты текста находятся в одном поле short_message.
Чтобы восстановить сообщение:
- Прочитайте UDH и определите общий идентификатор, количество и номера сегментов.
- Исключите UDH из текстовых данных каждого сегмента.
- Декодируйте оставшиеся байты по значению
data_coding. - Объедините текст сегментов в порядке их номеров.
При объединении учитывайте отправителя, получателя и идентификатор из UDH. Идентификатор может повторяться у разных сообщений, поэтому не используйте его как единственный постоянный ключ. sequence_number служит для подтверждения отдельного PDU, а не для объединения сегментов.
Подтверждение получения
На каждый успешно принятый deliver_sm отправляйте deliver_sm_resp с command_status=0 и тем же sequence_number.
Например, для входящего PDU с sequence_number=101 отправьте:
{
"command": "deliver_sm_resp",
"sequence_number": 101,
"command_status": "0x00000000"
}
Подтверждайте каждый сегмент длинного SMS отдельно, не дожидаясь сборки всего сообщения. Также подтверждайте получение отчетов о доставке.
Поддержание соединения
Для получения входящих сообщений поддерживайте активную SMPP-сессию. Используйте enquire_link для проверки соединения и обрабатывайте ответ enquire_link_resp.
После разрыва восстановите TCP-соединение и повторно выполните bind_receiver или bind_transceiver. Для завершения работы отправьте unbind.
Получение SMS, поступивших во время отсутствия принимающей сессии, и автоматическая повторная доставка не гарантируются.
Требования для отправки сообщения
Общие требования
- Протокол взаимодействия с SMSC — SMPP-протокол 3.4.
- Максимальное количество сегментов в одном сообщении — 10.
- Для обмена сообщениями между ESME и SMSC могут использоваться следующие типы подключения:
receiver,transceiver— в зависимости от направления трафика. Подключениеtransmitterпока недоступно. - При отправке сообщения обязательно нужно передавать параметр
data_coding, с помощью которого вы указываете в какой кодировке было передано сообщение. Поддерживаемые кодировки:GSM7,UCS2. Рекомендуется использоватьGSM7для латинского алфавита иUCS2, если в сообщении содержится кириллица. - ESME должно отправлять PDU
enquire_linkкаждые 15 секунд вне зависимости от наличия или отсутствия трафика в SMPP-соединении. Если в течение 15 секунд не было отправлено ни одного сообщения со стороны пользователя или ESME (в том числе enquire_link), то соединение будет разорвано. - Чтобы отслеживать правильность взаимодействия SMSC и ESME по протоколам
TCPиSMPP, мы рекомендуем использовать протокольный анализатор — Wireshark.
Если возникнут проблемы в работе сервиса, просим вас провести анализ SMPP-трафика с нашим сервером и сгенерировать с помощью Wireshark файл с расширением pcap, описать проблему и отправить в техническую поддержку Exolve сгенерированный файл.
Требования для отправки сообщения через short_message
- Для отправки сообщения через “short_message” установите в PDU текст сообщение в поле “short_message”. Убедитесь, что текст сообщения представлен в одной из кодировок:
GSM7,UCS2. - Сообщение более чем из одного сегмента должно содержать UDH (User Data Header), чтобы абонентский терминал получателя корректно соединил части сообщения.
- В одной части составного сообщения можно передавать не более 67 символов в кириллице и 153 в латинице.
- Если SMSC получает от ESME составное сообщение, то отправляет ответ в PDU
submit_sm_respкаждый раз, когда получает часть сообщения. При этомmessage_idбудет строиться следующем образом:
- Сегмент 1: 452777198852505602,
- Сегмент 2: 452777198852505602_2,
- Сегмент 3: 452777198852505602_3
Требования для отправки сообщения через payload
- Для отправки сообщения через параметр “payload” установите в PDU текст сообщение в поле “payload”.
- Вам не нужно разделять текст на сегменты при отправке сообщения через параметр “payload”, но важно учитывать, чтобы общая длина текста не превышала 10 сегментов.
- При отправке сообщения через параметр “payload” убедитесь, чтобы поле “short_message” было пустое, иначе текст будет браться из этого поля “short_message”.
Решения, где используется SMS SMPP

SMS-рассылки на <<Билайн>>

SMS-рассылки на <<Теле2>>
