BroadNet
SMPPSession

SMPP bind operations and session states

Updated 3 min readStandards-based
Direct answer

A bind authenticates and opens an SMPP session. bind_transmitter allows sending only, bind_receiver receiving only, and bind_transceiver both on one connection. The ESME supplies system_id, password and system_type; the SMSC replies with a bind_resp. A successful bind moves the session into a bound state until unbind or disconnect.

DiagramAn SMPP session between your platform and BroadNet
Your platform (ESME)
BroadNet SMSC
One persistent TCP/TLS connection
  1. bind_transceiverOpen and authenticate the session
  2. bind_transceiver_respSession accepted
  3. submit_smSend a message
  4. submit_sm_respAccepted, message ID returned
  5. deliver_smDelivery receipt or inbound message
  6. deliver_sm_respAcknowledged
  7. enquire_linkKeepalive while idle
§01

The three bind types

The bind type fixes the traffic direction for the session. Choose transmitter for outbound-only (MT submit), receiver for inbound-only (MO and delivery receipts), or transceiver to carry both directions over a single connection — the usual choice on v3.4, as it halves the number of connections you maintain.

Bind operations
Operationcommand_idSession can
bind_transmitter0x00000002Submit messages (MT) only
bind_receiver0x00000001Receive messages / receipts (MO + DLR) only
bind_transceiver0x00000009Both submit and receive on one connection
§02

Bind request fields

The bind body carries the credentials and the ESME's declared capabilities. system_id and password authenticate the account; system_type optionally categorises the ESME; interface_version declares the SMPP version; addr_ton, addr_npi and address_range let the SMSC route mobile-originated traffic to this bind. A mismatched address_range silently blocks MO/DLR routing on a receiver or transceiver bind — a common integration bug.

bind_transmitter/receiver/transceiver body
FieldTypeMaxNotes
system_idC-Octet String16Account/login identifier
passwordC-Octet String9Account password
system_typeC-Octet String13Optional ESME category (often empty)
interface_versionInteger10x34 = v3.4, 0x50 = v5.0
addr_tonInteger1Type of number for routing MO to this ESME
addr_npiInteger1Numbering plan indicator
address_rangeC-Octet String41Address/regex the SMSC routes to this bind
§03

Bind response

The SMSC replies with the matching bind_resp (for example bind_transceiver_resp, 0x80000009). command_status is ESME_ROK on success or an error such as ESME_RINVPASWD (invalid password), ESME_RINVSYSID (invalid system ID) or ESME_RBINDFAIL. The body returns the SMSC's system_id and, on v3.4+, an optional sc_interface_version TLV telling the ESME which version the SMSC actually supports.

Successful transceiver bind exchangetext
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)
§04

Session states

An SMPP session is a small state machine. It starts OPEN after the TCP connection, moves to a BOUND state on a successful bind, and returns to UNBOUND then CLOSED on unbind or disconnect. Sending an operation that is illegal for the current state returns ESME_RINVBNDSTS (incorrect bind status). Binding twice on one connection returns ESME_RALYBND (already bound).

SMPP session states
StateMeaning
OPENTCP connected, not yet bound
BOUND_TXBound as transmitter — may submit
BOUND_RXBound as receiver — may receive
BOUND_TRXBound as transceiver — may submit and receive
UNBOUNDUnbind issued, awaiting close
CLOSEDConnection torn down
§05

Unbind and outbind

unbind (0x00000006) requests a graceful session close; the peer replies unbind_resp and both sides close the TCP connection. outbind (0x0000000B) is the reverse-direction case: the SMSC asks a listening ESME to initiate a receiver bind, used where the SMSC needs to deliver MO traffic to an ESME that normally waits for connections.

FAQ

Frequently asked

Should I use transmitter/receiver pairs or a transceiver?

Prefer a transceiver where the provider allows it — one connection carries both submit and receive, halving connection count and simplifying correlation of delivery receipts. Use separate transmitter and receiver binds only when the provider requires directional separation.

What is system_type for?

system_type optionally identifies the category of ESME (for example a specific application class). Many providers leave it empty. Set it only to the exact value the provider provisions, since some route on it.

Why is my receiver bind not getting delivery receipts?

The most common cause is an address_range / addr_ton / addr_npi mismatch: the SMSC routes MO and DLR traffic to the bind whose address_range matches, so a wrong value silently withholds them. Confirm the exact provisioned values with the provider.

What does ESME_RALYBND mean?

ESME_RALYBND (0x00000005) means the ESME is already in a bound state and tried to bind again on the same session. Bind exactly once per connection; if you saw a failed bind, open a fresh connection rather than re-binding the old one.

How many concurrent binds can I open?

That is a commercial limit set by your provider, not the protocol. Opening more binds than provisioned is a frequent cause of throttling or account suspension — agree the bind count and per-bind TPS in writing before you scale.

References

Source specifications

The published standards this page is grounded in. Opens in a new tab.

BNMaintained by the BroadNet engineering team·Carrier-grade messaging since 2003
Put it on the wire

Build with a real SMPP bind and REST API.

Request test access with real test keys: send to your own verified number first, then move to production across 200+ countries once your sender identity and routes are approved.