# SMPP submit_sm: ogni campo obbligatorio

> submit_sm (command_id 0x00000004) invia un messaggio mobile-terminated dall'ESME all'SMSC. Il suo body è una sequenza fissa di campi obbligatori — indirizzamento (TON/NPI + address), esm_class, protocol_id, priority_flag, pianificazione, registered_delivery, data_coding, sm_length e short_message — opzionalmente seguita da TLV. submit_sm_resp restituisce il message_id dell'SMSC.

- URL canonico: https://www.broadnet.me/it/reference/smpp-submit-sm
- Lingua: it
- Ultimo aggiornamento: 2026-07-18
- Editore: BroadNet (https://www.broadnet.me)

Un riferimento completo campo per campo di submit_sm — service_type, TON/NPI, esm_class, data_coding, registered_delivery, validity_period, short_message e gli altri — con i valori che contano davvero.

## L'ordine completo dei campi obbligatori

Il body di submit_sm è una sequenza fissa e ordinata — non ci sono tag di campo, quindi l'ordine e la dimensione sono tutto. La tabella elenca tutti i parametri obbligatori nell'ordine di trasmissione. short_message può essere vuoto quando il testo è trasportato invece in un TLV message_payload; non popolate entrambi.

*Parametri obbligatori di submit_sm (in ordine di trasmissione)*

| # | Campo | Tipo | Note |
|---|---|---|---|
| 1 | service_type | C-Octet String (6) | Categoria di servizio; solitamente vuota |
| 2 | source_addr_ton | Integer (1) | Tipo di numero del mittente |
| 3 | source_addr_npi | Integer (1) | Piano di numerazione del mittente |
| 4 | source_addr | C-Octet String (21) | Indirizzo del mittente / ID alfanumerico |
| 5 | dest_addr_ton | Integer (1) | Tipo di numero del destinatario |
| 6 | dest_addr_npi | Integer (1) | Piano di numerazione del destinatario |
| 7 | destination_addr | C-Octet String (21) | MSISDN del destinatario |
| 8 | esm_class | Integer (1) | Modalità messaggio + tipo + flag UDHI |
| 9 | protocol_id | Integer (1) | GSM TP-PID; solitamente 0 |
| 10 | priority_flag | Integer (1) | 0 (normale) – 3 (massimo) |
| 11 | schedule_delivery_time | C-Octet String (1\|17) | Vuoto = immediato |
| 12 | validity_period | C-Octet String (1\|17) | Vuoto = predefinito SMSC |
| 13 | registered_delivery | Integer (1) | Richiedi la conferma di consegna |
| 14 | replace_if_present_flag | Integer (1) | 0 = no, 1 = sostituisci |
| 15 | data_coding | Integer (1) | Codifica / DCS |
| 16 | sm_default_msg_id | Integer (1) | ID del messaggio predefinito; solitamente 0 |
| 17 | sm_length | Integer (1) | Lunghezza di short_message (0–254) |
| 18 | short_message | Octet String (0–254) | Il payload del messaggio |

## Indirizzamento: TON e NPI

source_addr e destination_addr trasportano ciascuno un Type of Number (TON) e un Numbering Plan Indicator (NPI). Per un MSISDN internazionale usate TON 1 (International) con NPI 1 (ISDN/E.164). Per un sender ID alfanumerico usate TON 5 (Alphanumeric) — source_addr contiene allora fino a 11 caratteri GSM-7. Un TON/NPI errato è una delle principali cause di traffico non consegnato o mal instradato.

*Valori comuni di TON e NPI*

| TON | Significato | NPI | Significato |
|---|---|---|---|
| 0 | Sconosciuto | 0 | Sconosciuto |
| 1 | Internazionale | 1 | ISDN (E.163/E.164) |
| 2 | Nazionale | 3 | Dati (X.121) |
| 3 | Specifico della rete | 4 | Telex (F.69) |
| 4 | Numero di abbonato | 6 | Land Mobile (E.212) |
| 5 | Alfanumerico | 8 | Nazionale |
| 6 | Abbreviato | 9 | Privato |

## esm_class

esm_class è un campo di bit che imposta la modalità di messaggistica, il tipo di messaggio e le funzionalità specifiche del GSM. Il bit più importante per i mittenti è UDHI (0x40): impostatelo quando short_message inizia con un User Data Header, ad esempio un header di concatenazione. Il bit 0x80 richiede il reply path GSM.

*Significato dei bit di esm_class (selezione)*

| Bit | Campo | Valore → significato |
|---|---|---|
| 1–0 | Modalità di messaggistica | 0 predefinito · 1 datagramma · 2 inoltra · 3 memorizza e inoltra |
| 5–2 | Tipo di messaggio | 0 predefinito · 0x04 conferma di consegna · 0x08 ack di consegna · 0x10 ack utente |
| 6 | UDHI | 0x40 = short_message begins with a UDH |
| 7 | Percorso di risposta | 0x80 = set GSM reply path |

## data_coding, registered_delivery e validità

data_coding seleziona la codifica del testo: 0x00 = predefinita dell'SMSC (di norma GSM 7-bit), 0x04 = binario a 8 bit, 0x08 = UCS-2 per Unicode. I due bit meno significativi di registered_delivery controllano le ricevute: 0 = nessuna, 1 = ricevuta al successo o fallimento finale, 2 = solo in caso di fallimento. validity_period e schedule_delivery_time usano la forma assoluta YYMMDDhhmmsstnnp o una forma relativa; una stringa vuota indica consegna immediata e validità predefinita dell'SMSC. Mantenete validity_period breve per gli OTP, così un codice ritardato scade invece di arrivare obsoleto.

*data_coding — i valori che si usano davvero*

| Valore | Codifica |
|---|---|
| 0x00 | Alfabeto predefinito SMSC (solitamente GSM a 7 bit) |
| 0x03 | Latin-1 (ISO-8859-1) |
| 0x04 | Binario a 8 bit (ottetto non specificato) |
| 0x08 | UCS-2 (UTF-16BE) — Unicode |

## La risposta

submit_sm_resp (0x80000004) restituisce command_status e, in caso di successo, un message_id (C-Octet String, fino a 65 caratteri) che l'SMSC assegna al messaggio. Conservatelo: è la chiave da confrontare con il receipted_message_id nella ricevuta di consegna. Attenzione alle discrepanze di formato — alcuni SMSC restituiscono l'id in esadecimale al submit e in decimale nel DLR, quindi normalizzate entrambi in fase di correlazione.

## Domande frequenti

### Quali TON/NPI uso per un sender ID alfanumerico?

Usate source_addr_ton = 5 (Alphanumeric) e source_addr_npi = 0 (Unknown). source_addr contiene allora fino a 11 caratteri GSM-7. I sender ID alfanumerici sono solo di visualizzazione e non possono ricevere risposte.

### Come richiedo una ricevuta di consegna in submit_sm?

Impostate registered_delivery = 1 per ottenere una ricevuta alla consegna o al fallimento finale, oppure 2 solo in caso di fallimento. Richiedete le ricevute solo dove le utilizzate effettivamente, poiché i DLR non letti sprecano throughput.

### Qual è la lunghezza massima di short_message?

Il campo short_message contiene fino a 254 ottetti, con sm_length che ne indica il conteggio esatto. Per testi più lunghi, segmentate con un UDH su più PDU submit_sm oppure trasportate l'intero payload nel TLV message_payload invece che in short_message.

### Posso impostare sia short_message sia message_payload?

No. Popolate l'uno o l'altro. I provider rifiutano una submit_sm che trasporta il messaggio sia nel campo obbligatorio short_message sia nel TLV message_payload.

### Come invio un messaggio Unicode?

Impostate data_coding = 0x08 (UCS-2) e codificate il testo come UTF-16 big-endian in short_message. Un singolo SMS UCS-2 contiene 70 caratteri; il testo Unicode più lungo viene segmentato a 67 caratteri per parte.

## Fonti

- [SMPP v3.4 specification — §4.4 submit_sm](https://smpp.org/SMPP_v3_4_Issue1_2.pdf)
- [3GPP TS 23.040 — SMS technical realization](https://www.3gpp.org/dynareport/23040.htm)

## Correlati

- [SMPP deliver_sm e messaggi MO](https://www.broadnet.me/it/reference/smpp-deliver-sm)
- [Schema di codifica dei dati (DCS)](https://www.broadnet.me/it/reference/data-coding-scheme-dcs)
- [Segmentazione SMS e UDH](https://www.broadnet.me/it/reference/sms-segmentation-concatenation-udh)
- [Decoder PDU SMPP (strumento gratuito)](https://www.broadnet.me/it/tools/smpp-pdu-decoder)
- [Prodotto SMS API](https://www.broadnet.me/it/products/sms-api)
