# Опциональные параметры TLV в SMPP

> TLV (опциональные параметры, введённые в v3.4) расширяют PDU за пределы его обязательных полей. Каждый кодируется как 2-байтовый тег (Tag), 2-байтовая длина (Length) и значение (Value) длиной в Length байт, все в обратном порядке байтов. TLV идут после обязательного тела в любом порядке и позволяют SMPP переносить полезные нагрузки, метаданные конкатенации и корреляцию отчётов без изменения фиксированной структуры полей.

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

Опциональные параметры SMPP используют формат Tag-Length-Value. Разбивка TLV по байтам плюс распространённые теги: message_payload, receipted_message_id, message_state, user_message_reference и набор sar_* для конкатенации.

## Формат TLV

TLV (также называемый опциональным параметром) — это самоописывающее поле: 2-октетный тег (Tag) идентифицирует параметр, 2-октетная длина (Length) задаёт размер значения в октетах, а далее следует само значение (Value). И Tag, и Length записываются в обратном порядке байтов. Поскольку TLV имеют теги, они могут идти в любом порядке после обязательных параметров, а получатель просто пропускает неизвестные ему теги.

*TLV message_payload, несущий 5-байтовое значение*

```hex
04 24        Tag    = 0x0424 (message_payload)
00 05        Length = 5 octets
48 65 6C 6C 6F   Value = "Hello"
```

## Распространённые теги TLV

Небольшой набор TLV выполняет основную работу в промышленной эксплуатации. message_payload несёт сообщение, слишком длинное для short_message. receipted_message_id и message_state делают отчёты о доставке машиночитаемыми. user_message_reference позволяет прикрепить собственный идентификатор корреляции. Набор sar_* обеспечивает стандартную конкатенацию без байтов UDH в теле.

*Часто используемые опциональные параметры*

| Тег | Имя | Значение | Использовать |
|---|---|---|---|
| 0x0424 | message_payload | Octet String | Тело сообщения при превышении short_message |
| 0x001E | receipted_message_id | C-Octet String (65) | Исходный message_id в отчёте о доставке |
| 0x0427 | message_state | Integer (1) | Итоговое/промежуточное состояние в отчёте о доставке (см. ниже) |
| 0x0204 | user_message_reference | Integer (2) | Корреляционная ссылка, назначаемая ESME |
| 0x020C | sar_msg_ref_num | Integer (2) | Конкатенация: общий номер-ссылка для всех сегментов |
| 0x020E | sar_total_segments | Integer (1) | Конкатенация: общее количество сегментов |
| 0x020F | sar_segment_seqnum | Integer (1) | Конкатенация: последовательность этого сегмента |
| 0x0423 | network_error_code | Octet String (3) | Специфичные для сети сведения о сбое в отчёте о доставке |
| 0x0426 | more_messages_to_send | Integer (1) | Указывает, что последуют ещё сегменты |
| 0x020A | source_port | Integer (2) | Адресация портов приложения (источник) |
| 0x020B | dest_port | Integer (2) | Адресация портов приложения (назначение) |

## Значения message_state

TLV message_state (0x0427) сообщает состояние жизненного цикла сообщения численно — машиночитаемый спутник ключевого слова stat в тексте DLR. Эти значения также появляются в query_sm_resp.

*Значения message_state*

| Значение | Состояние | Ключевое слово stat в DLR |
|---|---|---|
| 1 | ENROUTE | (в пути) |
| 2 | DELIVERED | DELIVRD |
| 3 | EXPIRED | EXPIRED |
| 4 | DELETED | DELETED |
| 5 | UNDELIVERABLE | UNDELIV |
| 6 | ACCEPTED | ACCEPTD |
| 7 | UNKNOWN | UNKNOWN |
| 8 | REJECTED | REJECTD |
| 9 | SKIPPED (v5.0) | — |

## Конкатенация SAR против UDH

SMPP предлагает два способа конкатенации длинного сообщения. Метод UDH помещает 6-байтовый User Data Header внутрь short_message и устанавливает бит UDHI в esm_class. Метод SAR оставляет тело чистым и вместо этого несёт три TLV sar_*. Выберите один способ и придерживайтесь его для каждого маршрута — некоторые сети принимают только UDH, другие только SAR. Никогда не смешивайте оба в одном сообщении.

## Правила и подводные камни

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

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

### Что означает TLV в SMPP?

Tag-Length-Value. Каждый опциональный параметр кодируется как 2-байтовый тег, 2-байтовая длина и столько байт значения. TLV были введены в SMPP v3.4 и идут после обязательного тела PDU.

### Когда использовать message_payload вместо short_message?

Используйте TLV message_payload (0x0424), когда сообщение превышает 254-октетное поле short_message или когда провайдер предпочитает его для длинного контента. Не задавайте оба поля в одном PDU.

### Как сопоставить отчёт о доставке с отправленным сообщением?

Сопоставьте TLV receipted_message_id (0x001E) из отчёта с message_id, который вы сохранили из submit_sm_resp. Сначала нормализуйте форматы, поскольку некоторые SMSC возвращают идентификатор в шестнадцатеричном виде при отправке и в десятичном в отчёте.

### Лучше ли TLV sar_* для конкатенации, чем UDH?

Ни один не лучше во всех случаях — это две кодировки одной идеи. SAR оставляет тело сообщения свободным от байтов заголовка; UDH поддерживается более широко. Используйте тот, который поддерживает ваш маршрут, и придерживайтесь его.

### Можно ли добавлять собственные пользовательские TLV?

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

## Источники

- [SMPP v3.4 specification — §5.3 optional parameters](https://smpp.org/SMPP_v3_4_Issue1_2.pdf)
- [SMPP v5.0 specification](https://smpp.org/SMPP_v5.pdf)

## См. также

- [Отчёты о доставке SMPP (формат DLR)](https://www.broadnet.me/ru/reference/smpp-delivery-receipts-dlr)
- [Сегментация SMS и UDH](https://www.broadnet.me/ru/reference/sms-segmentation-concatenation-udh)
- [Справочник по submit_sm в SMPP](https://www.broadnet.me/ru/reference/smpp-submit-sm)
- [Декодер PDU SMPP (бесплатный инструмент)](https://www.broadnet.me/ru/tools/smpp-pdu-decoder)
- [Структура PDU в SMPP](https://www.broadnet.me/ru/reference/smpp-pdu-anatomy)
