submit_sm (command_id 0x00000004) отправляет сообщение на абонента (mobile-terminated) от ESME к SMSC. Его тело — фиксированная последовательность обязательных полей: адресация (TON/NPI + адрес), esm_class, protocol_id, priority_flag, планирование, registered_delivery, data_coding, sm_length и short_message — за которыми могут идти TLV. submit_sm_resp возвращает message_id, присвоенный SMSC.
bind_transceiverОткрыть и аутентифицировать сессиюbind_transceiver_respСессия принятаsubmit_smОтправить сообщениеsubmit_sm_respПринято, возвращен ID сообщенияdeliver_smПодтверждение доставки или входящее сообщениеdeliver_sm_respПодтвержденоenquire_linkKeepalive в режиме ожидания
Полный порядок обязательных полей
Тело submit_sm — это фиксированная упорядоченная последовательность; тегов полей нет, поэтому порядок и размер имеют решающее значение. В таблице перечислены все обязательные параметры в порядке передачи. short_message может быть пустым, когда текст передаётся в TLV message_payload; не заполняйте оба поля одновременно.
| # | Поле | Тип | Примечания |
|---|---|---|---|
| 1 | service_type | C-Octet String (6) | Категория услуги; обычно пусто |
| 2 | source_addr_ton | Integer (1) | Тип номера отправителя |
| 3 | source_addr_npi | Integer (1) | План нумерации отправителя |
| 4 | source_addr | C-Octet String (21) | Адрес отправителя / буквенно-цифровой идентификатор |
| 5 | dest_addr_ton | Integer (1) | Тип номера получателя |
| 6 | dest_addr_npi | Integer (1) | План нумерации получателя |
| 7 | destination_addr | C-Octet String (21) | MSISDN получателя |
| 8 | esm_class | Integer (1) | Режим сообщения + тип + флаг UDHI |
| 9 | protocol_id | Integer (1) | GSM TP-PID; обычно 0 |
| 10 | priority_flag | Integer (1) | 0 (норма) – 3 (максимум) |
| 11 | schedule_delivery_time | C-Octet String (1|17) | Пусто = немедленно |
| 12 | validity_period | C-Octet String (1|17) | Пусто = значение по умолчанию SMSC |
| 13 | registered_delivery | Integer (1) | Запросить отчёт о доставке |
| 14 | replace_if_present_flag | Integer (1) | 0 = нет, 1 = заменить |
| 15 | data_coding | Integer (1) | Кодировка / DCS |
| 16 | sm_default_msg_id | Integer (1) | Идентификатор шаблонного сообщения; обычно 0 |
| 17 | sm_length | Integer (1) | Длина short_message (0–254) |
| 18 | short_message | Octet String (0–254) | Полезная нагрузка сообщения |
Адресация: TON и NPI
source_addr и destination_addr несут тип номера (TON) и индикатор плана нумерации (NPI). Для международного MSISDN используйте TON 1 (International) с NPI 1 (ISDN/E.164). Для буквенно-цифрового идентификатора отправителя используйте TON 5 (Alphanumeric) — тогда source_addr содержит до 11 символов GSM-7. Неверные TON/NPI — одна из главных причин недоставленного или неправильно маршрутизированного трафика.
| TON | Значение | NPI | Значение |
|---|---|---|---|
| 0 | Неизвестно | 0 | Неизвестно |
| 1 | Международный | 1 | ISDN (E.163/E.164) |
| 2 | Национальный | 3 | Данные (X.121) |
| 3 | Зависит от сети | 4 | Телекс (F.69) |
| 4 | Номер абонента | 6 | Мобильная связь (E.212) |
| 5 | Буквенно-цифровой | 8 | Национальный |
| 6 | Сокращенный | 9 | Частный |
esm_class
esm_class — это битовое поле, задающее режим обмена сообщениями, тип сообщения и специфичные для GSM функции. Самый важный бит для отправителей — UDHI (0x40): устанавливайте его, когда short_message начинается с User Data Header, например с заголовка конкатенации. Бит 0x80 запрашивает путь ответа GSM.
| Биты | Поле | Значение → смысл |
|---|---|---|
| 1–0 | Режим передачи сообщений | 0 по умолчанию · 1 датаграмма · 2 пересылка · 3 сохранение и пересылка |
| 5–2 | Тип сообщения | 0 по умолчанию · 0x04 отчёт о доставке · 0x08 подтверждение доставки (delivery ack) · 0x10 подтверждение пользователя |
| 6 | UDHI | 0x40 = short_message begins with a UDH |
| 7 | Путь ответа | 0x80 = set GSM reply path |
data_coding, registered_delivery и validity
data_coding выбирает кодировку текста: 0x00 = значение по умолчанию SMSC (обычно GSM 7-bit), 0x04 = 8-битный двоичный формат, 0x08 = UCS-2 для Unicode. Младшие два бита registered_delivery управляют отчётами: 0 = нет, 1 = отчёт при окончательной доставке или сбое, 2 = только при сбое. validity_period и schedule_delivery_time используют абсолютный формат YYMMDDhhmmsstnnp либо относительный; пустая строка означает немедленную доставку и период действия по умолчанию SMSC. Для OTP держите validity_period коротким, чтобы задержанный код истёк, а не пришёл устаревшим.
| Значение | Кодировка |
|---|---|
| 0x00 | Алфавит по умолчанию SMSC (обычно 7-битный GSM) |
| 0x03 | Latin-1 (ISO-8859-1) |
| 0x04 | 8-битные двоичные данные (октеты без спецификации) |
| 0x08 | UCS-2 (UTF-16BE) — Unicode |
Ответ
submit_sm_resp (0x80000004) возвращает command_status и, при успехе, message_id (C-Octet String, до 65 символов), который SMSC присваивает сообщению. Сохраняйте его: это ключ для сопоставления с receipted_message_id в отчёте о доставке. Остерегайтесь расхождений формата — некоторые SMSC возвращают идентификатор в шестнадцатеричном виде при отправке и в десятичном в DLR, поэтому нормализуйте оба при корреляции.
Часто задаваемые вопросы
Какие TON/NPI использовать для буквенно-цифрового идентификатора отправителя?
Используйте source_addr_ton = 5 (Alphanumeric) и source_addr_npi = 0 (Unknown). Тогда source_addr содержит до 11 символов GSM-7. Буквенно-цифровые идентификаторы отправителя предназначены только для отображения и не могут принимать ответы.
Как запросить отчёт о доставке в submit_sm?
Установите registered_delivery = 1, чтобы получить отчёт при окончательной доставке или сбое, либо 2 только при сбое. Запрашивайте отчёты только там, где вы их действительно обрабатываете, поскольку непрочитанные DLR расходуют пропускную способность.
Какова максимальная длина short_message?
Поле short_message вмещает до 254 октетов, а sm_length задаёт точное число. Для более длинного текста либо сегментируйте с UDH в нескольких PDU submit_sm, либо передавайте всю полезную нагрузку в TLV message_payload вместо short_message.
Можно ли задать и short_message, и message_payload?
Нет. Заполняйте одно из двух. Провайдеры отклоняют submit_sm, где сообщение передано и в обязательном поле short_message, и в TLV message_payload.
Как отправить сообщение в Unicode?
Установите data_coding = 0x08 (UCS-2) и закодируйте текст как UTF-16 в обратном порядке байтов в short_message. Одно SMS в UCS-2 вмещает 70 символов; более длинный текст в Unicode сегментируется по 67 символов на часть.
Технические характеристики источника
На этой странице представлены опубликованные стандарты, на которых они основаны. (Открывается в новой вкладке)