TLV (опциональные параметры, введённые в v3.4) расширяют PDU за пределы его обязательных полей. Каждый кодируется как 2-байтовый тег (Tag), 2-байтовая длина (Length) и значение (Value) длиной в Length байт, все в обратном порядке байтов. TLV идут после обязательного тела в любом порядке и позволяют SMPP переносить полезные нагрузки, метаданные конкатенации и корреляцию отчётов без изменения фиксированной структуры полей.
Формат TLV
TLV (также называемый опциональным параметром) — это самоописывающее поле: 2-октетный тег (Tag) идентифицирует параметр, 2-октетная длина (Length) задаёт размер значения в октетах, а далее следует само значение (Value). И Tag, и Length записываются в обратном порядке байтов. Поскольку TLV имеют теги, они могут идти в любом порядке после обязательных параметров, а получатель просто пропускает неизвестные ему теги.
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.
| Значение | Состояние | Ключевое слово 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 часто вырезаются или отклоняются при передаче, поэтому заранее согласуйте теги и их смысл с провайдером.
Технические характеристики источника
На этой странице представлены опубликованные стандарты, на которых они основаны. (Открывается в новой вкладке)