BroadNet
SMPPФормат передачи

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

Обновлено 3 мин чтенияна основе стандартов
Прямой ответ

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

§01

Формат 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"
§02

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

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

Часто используемые опциональные параметры
ТегИмяЗначениеИспользовать
0x0424message_payloadOctet StringТело сообщения при превышении short_message
0x001Ereceipted_message_idC-Octet String (65)Исходный message_id в отчёте о доставке
0x0427message_stateInteger (1)Итоговое/промежуточное состояние в отчёте о доставке (см. ниже)
0x0204user_message_referenceInteger (2)Корреляционная ссылка, назначаемая ESME
0x020Csar_msg_ref_numInteger (2)Конкатенация: общий номер-ссылка для всех сегментов
0x020Esar_total_segmentsInteger (1)Конкатенация: общее количество сегментов
0x020Fsar_segment_seqnumInteger (1)Конкатенация: последовательность этого сегмента
0x0423network_error_codeOctet String (3)Специфичные для сети сведения о сбое в отчёте о доставке
0x0426more_messages_to_sendInteger (1)Указывает, что последуют ещё сегменты
0x020Asource_portInteger (2)Адресация портов приложения (источник)
0x020Bdest_portInteger (2)Адресация портов приложения (назначение)
§03

Значения message_state

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

Значения message_state
ЗначениеСостояниеКлючевое слово stat в DLR
1ENROUTE(в пути)
2DELIVEREDDELIVRD
3EXPIREDEXPIRED
4DELETEDDELETED
5UNDELIVERABLEUNDELIV
6ACCEPTEDACCEPTD
7UNKNOWNUNKNOWN
8REJECTEDREJECTD
9SKIPPED (v5.0)—
§04

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

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

§05

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

Не заполняйте одновременно 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 часто вырезаются или отклоняются при передаче, поэтому заранее согласуйте теги и их смысл с провайдером.

Ссылки

Технические характеристики источника

На этой странице представлены опубликованные стандарты, на которых они основаны. (Открывается в новой вкладке)

BNПоддерживается инженерной командой BroadNet·Обмен сообщениями операторского класса с 2003 года.
Прикрепите это к проводу

Разработано с использованием реального SMPP подключения и REST API.

Запросите тестовый доступ с реальными тестовыми ключами: сначала отправьте их на свой подтвержденный номер, а затем, после утверждения вашей личности отправителя и маршрутов, переходите к использованию в производственной среде более чем в 200 странах.