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.
bind_transceiverAbrir y autenticar la sesiónbind_transceiver_respSesión aceptadasubmit_smEnviar un mensajesubmit_sm_respAceptado, ID de mensaje devueltodeliver_smConfirmación de entrega o mensaje entrantedeliver_sm_respConfirmadoenquire_linkKeepalive en estado de inactividad
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.
| # | 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.
| 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.
| 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.
| 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.
Especificaciones de la fuente
Las normas publicadas en las que se basa esta página. Se abre en una pestaña nueva.