Конкатенированные SMS

Конкатенированные SMS (англ. concatenated SMS, также конкатенированная служба коротких сообщений) — технология мобильной связи, позволяющая преодолеть ограничение на количество символов, передаваемых в одном сообщении SMS (обычно 160 символов). При использовании этой технологии длинные сообщения разбиваются отправляющим устройством на более короткие части, которые затем пересобираются в одно сообщение на стороне получателя. Каждое такое сообщение тарифицируется отдельно. При корректной работе функции для пользователя этот процесс практически незаметен, и сообщение отображается как одно длинное SMS. В прошлом широкое использование этой технологии ограничивалось из-за несовместимости между операторами и отсутствия поддержки определённых моделей телефонов.

В конце 2000-х — начале 2010-х годов технология получила более широкое распространение: многие мобильные устройства и операторы SMS-шлюзов стали поддерживать конкатенацию сообщений. Способ, которым работает конкатенация SMS в сетях GSM и UMTS, описан в спецификации SMS Point to Point, 3GPP TS 23.040[1].

В сетях, не поддерживающих конкатенированные SMS (ни по стандартной, ни по упрощённой схеме), длинное сообщение доставляется как несколько независимых SMS, а не одно склеенное сообщение.

PDU-режим SMS

С технической точки зрения, конкатенированные SMS иногда также называют SMS в режиме PDU (англ. Protocol Data Unit, протокольная единица данных). Максимальное количество частей в многочастном (multi-part) или PDU-режимe SMS во многом определяется заголовком сообщения, а также возможностями устройств отправителя и получателя и особенностями оператора связи.

Теоретически, одно конкатенированное сообщение может содержать до 255 отдельных SMS, склеенных в одно длинное SMS. Из-за особенностей передачи SMS вероятность получения частей в нужном порядке мала, поэтому на стороне получателя реализуется механизм восстановления исходного длинного сообщения.

Отправка конкатенированных SMS с помощью заголовка пользовательских данных

Один из способов отправки конкатенированных SMS (CSMS) заключается в разбивке исходного сообщения на части по 153 7-битных символа (134 октета) и отправке каждой части с добавлением специального заголовка пользовательских данных (UDH, англ. User Data Header). UDH может использоваться для разных целей и имеет различную структуру; для конкатенации SMS его вид следующий:

  • Поле 1 (1 октет): длина заголовка пользовательских данных, в данном случае 05.
  • Поле 2 (1 октет): идентификатор элементарной информации (IEI) — всегда 00 (конкатенированные короткие сообщения, 8-битный номер ссылки).
  • Поле 3 (1 октет): длина элементарной информации (IEL), не включая IEI и IEL; равна 03.
  • Поле 4 (1 октет): 00–FF, номер ссылки CSMS, должен совпадать для всех частей одного сообщения.
  • Поле 5 (1 октет): 00–FF, общее число частей; значение постоянно для всех частей одного сообщения. Если значение 0 — элемент игнорируется.
  • Поле 6 (1 октет): 00–FF, номер части в последовательности; начинается с 1 и увеличивается для каждой следующей части. Если значение 0 или превышает значение поля 5 — элемент игнорируется. [Спецификация ETSI: GSM 03.40, версия 5.3.0, июль 1996]

Возможно использовать 16-битный номер ссылки CSMS для уменьшения вероятности совпадения идентификаторов разных сообщений. В этом случае UDH имеет следующий вид:

  • Поле 1 (1 октет): длина UDH (UDL), в данном случае 06.
  • Поле 2 (1 октет): идентификатор элементарной информации (IEI), равен 08 (конкатенированные короткие сообщения, 16-битный номер ссылки).
  • Поле 3 (1 октет): длина элементарной информации (IEL), не включая IEI и IEL; равна 04.
  • Поле 4 (2 октета): 0000–FFFF, номер ссылки CSMS, совпадает у всех частей одного сообщения.
  • Поле 5 (1 октет): 00–FF, общее число частей, постоянно для всех частей данного сообщения. Если значение 0 — элемент игнорируется.
  • Поле 6 (1 октет): 00–FF, номер части в последовательности; начиная с 1 и увеличиваясь для каждой последующей части. Если значение 0 или больше значения поля 5 — элемент игнорируется. [Спецификация ETSI: GSM 03.40, версия 5.3.0, июль 1996]

Пример UDH для SMS, разбитого на две части:

05 00 03 CC 02 01 [сообщение]
05 00 03 CC 02 02 [сообщение]

Если UDH присутствует и кодировка данных по умолчанию — 7-битный алфавит, пользовательские данные после UDH должны быть выровнены по 7-битному слову[2]. Это означает, что для выравнивания в начале сообщения может понадобиться добавить до 6 бит нулей.

Например, при UDH, включающем одну часть:

05 00 03 CC 01 01

общая длина UDH — (число октетов × 8 бит) = 6 × 8 = 48 бит. Поэтому необходимо добавить один бит заполнения в начало сообщения. Итого длина UDH (в битах UDH / количество битов в септете) = (48 + 1)/7 = 7 септетов.

Сообщение «Hello world» будет закодировано так:

90 65 36 FB 0D BA BF E5 6C 32

потому что необходимо предварительно добавить младшие значащие биты следующего 7-битного символа. Без этого бита заполнения, сообщение выглядело бы так:

C8 32 9B FD 06 DD DF 72 36 19

Общая длина UDL — 7 (септеты заголовка) + 11 (септеты сообщения) = 18 септетов.

Примечания