Un bind autentica y abre una sesión SMPP. bind_transmitter solo permite enviar, bind_receiver solo recibir y bind_transceiver ambos sobre una única conexión. El ESME aporta system_id, password y system_type; el SMSC responde con un bind_resp. Un bind correcto lleva la sesión a un estado enlazado hasta el unbind o la desconexión.
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
Los tres tipos de bind
El tipo de bind fija la dirección del tráfico para la sesión. Elige transmitter para solo salida (envío MT), receiver para solo entrada (MO y confirmaciones de entrega) o transceiver para transportar ambas direcciones por una sola conexión: la opción habitual en v3.4, ya que reduce a la mitad el número de conexiones que hay que mantener.
| Operación | command_id | La sesión puede |
|---|---|---|
| bind_transmitter | 0x00000002 | Enviar mensajes (MT) solamente |
| bind_receiver | 0x00000001 | Solo recibir mensajes/confirmaciones (MO + DLR) |
| bind_transceiver | 0x00000009 | Enviar y recibir en una misma conexión |
Campos de la solicitud bind
El cuerpo del bind transporta las credenciales y las capacidades declaradas del ESME. system_id y password autentican la cuenta; system_type categoriza opcionalmente el ESME; interface_version declara la versión de SMPP; addr_ton, addr_npi y address_range permiten al SMSC enrutar hacia este bind el tráfico originado en el móvil. Un address_range mal ajustado bloquea de forma silenciosa el enrutamiento de MO/DLR en un bind receiver o transceiver, un fallo de integración habitual.
| Campo | Tipo | Máx. | Notas |
|---|---|---|---|
| system_id | C-Octet String | 16 | Identificador de cuenta/inicio de sesión |
| password | C-Octet String | 9 | Contraseña de la cuenta |
| system_type | C-Octet String | 13 | Categoría ESME opcional (a menudo vacía) |
| interface_version | Integer | 1 | 0x34 = v3.4, 0x50 = v5.0 |
| addr_ton | Integer | 1 | Tipo de número para enrutar el MO a este ESME |
| addr_npi | Integer | 1 | Indicador del plan de numeración |
| address_range | C-Octet String | 41 | Dirección/regex que el SMSC enruta a este bind |
Respuesta al bind
El SMSC responde con el bind_resp correspondiente (por ejemplo bind_transceiver_resp, 0x80000009). command_status es ESME_ROK si tiene éxito, o un error como ESME_RINVPASWD (contraseña no válida), ESME_RINVSYSID (identificador de sistema no válido) o ESME_RBINDFAIL. El cuerpo devuelve el system_id del SMSC y, en v3.4+, un TLV opcional sc_interface_version que indica al ESME qué versión admite realmente el SMSC.
ESME → SMSC bind_transceiver seq=1 system_id=acme password=****
SMSC → ESME bind_transceiver_resp seq=1 status=ESME_ROK system_id=smsc01
(session now BOUND_TRX — submit_sm and deliver_sm may flow)Estados de sesión
Una sesión SMPP es una pequeña máquina de estados. Comienza en OPEN tras la conexión TCP, pasa a un estado BOUND con un bind correcto y vuelve a UNBOUND y luego CLOSED con el unbind o la desconexión. Enviar una operación ilegal para el estado actual devuelve ESME_RINVBNDSTS (estado de bind incorrecto). Hacer bind dos veces en una conexión devuelve ESME_RALYBND (ya enlazado).
| Estado | Significado |
|---|---|
| OPEN | Conectado por TCP, aún sin bind |
| BOUND_TX | Vinculado como transmisor: puede enviar |
| BOUND_RX | Vinculado como receptor: puede recibir |
| BOUND_TRX | Vinculado como transceptor: puede enviar y recibir |
| UNBOUND | Unbind emitido, pendiente de cierre |
| CLOSED | Conexión cerrada |
Unbind y outbind
unbind (0x00000006) solicita un cierre ordenado de la sesión; el otro extremo responde unbind_resp y ambos cierran la conexión TCP. outbind (0x0000000B) es el caso inverso: el SMSC pide a un ESME en escucha que inicie un bind receiver, se usa cuando el SMSC necesita entregar tráfico MO a un ESME que normalmente espera conexiones.
Preguntas frecuentes
¿Debo usar pares transmitter/receiver o un transceiver?
Prefiere un transceiver cuando el proveedor lo permita: una sola conexión transporta envío y recepción, reduce a la mitad el número de conexiones y simplifica la correlación de las confirmaciones de entrega. Usa bind transmitter y receiver separados solo cuando el proveedor exija separación por dirección.
¿Para qué sirve system_type?
system_type identifica opcionalmente la categoría del ESME (por ejemplo, una clase de aplicación concreta). Muchos proveedores lo dejan vacío. Ajústalo solo al valor exacto que provisione el proveedor, ya que algunos enrutan en función de él.
¿Por qué mi bind receiver no recibe confirmaciones de entrega?
La causa más común es un desajuste de address_range / addr_ton / addr_npi: el SMSC enruta el tráfico MO y DLR al bind cuyo address_range coincide, así que un valor erróneo los retiene de forma silenciosa. Confirma los valores exactos provisionados con el proveedor.
¿Qué significa ESME_RALYBND?
ESME_RALYBND (0x00000005) significa que el ESME ya está en estado enlazado e intentó hacer bind de nuevo en la misma sesión. Haz bind exactamente una vez por conexión; si viste un bind fallido, abre una conexión nueva en lugar de volver a enlazar la antigua.
¿Cuántos bind simultáneos puedo abrir?
Es un límite comercial fijado por tu proveedor, no por el protocolo. Abrir más bind de los provisionados es una causa frecuente de limitación o suspensión de la cuenta: acuerda por escrito el número de bind y el TPS por bind antes de escalar.
Especificaciones de la fuente
Las normas publicadas en las que se basa esta página. Se abre en una pestaña nueva.