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.
bind_transceiverAprire e autenticare la sessionebind_transceiver_respSessione accettatasubmit_smInviare un messaggiosubmit_sm_respAccettato, ID messaggio restituitodeliver_smRicevuta di consegna o messaggio in entratadeliver_sm_respConfermatoenquire_linkKeepalive durante l'inattività
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.
| # | 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.
| 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.
| 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.
| 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.
Specifiche della fonte
Gli standard pubblicati su cui si basa questa pagina. Si apre in una nuova scheda.