# SMPP submit_sm: все обязательные поля

> submit_sm (command_id 0x00000004) отправляет сообщение на абонента (mobile-terminated) от ESME к SMSC. Его тело — фиксированная последовательность обязательных полей: адресация (TON/NPI + адрес), esm_class, protocol_id, priority_flag, планирование, registered_delivery, data_coding, sm_length и short_message — за которыми могут идти TLV. submit_sm_resp возвращает message_id, присвоенный SMSC.

- Канонический URL: https://www.broadnet.me/ru/reference/smpp-submit-sm
- Язык: ru
- Последнее обновление: 2026-07-18
- Издатель: BroadNet (https://www.broadnet.me)

Полный справочник по полям submit_sm — service_type, TON/NPI, esm_class, data_coding, registered_delivery, validity_period, short_message и остальные — с указанием действительно важных значений.

## Полный порядок обязательных полей

Тело submit_sm — это фиксированная упорядоченная последовательность; тегов полей нет, поэтому порядок и размер имеют решающее значение. В таблице перечислены все обязательные параметры в порядке передачи. short_message может быть пустым, когда текст передаётся в TLV message_payload; не заполняйте оба поля одновременно.

*Обязательные параметры submit_sm (в порядке передачи)*

| # | Поле | Тип | Примечания |
|---|---|---|---|
| 1 | service_type | C-Octet String (6) | Категория услуги; обычно пусто |
| 2 | source_addr_ton | Integer (1) | Тип номера отправителя |
| 3 | source_addr_npi | Integer (1) | План нумерации отправителя |
| 4 | source_addr | C-Octet String (21) | Адрес отправителя / буквенно-цифровой идентификатор |
| 5 | dest_addr_ton | Integer (1) | Тип номера получателя |
| 6 | dest_addr_npi | Integer (1) | План нумерации получателя |
| 7 | destination_addr | C-Octet String (21) | MSISDN получателя |
| 8 | esm_class | Integer (1) | Режим сообщения + тип + флаг UDHI |
| 9 | protocol_id | Integer (1) | GSM TP-PID; обычно 0 |
| 10 | priority_flag | Integer (1) | 0 (норма) – 3 (максимум) |
| 11 | schedule_delivery_time | C-Octet String (1\|17) | Пусто = немедленно |
| 12 | validity_period | C-Octet String (1\|17) | Пусто = значение по умолчанию SMSC |
| 13 | registered_delivery | Integer (1) | Запросить отчёт о доставке |
| 14 | replace_if_present_flag | Integer (1) | 0 = нет, 1 = заменить |
| 15 | data_coding | Integer (1) | Кодировка / DCS |
| 16 | sm_default_msg_id | Integer (1) | Идентификатор шаблонного сообщения; обычно 0 |
| 17 | sm_length | Integer (1) | Длина short_message (0–254) |
| 18 | short_message | Octet String (0–254) | Полезная нагрузка сообщения |

## Адресация: TON и NPI

source_addr и destination_addr несут тип номера (TON) и индикатор плана нумерации (NPI). Для международного MSISDN используйте TON 1 (International) с NPI 1 (ISDN/E.164). Для буквенно-цифрового идентификатора отправителя используйте TON 5 (Alphanumeric) — тогда source_addr содержит до 11 символов GSM-7. Неверные TON/NPI — одна из главных причин недоставленного или неправильно маршрутизированного трафика.

*Распространённые значения TON и NPI*

| TON | Значение | NPI | Значение |
|---|---|---|---|
| 0 | Неизвестно | 0 | Неизвестно |
| 1 | Международный | 1 | ISDN (E.163/E.164) |
| 2 | Национальный | 3 | Данные (X.121) |
| 3 | Зависит от сети | 4 | Телекс (F.69) |
| 4 | Номер абонента | 6 | Мобильная связь (E.212) |
| 5 | Буквенно-цифровой | 8 | Национальный |
| 6 | Сокращенный | 9 | Частный |

## esm_class

esm_class — это битовое поле, задающее режим обмена сообщениями, тип сообщения и специфичные для GSM функции. Самый важный бит для отправителей — UDHI (0x40): устанавливайте его, когда short_message начинается с User Data Header, например с заголовка конкатенации. Бит 0x80 запрашивает путь ответа GSM.

*Значения битов esm_class (выборка)*

| Биты | Поле | Значение → смысл |
|---|---|---|
| 1–0 | Режим передачи сообщений | 0 по умолчанию · 1 датаграмма · 2 пересылка · 3 сохранение и пересылка |
| 5–2 | Тип сообщения | 0 по умолчанию · 0x04 отчёт о доставке · 0x08 подтверждение доставки (delivery ack) · 0x10 подтверждение пользователя |
| 6 | UDHI | 0x40 = short_message begins with a UDH |
| 7 | Путь ответа | 0x80 = set GSM reply path |

## data_coding, registered_delivery и validity

data_coding выбирает кодировку текста: 0x00 = значение по умолчанию SMSC (обычно GSM 7-bit), 0x04 = 8-битный двоичный формат, 0x08 = UCS-2 для Unicode. Младшие два бита registered_delivery управляют отчётами: 0 = нет, 1 = отчёт при окончательной доставке или сбое, 2 = только при сбое. validity_period и schedule_delivery_time используют абсолютный формат YYMMDDhhmmsstnnp либо относительный; пустая строка означает немедленную доставку и период действия по умолчанию SMSC. Для OTP держите validity_period коротким, чтобы задержанный код истёк, а не пришёл устаревшим.

*data_coding — реально используемые значения*

| Значение | Кодировка |
|---|---|
| 0x00 | Алфавит по умолчанию SMSC (обычно 7-битный GSM) |
| 0x03 | Latin-1 (ISO-8859-1) |
| 0x04 | 8-битные двоичные данные (октеты без спецификации) |
| 0x08 | UCS-2 (UTF-16BE) — Unicode |

## Ответ

submit_sm_resp (0x80000004) возвращает command_status и, при успехе, message_id (C-Octet String, до 65 символов), который SMSC присваивает сообщению. Сохраняйте его: это ключ для сопоставления с receipted_message_id в отчёте о доставке. Остерегайтесь расхождений формата — некоторые SMSC возвращают идентификатор в шестнадцатеричном виде при отправке и в десятичном в DLR, поэтому нормализуйте оба при корреляции.

## Частые вопросы

### Какие TON/NPI использовать для буквенно-цифрового идентификатора отправителя?

Используйте source_addr_ton = 5 (Alphanumeric) и source_addr_npi = 0 (Unknown). Тогда source_addr содержит до 11 символов GSM-7. Буквенно-цифровые идентификаторы отправителя предназначены только для отображения и не могут принимать ответы.

### Как запросить отчёт о доставке в submit_sm?

Установите registered_delivery = 1, чтобы получить отчёт при окончательной доставке или сбое, либо 2 только при сбое. Запрашивайте отчёты только там, где вы их действительно обрабатываете, поскольку непрочитанные DLR расходуют пропускную способность.

### Какова максимальная длина short_message?

Поле short_message вмещает до 254 октетов, а sm_length задаёт точное число. Для более длинного текста либо сегментируйте с UDH в нескольких PDU submit_sm, либо передавайте всю полезную нагрузку в TLV message_payload вместо short_message.

### Можно ли задать и short_message, и message_payload?

Нет. Заполняйте одно из двух. Провайдеры отклоняют submit_sm, где сообщение передано и в обязательном поле short_message, и в TLV message_payload.

### Как отправить сообщение в Unicode?

Установите data_coding = 0x08 (UCS-2) и закодируйте текст как UTF-16 в обратном порядке байтов в short_message. Одно SMS в UCS-2 вмещает 70 символов; более длинный текст в Unicode сегментируется по 67 символов на часть.

## Источники

- [SMPP v3.4 specification — §4.4 submit_sm](https://smpp.org/SMPP_v3_4_Issue1_2.pdf)
- [3GPP TS 23.040 — SMS technical realization](https://www.3gpp.org/dynareport/23040.htm)

## См. также

- [SMPP deliver_sm и сообщения MO](https://www.broadnet.me/ru/reference/smpp-deliver-sm)
- [Схема кодирования данных (DCS)](https://www.broadnet.me/ru/reference/data-coding-scheme-dcs)
- [Сегментация SMS и UDH](https://www.broadnet.me/ru/reference/sms-segmentation-concatenation-udh)
- [Декодер PDU SMPP (бесплатный инструмент)](https://www.broadnet.me/ru/tools/smpp-pdu-decoder)
- [Продукт SMS API](https://www.broadnet.me/ru/products/sms-api)
