Конкатенированные 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 септетов.


