BroadNet
Protocolli Intermedio

Fondamenti di SMPP

Il protocollo binario dietro l'SMS ad alto volume: tipi di bind, submit_sm, PDU, la finestra di trasmissione, ricevute di consegna e keepalive.

5 lezioni4 min di letturaBasato su standard · a ritmo personalizzato
DiagrammaUna sessione SMPP tra la vostra piattaforma e BroadNet
La vostra piattaforma (ESME)
BroadNet SMSC
Una connessione TCP/TLS persistente
  1. bind_transceiverAprire e autenticare la sessione
  2. bind_transceiver_respSessione accettata
  3. submit_smInviare un messaggio
  4. submit_sm_respAccettato, ID messaggio restituito
  5. deliver_smRicevuta di consegna o messaggio in entrata
  6. deliver_sm_respConfermato
  7. enquire_linkKeepalive durante l'inattività
Lezione 01

Cos'è l'SMPP

SMPP — Short Message Peer-to-Peer — è il protocollo binario e basato su sessione che aggregatori e operatori espongono per la messaggistica A2P ad alto throughput. Mentre un'API REST è comoda e stateless, l'SMPP è una connessione TCP persistente costruita per volume e bassa latenza.

Un ESME (External Short Messaging Entity — la sua parte) apre una sessione verso l'SMSC e scambia PDU (Protocol Data Unit). Il protocollo è compatto ed efficiente, ed è per questo che resta la spina dorsale per i grandi mittenti anche mentre il REST copre l'uso quotidiano.

La versione più diffusa è l'SMPP v3.4; la v5.0 aggiunge la segnalazione dello stato di congestione e parametri avanzati, ma è retrocompatibile. Non dovrebbe mai presumere che una funzione della v5.0 sia disponibile finché la risposta al bind non conferma la versione negoziata.

Lezione 02

Tipi di bind e sessioni

Prima di inviare qualsiasi cosa, un ESME deve effettuare il bind — autenticarsi e dichiarare un ruolo. Un bind transmitter invia solo messaggi; un bind receiver riceve solo messaggi mobile-originated e ricevute di consegna; un bind transceiver fa entrambe le cose su un'unica connessione.

Il transceiver è di solito preferito perché dimezza il numero di connessioni e semplifica la correlazione tra DLR e invii. Il numero di bind concorrenti e i messaggi al secondo per bind (TPS) sono forniti dal provider e vanno rispettati.

Il bind trasporta un system_id, una password, un system_type e un address_range. Un address_range non corrispondente interrompe silenziosamente l'instradamento di MO e DLR sui bind receiver — un classico bug di integrazione che non produce errori, solo traffico mancante.

Lezione 03

PDU e submit_sm

Ogni interazione SMPP è un PDU con un'intestazione di comando (lunghezza, command id, status, numero di sequenza) e un corpo. Il fulcro è submit_sm, che trasporta un singolo messaggio in uscita.

Due coppie di campi decidono l'indirizzamento: source_addr con il proprio TON/NPI (type-of-number / numbering-plan-indicator) e dest_addr con il proprio. Un sender ID alfanumerico usa TON 5; un MSISDN internazionale usa TON 1, NPI 1. Se questi valori sono sbagliati, il sender ID viene visualizzato in modo errato oppure il messaggio viene respinto.

Il campo data_coding imposta la codifica — GSM a 7 bit (0), 8 bit (4), oppure UCS-2 (8) per Unicode. I messaggi lunghi vengono concatenati sia con byte UDH nel corpo, sia con i parametri opzionali SAR (sar_msg_ref_num, sar_total_segments, sar_segment_seqnum); scelga un metodo e vi rimanga coerente, perché le rotte differiscono su quale accettano.

Lezione 04

La finestra, il throttling e i keepalive

L'SMPP utilizza una finestra di trasmissione: un limite al numero di PDU submit_sm inviati prima che arrivino le rispettive risposte. Superare la finestra, o il TPS previsto, genera ESME_RTHROTTLED (0x58). La risposta corretta è rallentare con jitter, non ripetere i tentativi in loop stretto.

Per rilevare una connessione TCP semiaperta, ciascuna parte invia enquire_link su un timer di inattività (comunemente ogni 30–60 secondi) e si attende un enquire_link_resp. Una risposta mancata significa che la sessione è morta e va ristabilita con backoff esponenziale.

L'arresto controllato usa unbind / unbind_resp. Le disconnessioni impreviste dovrebbero attivare una riconnessione con backoff e ritentativi idempotenti, così che una finestra interrotta non causi invii duplicati e doppia fatturazione.

Lezione 05

Ricevute di consegna su SMPP

Le ricevute di consegna arrivano come PDU deliver_sm. Il testo della ricevuta nel campo short_message contiene id, sub, dlvrd, data di invio, data di completamento, lo stat finale (DELIVRD, UNDELIV, EXPIRED, REJECTD) e un codice err.

Correli il DLR al proprio invio originale usando il message_id del provider, non solo il testo della ricevuta — il message_id può essere restituito in esadecimale su submit_resp ma in decimale nel DLR, quindi normalizzi entrambi i formati.

Risponda sempre con un deliver_sm_resp. Un DLR non riconosciuto viene reinviato dall'SMSC e può bloccare la finestra di ricezione, quindi confermi tempestivamente anche se l'elaborazione a valle è asincrona.

Punti chiave
  • L'SMPP è una sessione binaria persistente per l'A2P ad alto volume; la v3.4 è la base comune, la v5.0 è retrocompatibile.
  • Il bind avviene come transmitter, receiver o transceiver; il transceiver dimezza le connessioni e facilita la correlazione dei DLR.
  • TON/NPI decidono la visualizzazione del sender ID e data_coding decide la codifica — entrambi facili da sbagliare.
  • Rispetti la finestra e il TPS, rallenti su ESME_RTHROTTLED e mantenga attiva la sessione con enquire_link.
Mettilo in pratica

Metti in pratica ciò che hai appena imparato.

Parla con un vero ingegnere del tuo caso d'uso, oppure apri la documentazione per sviluppatori e invia un messaggio attraverso i canali descritti in questo corso.

Perché imparare da BroadNet
  • Da2003
  • Paesi200+
  • Collegamenti dell'operatore1,000+