Saltar al contenido

SMS por SMPP 3.4

Conecta tu plataforma al servidor SMPP 3.4 de Hablame para enviar SMS y recibir, por cada mensaje, el estado final que conocemos de él.

12 min de lecturaRevisado el

Objetivo

Enviar SMS desde tu propia plataforma con el protocolo estándar SMPP 3.4, y saber qué pasó con cada uno. Es la vía indicada si ya tienes un cliente SMPP o necesitas enviar en volumen sostenido.

Por SMPP envías y recibes los acuses de entrega de lo que enviaste. Los SMS que las personas le escriben a tu código corto no llegan por aquí: llegan por webhook.

Requisitos

  • Una cuenta SMPP creada por el equipo de Hablame. Cómo pedirla.
  • IP públicas fijas: solo las que autorices quedan habilitadas para tu cuenta.
  • Un centro de costo al que se atribuye el consumo.
  • Un cliente SMPP 3.4 (interface_version 0x34). Si quieres acuses, una conexión receiver o transceiver.

Credenciales

Soporte crea tu cuenta y te entrega el servidor, el puerto, tu system_id (hasta 15 caracteres) y tu contraseña (hasta 8 caracteres, el máximo que permite SMPP 3.4). No se publican en este portal.

El mismo puerto atiende conexiones con y sin cifrado: si tu cliente abre con TLS (versión 1.2 o superior), el servidor lo detecta solo. Te recomendamos TLS.

system_type, addr_ton, addr_npi y address_range del bind se aceptan pero no se validan.

Pasos

  1. 01
    Abre la conexión y haz el bind

    Envía el primer byte en menos de 5 s; si usas TLS, completa el saludo en menos de 10 s. El bind debe llegar en menos de 10 s y, en total, antes de 30 s desde que abriste la conexión.

  2. 02
    Envía con submit_sm

    Por una conexión transmitter o transceiver. Pon registered_delivery en 0x01 si quieres el acuse de cada mensaje.

  3. 03
    Guarda el message_id

    Llega en el submit_sm_resp. Es el mismo que trae el acuse, carácter por carácter.

  4. 04
    Recibe y confirma los acuses

    Llegan como deliver_sm por tus conexiones receiver o transceiver de la misma cuenta. Responde cada uno con deliver_sm_resp y estado 0 en menos de 60 s.

No se admiten query_sm, submit_multi, data_sm, replace_sm, cancel_sm: responden generic_nack con 0x00000003 y la conexión sigue abierta.

Mantener la conexión

  • Hablame te envía un enquire_link cada 30 s, haya tráfico o no. Respóndelo siempre: con 2 seguidos sin respuesta, la conexión se cierra.
  • Si tu cliente deja de leer durante 30 s, la conexión se cierra.
  • Puedes enviar tus propios enquire_link, pero solo después del bind: antes reciben 0x00000004.
  • Para cerrar, envía unbind y espera su respuesta.

Límites

Ejemplos

Campos de submit_sm

source_addr
El remitente, hasta 20 caracteres.
destination_addr
El número de destino, hasta 20 caracteres. Obligatorio: sin él, 0x0000000B.
esm_class
0x40 si el texto empieza con una cabecera UDH.
registered_delivery
0x01: acuse con el estado final, sea cual sea. 0x02: acuse solo si el mensaje falla. 0x00: sin acuse. No hay notificaciones intermedias.
data_coding
La codificación del texto (tabla de abajo).
short_message
El texto, hasta 254 octetos. Si el texto es más largo, usa message_payload; si llegan los dos, se usa short_message.
schedule_delivery_time
Hoy no se aplica: el mensaje sale de inmediato. No lo uses para programar envíos.
validity_period
Se acepta y se guarda tal como llega.

Codificación

En SMPP el texto GSM-7 va sin empaquetar: un carácter por octeto. Si lo empaquetas, llega ilegible.

  • En GSM-7 caben ñ, Ñ, é, É, ü, Ü, ¿, ¡. Las vocales con tilde á, í, ó, ú, Á, Í, Ó, Ú no caben: un texto con ellas va en UCS-2 (0x08).
  • En GSM-7, €, [, ], {, }, ~, \, ^, | ocupan dos caracteres cada uno.
  • En UCS-2, un emoji fuera del plano básico ocupa dos caracteres.

Mensajes largos

Tienes dos formas de enviar un texto que no cabe en una parte:

  1. Partirlo tú, con una cabecera UDH de concatenación (IEI 0x00 con referencia de 8 bits o 0x08 con referencia de 16 bits) y esm_class 0x40, o con los TLV sar_msg_ref_num, sar_total_segments y sar_segment_seqnum si no usas UDH. Si llegan las dos cosas, manda la UDH.
  2. Enviarlo entero en el TLV message_payload, sin UDH, dentro del límite de 64 KiB por PDU.

Si lo partes tú, el servidor junta las partes antes de enviarlo: espera hasta 60 minutos desde la primera y admite hasta 255 partes. Las partes se reconocen por organización, referencia, total y destino, así que puedes enviarlas por conexiones distintas de la misma organización. Cada parte recibe su propio message_id y su propio acuse.

Un acuse de ejemplo

short_message de un acuse entregado. Las fechas van en hora de Colombia.
id:0192f0c4-7b1e-7a3d-9c55-3e2a1b4c5d6e sub:001 dlvrd:001 submit date:2610241004 done date:2610241004 stat:DELIVRD err:000 Text:Hola Ana, tu pedido 

Respuestas esperadas

submit_sm_resp

Con estado 0 trae el message_id: un UUID versión 7 de 36 caracteres, uno por PDU, incluida cada parte de un mensaje largo. Con otro estado, el mensaje no se aceptó: mira la tabla de command_status.

Acuses de entrega

Un acuse es el estado final que conocemos de tu mensaje. No garantiza que la persona lo haya leído.

  • Llega como deliver_sm con esm_class 0x04, con las direcciones invertidas: source_addr es el teléfono al que enviaste y destination_addr, tu remitente.
  • Hay un acuse por parte. sub y dlvrd siempre valen 001.
  • submit date es cuando aceptamos el mensaje y done date, cuando se supo el desenlace, los dos en hora de Colombia (UTC−5). Text: trae los primeros 20 caracteres imprimibles ASCII del mensaje, así que en UCS-2 puede quedar casi vacío.
  • Lee el estado mejor de los TLV que del texto: el texto es informativo y los TLV son la forma normalizada. No se devuelve user_message_reference.
Formato del texto del acuse
id:<message_id> sub:001 dlvrd:001 submit date:AAMMDDhhmm done date:AAMMDDhhmm stat:<estado> err:<error> Text:<texto>

Cómo te llegan los acuses

  • Cada conexión que recibe arranca con 5 acuses sin confirmar a la vez y puede subir hasta 50 si respondes rápido.
  • Si no respondes un deliver_sm en 60 s, o respondes con un estado distinto de 0, el acuse se vuelve a enviar. Puede llegarte repetido: descarta los repetidos por receipted_message_id.
  • Si no tienes ninguna conexión que reciba, los acuses esperan y se siguen intentando hasta 72 horas.

Errores habituales

Las respuestas más frecuentes y qué hacer. La lista completa está en Códigos command_status.

Seguridad

  • SMPP 3.4 limita la contraseña a 8 caracteres. Por eso tu cuenta solo acepta conexiones desde las IP que autorizaste, y un bind desde otra recibe 0x0000000A.
  • Tras 5 binds fallidos en un minuto desde la misma IP y el mismo system_id, el resto del minuto se rechaza.
  • Usa TLS 1.2 o superior para que la contraseña y los mensajes no viajen en claro.
  • Guarda la contraseña en tu gestor de secretos y nunca la envíes por correo. Si crees que se filtró, escribe a developers@hablame.co.

Endpoints relacionados

SMPP no usa la API REST: no hay endpoints relacionados. Los SMS entrantes llegan por webhook.

Próximos pasos

¿Necesitas ayuda?

¿Te sirvió esta página?

Ver todos los canales de soporte

Tus preferencias de cookies

Tú decides qué medimos. Puedes cambiar tu elección cuando quieras. Rechazar no te quita ninguna función de la documentación.

Política de privacidad