Los TLV (parámetros opcionales, introducidos en la v3.4) amplían una PDU más allá de sus campos obligatorios. Cada uno se codifica como un Tag de 2 bytes, un Length de 2 bytes y un Value de Length bytes, todo big-endian. Los TLV aparecen tras el cuerpo obligatorio, en cualquier orden, y permiten a SMPP transportar cargas, metadatos de concatenación y correlación de acuses sin cambiar la disposición fija de campos.
El formato TLV
Un TLV (también llamado parámetro opcional) es un campo autodescriptivo: un Tag de 2 octetos identifica el parámetro, un Length de 2 octetos da el tamaño del Value en octetos y a continuación va el Value. Tanto Tag como Length son big-endian. Como están etiquetados, los TLV pueden aparecer en cualquier orden tras los parámetros obligatorios y el receptor simplemente omite las etiquetas que no reconoce.
04 24 Tag = 0x0424 (message_payload)
00 05 Length = 5 octets
48 65 6C 6C 6F Value = "Hello"Etiquetas TLV comunes
Un puñado de TLV hace la mayor parte del trabajo en producción. message_payload transporta un mensaje demasiado largo para short_message. receipted_message_id y message_state hacen que las confirmaciones de entrega sean legibles por máquina. user_message_reference permite adjuntar tu propio identificador de correlación. El conjunto sar_* proporciona concatenación basada en estándares sin bytes UDH en el cuerpo.
| Etiqueta | Nombre | Valor | Usar |
|---|---|---|---|
| 0x0424 | message_payload | Octet String | Cuerpo del mensaje cuando excede short_message |
| 0x001E | receipted_message_id | C-Octet String (65) | message_id original en una confirmación de entrega |
| 0x0427 | message_state | Integer (1) | Estado final/intermedio en una confirmación de entrega (ver más abajo) |
| 0x0204 | user_message_reference | Integer (2) | Referencia de correlación asignada por ESME |
| 0x020C | sar_msg_ref_num | Integer (2) | Concatenación: referencia compartida entre segmentos |
| 0x020E | sar_total_segments | Integer (1) | Concatenación: número total de segmentos |
| 0x020F | sar_segment_seqnum | Integer (1) | Concatenación: la secuencia de este segmento |
| 0x0423 | network_error_code | Octet String (3) | Detalle del fallo específico de la red en una confirmación de entrega |
| 0x0426 | more_messages_to_send | Integer (1) | Indica que siguen más segmentos |
| 0x020A | source_port | Integer (2) | Direccionamiento de puertos de la aplicación (origen) |
| 0x020B | dest_port | Integer (2) | Direccionamiento del puerto de la aplicación (destino) |
Valores de message_state
El TLV message_state (0x0427) informa numéricamente del estado del ciclo de vida de un mensaje: el complemento legible por máquina de la palabra clave stat del texto del DLR. Estos valores también aparecen en query_sm_resp.
| Valor | Estado | Palabra clave stat del DLR |
|---|---|---|
| 1 | ENROUTE | (en tránsito) |
| 2 | DELIVERED | DELIVRD |
| 3 | EXPIRED | EXPIRED |
| 4 | DELETED | DELETED |
| 5 | UNDELIVERABLE | UNDELIV |
| 6 | ACCEPTED | ACCEPTD |
| 7 | UNKNOWN | UNKNOWN |
| 8 | REJECTED | REJECTD |
| 9 | SKIPPED (v5.0) | — |
Concatenación SAR frente a UDH
SMPP ofrece dos formas de concatenar un mensaje largo. El método UDH coloca un User Data Header de 6 bytes dentro de short_message y activa el bit UDHI de esm_class. El método SAR mantiene el cuerpo limpio y transporta en su lugar los tres TLV sar_*. Elige uno y sé coherente por ruta: algunas redes solo aceptan UDH y otras solo SAR. Nunca mezcles ambos en el mismo mensaje.
Reglas y trampas
No rellenes a la vez short_message y message_payload: los proveedores lo rechazan. Los TLV personalizados fuera de los rangos que apruebe tu proveedor suelen eliminarse o provocar errores de análisis aguas abajo, así que envía metadatos solo en etiquetas acordadas. Un receptor debe tolerar los TLV desconocidos omitiendo Length bytes; un Length mal formado es la causa clásica de un análisis corrupto de todo lo que va después.
Preguntas frecuentes
¿Qué significa TLV en SMPP?
Tag-Length-Value. Cada parámetro opcional se codifica como una etiqueta de 2 bytes, una longitud de 2 bytes y ese número de bytes de valor. Los TLV se introdujeron en SMPP v3.4 y aparecen tras el cuerpo obligatorio de una PDU.
¿Cuándo debo usar message_payload en lugar de short_message?
Usa el TLV message_payload (0x0424) cuando el mensaje supere el campo short_message de 254 octetos, o cuando tu proveedor lo prefiera para contenido largo. No rellenes ambos campos en la misma PDU.
¿Cómo correlaciono una confirmación de entrega con mi mensaje enviado?
Coteja el TLV receipted_message_id (0x001E) del acuse contra el message_id que guardaste de submit_sm_resp. Normaliza primero los formatos, ya que algunos SMSC devuelven el identificador en hexadecimal en el envío y en decimal en el acuse.
¿Son los TLV sar_* mejores que UDH para concatenar?
Ninguno es universalmente mejor: son dos codificaciones de la misma idea. SAR mantiene el cuerpo del mensaje libre de bytes de cabecera; UDH está más ampliamente aceptado. Usa el que admita tu ruta y sé coherente.
¿Puedo añadir mis propios TLV personalizados?
Solo dentro del rango de etiquetas específicas del fabricante que apruebe tu proveedor. Los TLV personalizados no aprobados se eliminan o rechazan con frecuencia en tránsito, así que acuerda antes las etiquetas y su significado con el proveedor.
Especificaciones de la fuente
Las normas publicadas en las que se basa esta página. Se abre en una pestaña nueva.