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

Структура PDU в SMPP: заголовок и тело

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

Каждое сообщение SMPP — это PDU (Protocol Data Unit) с фиксированным 16-байтовым заголовком, за которым следует тело, зависящее от операции. Заголовок — это четыре 4-байтовых целых числа в обратном порядке байтов: command_length, command_id, command_status и sequence_number. command_length учитывает весь PDU, включая заголовок, поэтому получатель сначала читает 4 байта, а затем остальное.

СхемаSMPP-сессия между вашей платформой и BroadNet
Ваша платформа (ESME)
BroadNet SMSC
Одно постоянное TCP/TLS-соединение
  1. bind_transceiverОткрыть и аутентифицировать сессию
  2. bind_transceiver_respСессия принята
  3. submit_smОтправить сообщение
  4. submit_sm_respПринято, возвращен ID сообщения
  5. deliver_smПодтверждение доставки или входящее сообщение
  6. deliver_sm_respПодтверждено
  7. enquire_linkKeepalive в режиме ожидания
§01

16-байтовый заголовок

Каждый PDU начинается с одних и тех же четырёх беззнаковых 32-битных целых чисел в сетевом порядке байтов (big-endian). command_length — это полный размер PDU в октетах, включая эти 16 байт заголовка: анализатор читает первые 4 байта, узнаёт полную длину и затем читает остаток. command_id идентифицирует операцию. command_status равен 0 (ESME_ROK) в запросах и несёт код ошибки в ответах. sequence_number связывает запрос с его ответом.

Поля заголовка SMPP (16 байт, big-endian)
СмещениеПолеРазмерНазначение
0command_length4 октетаОбщая длина PDU в октетах, включая заголовок
4command_id4 октетаИдентификатор операции (например, submit_sm = 0x00000004)
8command_status4 октета0 в запросе; код ошибки в ответе
12sequence_number4 октетаСопоставляет запрос↔ответ (0x00000001–0x7FFFFFFF)
§02

command_id и бит ответа

У каждой операции есть свой command_id. Соответствующий ответ использует то же значение со старшим битом, установленным в 1 (логическое ИЛИ с 0x80000000). Так, submit_sm — это 0x00000004, а submit_sm_resp — 0x80000004. generic_nack (0x80000000) — универсальный ответ об ошибке для неразбираемого или недопустимого PDU.

Распространённые значения command_id
ОперацияЗапросОтвет
generic_nack—0x80000000
bind_receiver0x000000010x80000001
bind_transmitter0x000000020x80000002
query_sm0x000000030x80000003
submit_sm0x000000040x80000004
deliver_sm0x000000050x80000005
unbind0x000000060x80000006
replace_sm0x000000070x80000007
cancel_sm0x000000080x80000008
bind_transceiver0x000000090x80000009
enquire_link0x000000150x80000015
data_sm0x000001030x80000103
§03

Тело и кодирование полей

После заголовка следует тело, зависящее от операции, с обязательными параметрами, за которыми могут идти опциональные параметры TLV. SMPP использует три типа кодирования полей. Целые числа имеют фиксированный размер, беззнаковые, в обратном порядке байтов. C-Octet String — это ASCII-текст, завершаемый нулём (0x00), с объявленной максимальной длиной, включающей завершающий символ. Octet String — это поле необработанных байтов, длина которого задаётся предшествующим полем длины (например, short_message, размер которого задаётся sm_length).

Типы кодирования полей SMPP
ТипКодировка
IntegerФиксированные 1/2/4-октетные беззнаковые, big-endian (сетевой порядок байтов)
C-Octet StringASCII с завершающим NUL; максимальная длина включает терминатор 0x00
C-Octet String (Decimal/Hex)Как указано выше, но с ограничением на десятичные или шестнадцатеричные цифры ASCII
Octet StringНеобработанные байты; длина указывается отдельным полем длины, без терминатора
§04

Разбор примера: submit_sm в канале

Минимальный PDU submit_sm. Значение command_length в заголовке (0x0000003D = 61) — это полный размер в байтах; command_id 0x00000004 — это submit_sm; command_status 0 обозначает запрос; sequence_number 0x0000000F связывает ответ. Далее следует тело в фиксированном порядке полей, определённом спецификацией.

Заголовок submit_sm + начало тела (с пояснениями)hex
00 00 00 3D   command_length = 61
00 00 00 04   command_id     = submit_sm
00 00 00 00   command_status = ESME_ROK (request)
00 00 00 0F   sequence_number = 15
-- body --
00            service_type    = "" (NULL)
05            source_addr_ton = 5 (alphanumeric)
00            source_addr_npi = 0 (unknown)
42 4E 00      source_addr     = "BN" + NULL
01            dest_addr_ton   = 1 (international)
01            dest_addr_npi   = 1 (E.164/ISDN)
...           destination_addr, esm_class, ... short_message
Часто задаваемые вопросы

Часто задаваемые вопросы

Включает ли command_length заголовок?

Да. command_length — это полная длина всего PDU в октетах, включая 16-байтовый заголовок. Получатель читает ровно command_length байт, чтобы извлечь один целый PDU из потока TCP.

Какой порядок байтов использует SMPP?

Сетевой порядок байтов — big-endian — для всех многобайтовых целочисленных полей, включая каждое поле заголовка. 4-байтовое значение 61 передаётся как 00 00 00 3D.

Как завершаются текстовые поля?

Текстовые поля — это C-Octet String: символы ASCII, завершаемые одним нулевым байтом (0x00). Пустая C-Octet String — это просто нулевой байт. Объявленная максимальная длина включает этот завершающий символ.

Что такое generic_nack?

generic_nack (command_id 0x80000000) — это ответ, который получатель возвращает, когда PDU невозможно разобрать или он принципиально недопустим — например, при неверном command_length или неизвестном command_id. Его command_status несёт причину.

Как получатель выделяет PDU из потока TCP?

TCP — это поток байтов без границ сообщений, поэтому получатель читает первые 4 байта, чтобы получить command_length, а затем читает указанное общее число байтов, чтобы выделить один полный PDU перед разбором остальной части заголовка и тела.

Ссылки

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

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

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

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

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