Конкатенированные SMS через SMPP: настройка без потери целостности

Конкатенированные SMS через SMPP: настройка без потери целостности

Если текст SMS превышает 160 символов (или 70 для кириллицы), оператор разбивает его на части. Но без правильного заголовка в протоколе SMPP получатель увидит отдельные фрагменты вместо одного сообщения. В статье — как настроить конкатенацию через UDH, проверить сборку и не потерять смысл. Материал для разработчиков и бизнеса, которые подключают SMS-трафик через SMPP.

Что такое конкатенированное SMS и зачем оно бизнесу

Обычное SMS — 140 байт на сообщение. В кодировке GSM 7-bit это 160 знаков, в UCS-2 (кириллица) — 70. Длинный текст оператор режет на сегменты по 153 байта (134 для кириллицы). Без служебного заголовка UDH (User Data Header) каждый сегмент — самостоятельное SMS. Получатель видит несколько сообщений, а не одно цельное.

Конкатенированные SMS решают эту проблему. В UDH прописывается идентификатор сборки, номер сегмента и общее количество частей. Телефон склеивает их в один текст. Для бизнеса это значит: полное описание акции, инструкция на 4–6 сегментов, юридический дисклеймер — всё в одном сообщении.

Как работает конкатенация в SMPP

В команде submit_sm есть поле data_coding (кодировка) и необязательное поле message_payload. Но для конкатенации используется именно short_message с префиксом в виде UDH. UDH — это байты в начале сообщения, которые оператор не показывает пользователю. Структура UDH для конкатенации:

  • длина заголовка (обычно 5 байт);
  • идентификатор элемента информации (0x00 — конкатенация 8-битная, 0x08 — 16-битная);
  • длина данных (3 байта для 8-бит, 4 для 16-бит);
  • идентификатор сообщения (1 байт для 8-бит, 2 для 16-бит);
  • общее количество сегментов (1 байт);
  • номер текущего сегмента (1 байт, начиная с 1).

Пример: для 8-битной конкатенации (обычно достаточно для большинства операторов Беларуси) UDH выглядит так: 05 00 03 XX MM NN, где XX — идентификатор сообщения, MM — число сегментов, NN — номер сегмента. Весь short_message = UDH + полезный текст.

Практические советы по настройке

Выбор кодировки: GSM 7-bit или UCS-2

Если текст содержит только латиницу, цифры и спецсимволы GSM 7-bit — экономьте. Один сегмент — до 153 символа (160 минус 7 байт UDH). Для кириллицы нужен UCS-2: один сегмент — 67 символов (70 минус 3 байта UDH). Разница в стоимости — каждый сегмент тарифицируется как отдельное SMS. Подробнее о выборе кодировки — в статье UCS-2 или GSM 7-bit: что выгоднее для SMS через SMPP.

Идентификатор сообщения при 16-битной конкатенации

Если ваш трафик превышает 256 уникальных сборок в секунду, используйте 16-битный UDH (0x08). Это важно для высокообъёмных рассылок. Большинство SMPP-провайдеров поддерживают оба варианта. Уточните в документации вашего сервиса.

Проверка целостности на тестовом номере

Отправьте себе SMS с текстом, заведомо длиннее 5–6 сегментов. Проверьте: приходит ли одно сообщение? Порядок сегментов? Не дублируются ли части? Если видите разбивку — перепроверьте UDH: правильная ли нумерация сегментов, не пересекаются ли идентификаторы с другими сообщениями.

Типичные ошибки при конкатенации через SMPP

  • Пропущен UDH — оператор не знает, что нужно склеивать. Получатель видит «куски».
  • Неправильный номер сегмента — например, начинается с 0. По стандарту — с 1.
  • Разная кодировка в сегментах — один сегмент в GSM 7-bit, другой в UCS-2. Телефон не сможет собрать.
  • Превышение лимита сегментов — большинство операторов поддерживают до 7–10 сегментов. Длиннее — риск, что сообщение не дойдёт целиком.
  • Игнорирование поля message_payload — некоторые SMPP-библиотеки пытаются упаковать длинный текст в message_payload, но не все операторы его поддерживают. Надёжнее использовать UDH в short_message.
  • Дублирование идентификатора — если отправить два разных сообщения с одинаковым ID, сегменты перемешаются.

Сколько сегментов можно отправить и как это влияет на стоимость

Кодировка Макс. символов в 1 сегменте (с UDH) Макс. сегментов (рекомендуется) Пример: текст 300 знаков (кириллица)
GSM 7-bit 153 7 2 сегмента
UCS-2 (кириллица) 67 5 5 сегментов

Каждый сегмент тарифицируется как отдельное SMS. Для кириллического текста в 300 знаков выйдет 5 SMS по цене одной короткой. Если бюджет ограничен — перепишите текст короче или используйте латиницу (где это уместно).

3 шага, которые можно сделать сегодня:

  1. Соберите UDH-заголовок в вашей SMPP-библиотеке (вручную или через готовый класс).
  2. Отправьте тестовое сообщение длиной 400–500 символов на свой номер.
  3. Проверьте DLR: пришёл ли финальный статус DELIVERED и не было ли ошибок сегментации.
Полезные ссылки UCS-2 или GSM 7-bit: что выгоднее для SMS через SMPP.