BroadNet
SMPPFormato di trasmissione

Anatomia della PDU SMPP: header e body

Aggiornato il 3 min di letturaBasato su standard
Risposta diretta

Ogni messaggio SMPP è una PDU (Protocol Data Unit) con un header fisso di 16 byte seguito da un body specifico dell'operazione. L'header è costituito da quattro interi big-endian da 4 byte: command_length, command_id, command_status e sequence_number. command_length conteggia l'intera PDU header incluso, quindi il ricevente legge prima 4 byte e poi il resto.

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à
§01

L'header di 16 byte

Ogni PDU inizia con gli stessi quattro interi a 32 bit senza segno in ordine di rete (big-endian). command_length è il numero totale di ottetti della PDU inclusi questi 16 byte di header: un parser legge i primi 4 byte, ricava la lunghezza completa e legge il resto. command_id identifica l'operazione. command_status vale 0 (ESME_ROK) nelle richieste e trasporta un codice di errore nelle risposte. sequence_number correla una richiesta con la sua risposta.

Campi dell'header SMPP (16 byte, big-endian)
OffsetCampoDimensioneScopo
0command_length4 octetsLunghezza totale della PDU in ottetti, intestazione inclusa
4command_id4 octetsIdentificatore operazione (es. submit_sm = 0x00000004)
8command_status4 octets0 in una richiesta; codice di errore in una risposta
12sequence_number4 octetsCorrelaziona richiesta↔risposta (0x00000001–0x7FFFFFFF)
§02

command_id e il bit di risposta

Ogni operazione ha un command_id. La risposta corrispondente usa lo stesso valore con il bit più significativo impostato (OR logico con 0x80000000). Così submit_sm è 0x00000004 e submit_sm_resp è 0x80000004. generic_nack (0x80000000) è la risposta di errore generica per una PDU non interpretabile o non valida.

Valori comuni di command_id
OperazioneRichiestaRisposta
generic_nack—0x80000000
bind_receiver0x000000010x80000001
bind_transmitter0x000000020x80000002
query_sm0x000000030x80000003
submit_sm0x000000040x80000004
deliver_sm0x000000050x80000005
unbind0x000000060x80000006
replace_sm0x000000070x80000007
cancel_sm0x000000080x80000008
bind_transceiver0x000000090x80000009
enquire_link0x000000150x80000015
data_sm0x000001030x80000103
§03

Il body e come sono codificati i campi

Dopo l'header viene il body specifico dell'operazione con i parametri obbligatori, opzionalmente seguito dai parametri opzionali TLV. SMPP utilizza tre codifiche di campo. Gli interi sono a dimensione fissa, senza segno, big-endian. Le C-Octet String sono testo ASCII terminato da un NULL (0x00), con una lunghezza massima dichiarata che include il terminatore. Le Octet String sono campi di byte grezzi la cui lunghezza è indicata da un campo di lunghezza precedente (ad esempio short_message, la cui dimensione è fissata da sm_length).

Codifiche dei campi SMPP
TipoCodifica
IntegerInteri senza segno a 1/2/4 ottetti fissi, big-endian (ordine dei byte di rete)
C-Octet StringASCII terminato da NUL; la lunghezza massima include il terminatore 0x00
C-Octet String (Decimal/Hex)Come sopra, ma limitato alle cifre ASCII decimali o esadecimali
Octet StringByte grezzi; la lunghezza è fornita da un campo di lunghezza separato, senza terminatore
§04

Un esempio pratico: submit_sm sul filo

Una PDU submit_sm minimale. Il command_length dell'header (0x0000003D = 61) è il numero totale di byte; command_id 0x00000004 è submit_sm; command_status 0 indica una richiesta; sequence_number 0x0000000F correla la risposta. Il body segue poi nell'ordine fisso dei campi definito dalla specifica.

Header submit_sm + inizio del body (annotato)hex
00 00 00 3D   command_length = 61
00 00 00 04   command_id     = submit_sm
00 00 00 00   command_status = ESME_ROK (request)
00 00 00 0F   sequence_number = 15
-- body --
00            service_type    = "" (NULL)
05            source_addr_ton = 5 (alphanumeric)
00            source_addr_npi = 0 (unknown)
42 4E 00      source_addr     = "BN" + NULL
01            dest_addr_ton   = 1 (international)
01            dest_addr_npi   = 1 (E.164/ISDN)
...           destination_addr, esm_class, ... short_message
FAQ

Domande frequenti

command_length include l'header?

Sì. command_length è la lunghezza totale dell'intera PDU in ottetti, inclusi i 16 byte di header. Un ricevente legge esattamente command_length byte per consumare un'intera PDU dallo stream TCP.

Quale ordine dei byte usa SMPP?

L'ordine di rete — big-endian — per tutti i campi interi multi-ottetto, inclusi tutti i campi dell'header. Un valore a 4 byte pari a 61 viene trasmesso come 00 00 00 3D.

Come sono terminati i campi di testo?

I campi di testo sono C-Octet String: caratteri ASCII terminati da un singolo byte NULL (0x00). Una C-Octet String vuota è composta dal solo byte NULL. La lunghezza massima dichiarata include quel terminatore.

Che cos'è una generic_nack?

generic_nack (command_id 0x80000000) è la risposta che il ricevente restituisce quando una PDU non può essere interpretata o è fondamentalmente non valida — ad esempio per un command_length errato o un command_id sconosciuto. Il suo command_status ne indica il motivo.

Come delimita le PDU un ricevente sullo stream TCP?

TCP è uno stream di byte senza confini di messaggio, quindi il ricevente legge i primi 4 byte per ottenere command_length, poi legge quel numero totale di byte per isolare una PDU completa prima di interpretare il resto dell'header e il body.

Riferimenti

Specifiche della fonte

Gli standard pubblicati su cui si basa questa pagina. Si apre in una nuova scheda.

BNGestito dal team di ingegneri BroadNet·Servizi di messaggistica di livello carrier dal 2003
Mettilo sul filo

Realizzato con un vero binding SMPP e un'API REST.

Richiedi l'accesso di prova con chiavi di test reali: invia prima al tuo numero verificato, poi passa alla produzione in oltre 200 paesi una volta approvata l'identità del mittente e i percorsi.