# SMPP submit_sm: todos los campos obligatorios

> submit_sm (command_id 0x00000004) envía un mensaje terminado en móvil desde el ESME al SMSC. Su cuerpo es una secuencia fija de campos obligatorios: direccionamiento (TON/NPI + dirección), esm_class, protocol_id, priority_flag, planificación, registered_delivery, data_coding, sm_length y short_message, seguidos opcionalmente de TLV. submit_sm_resp devuelve el message_id del SMSC.

- URL canónica: https://www.broadnet.me/es/reference/smpp-submit-sm
- Idioma: es
- Última actualización: 2026-07-18
- Editor: BroadNet (https://www.broadnet.me)

Una referencia completa campo por campo de submit_sm: service_type, TON/NPI, esm_class, data_coding, registered_delivery, validity_period, short_message y el resto, con los valores que de verdad importan.

## El orden completo de los campos obligatorios

El cuerpo de submit_sm es una secuencia fija y ordenada: no hay etiquetas de campo, así que el orden y el tamaño lo son todo. La tabla enumera todos los parámetros obligatorios en el orden del cable. short_message puede estar vacío cuando el texto se transporta en un TLV message_payload; no rellenes ambos.

*Parámetros obligatorios de submit_sm (en orden del cable)*

| # | Campo | Tipo | Notas |
|---|---|---|---|
| 1 | service_type | C-Octet String (6) | Categoría de servicio; generalmente vacía |
| 2 | source_addr_ton | Integer (1) | Tipo de número del remitente |
| 3 | source_addr_npi | Integer (1) | Plan de numeración del remitente |
| 4 | source_addr | C-Octet String (21) | Dirección del remitente / ID alfanumérico |
| 5 | dest_addr_ton | Integer (1) | Tipo de número del destinatario |
| 6 | dest_addr_npi | Integer (1) | Plan de numeración del destinatario |
| 7 | destination_addr | C-Octet String (21) | MSISDN del destinatario |
| 8 | esm_class | Integer (1) | Modo de mensaje + tipo + indicador UDHI |
| 9 | protocol_id | Integer (1) | GSM TP-PID; usualmente 0 |
| 10 | priority_flag | Integer (1) | 0 (normal) – 3 (máximo) |
| 11 | schedule_delivery_time | C-Octet String (1\|17) | Vacío = inmediato |
| 12 | validity_period | C-Octet String (1\|17) | Vacío = SMSC por defecto |
| 13 | registered_delivery | Integer (1) | Solicitar confirmación de entrega |
| 14 | replace_if_present_flag | Integer (1) | 0 = no, 1 = reemplazar |
| 15 | data_coding | Integer (1) | Codificación / DCS |
| 16 | sm_default_msg_id | Integer (1) | ID de mensaje predefinido; normalmente 0 |
| 17 | sm_length | Integer (1) | Longitud de short_message (0–254) |
| 18 | short_message | Octet String (0–254) | La carga útil del mensaje |

## Direccionamiento: TON y NPI

source_addr y destination_addr transportan cada uno un Type of Number (TON) y un Numbering Plan Indicator (NPI). Para un MSISDN internacional usa TON 1 (International) con NPI 1 (ISDN/E.164). Para un remitente alfanumérico usa TON 5 (Alphanumeric): source_addr contiene entonces hasta 11 caracteres GSM-7. Equivocarse con TON/NPI es una de las principales causas de tráfico no entregado o mal enrutado.

*Valores comunes de TON y NPI*

| TON | Significado | NPI | Significado |
|---|---|---|---|
| 0 | Desconocido | 0 | Desconocido |
| 1 | Internacional | 1 | ISDN (E.163/E.164) |
| 2 | Nacional | 3 | Datos (X.121) |
| 3 | Específico de la red | 4 | Telex (F.69) |
| 4 | Número de abonado | 6 | Móvil terrestre (E.212) |
| 5 | Alfanumérico | 8 | Nacional |
| 6 | Abreviado | 9 | Privado |

## esm_class

esm_class es un campo de bits que fija el modo de mensajería, el tipo de mensaje y funciones específicas de GSM. El bit más importante para los remitentes es UDHI (0x40): actívalo cuando short_message empiece con un User Data Header, por ejemplo una cabecera de concatenación. El bit 0x80 solicita la ruta de respuesta de GSM.

*Significado de los bits de esm_class (selección)*

| Bits | Campo | Valor → significado |
|---|---|---|
| 1–0 | Modo de mensajería | 0 predeterminado · 1 datagrama · 2 reenvío · 3 almacenar y reenviar |
| 5–2 | Tipo de mensaje | 0 predeterminado · 0x04 confirmación de entrega · 0x08 acuse de entrega · 0x10 acuse del usuario |
| 6 | UDHI | 0x40 = short_message begins with a UDH |
| 7 | Ruta de respuesta | 0x80 = set GSM reply path |

## data_coding, registered_delivery y validez

data_coding selecciona la codificación del texto: 0x00 = valor por defecto del SMSC (normalmente GSM 7-bit), 0x04 = binario de 8 bits, 0x08 = UCS-2 para Unicode. Los dos bits bajos de registered_delivery controlan los acuses: 0 = ninguno, 1 = acuse en el éxito o fallo final, 2 = solo en caso de fallo. validity_period y schedule_delivery_time usan la forma absoluta YYMMDDhhmmsstnnp o una forma relativa; una cadena vacía significa entrega inmediata y la validez por defecto del SMSC. Mantén validity_period ajustado para los OTP, para que un código retrasado caduque en lugar de llegar caducado.

*data_coding — los valores que realmente usas*

| Valor | Codificación |
|---|---|
| 0x00 | Alfabeto predeterminado del SMSC (normalmente GSM de 7 bits) |
| 0x03 | Latin-1 (ISO-8859-1) |
| 0x04 | binario de 8 bits (octeto no especificado) |
| 0x08 | UCS-2 (UTF-16BE) — Unicode |

## La respuesta

submit_sm_resp (0x80000004) devuelve command_status y, si tiene éxito, un message_id (C-Octet String, hasta 65 caracteres) que el SMSC asigna al mensaje. Guárdalo: es la clave que cotejas contra el receipted_message_id de la confirmación de entrega. Cuidado con la deriva de formato: algunos SMSC devuelven el identificador en hexadecimal en el envío y en decimal en el DLR, así que normaliza ambos al correlacionar.

## Preguntas frecuentes

### ¿Qué TON/NPI uso para un remitente alfanumérico?

Usa source_addr_ton = 5 (Alphanumeric) y source_addr_npi = 0 (Unknown). source_addr contiene entonces hasta 11 caracteres GSM-7. Los remitentes alfanuméricos son solo de visualización y no pueden recibir respuestas.

### ¿Cómo solicito una confirmación de entrega en submit_sm?

Ajusta registered_delivery = 1 para obtener un acuse en la entrega o el fallo final, o 2 solo en caso de fallo. Solicita acuses solo donde realmente los consumas, ya que los DLR sin leer desperdician rendimiento.

### ¿Cuál es la longitud máxima de short_message?

El campo short_message admite hasta 254 octetos, y sm_length indica el recuento exacto. Para textos más largos, segmenta con un UDH en varias PDU submit_sm o transporta toda la carga en el TLV message_payload en lugar de en short_message.

### ¿Puedo fijar a la vez short_message y message_payload?

No. Rellena uno u otro. Los proveedores rechazan un submit_sm que transporta el mensaje tanto en el campo obligatorio short_message como en el TLV message_payload.

### ¿Cómo envío un mensaje Unicode?

Ajusta data_coding = 0x08 (UCS-2) y codifica el texto como UTF-16 big-endian en short_message. Un único SMS UCS-2 admite 70 caracteres; el texto Unicode más largo se segmenta a 67 caracteres por parte.

## Fuentes

- [SMPP v3.4 specification — §4.4 submit_sm](https://smpp.org/SMPP_v3_4_Issue1_2.pdf)
- [3GPP TS 23.040 — SMS technical realization](https://www.3gpp.org/dynareport/23040.htm)

## Relacionado

- [SMPP deliver_sm y mensajes MO](https://www.broadnet.me/es/reference/smpp-deliver-sm)
- [Esquema de codificación de datos (DCS)](https://www.broadnet.me/es/reference/data-coding-scheme-dcs)
- [Segmentación de SMS y UDH](https://www.broadnet.me/es/reference/sms-segmentation-concatenation-udh)
- [Decodificador de PDU SMPP (herramienta gratuita)](https://www.broadnet.me/es/tools/smpp-pdu-decoder)
- [Producto SMS API](https://www.broadnet.me/es/products/sms-api)
