Jede SMPP-Nachricht ist eine PDU (Protocol Data Unit) mit einem festen 16-Byte-Header, gefolgt von einem operationsspezifischen Body. Der Header besteht aus vier 4-Byte-Ganzzahlen im Big-Endian-Format: command_length, command_id, command_status und sequence_number. command_length zählt die gesamte PDU einschließlich des Headers, sodass ein Empfänger zuerst 4 Bytes liest und dann den Rest.
bind_transceiverSitzung öffnen und authentifizierenbind_transceiver_respSitzung akzeptiertsubmit_smNachricht sendensubmit_sm_respAkzeptiert, Nachrichten-ID zurückgegebendeliver_smZustellungsbericht oder eingehende Nachrichtdeliver_sm_respBestätigtenquire_linkKeepalive im Leerlauf
Der 16-Byte-Header
Jede PDU beginnt mit denselben vier vorzeichenlosen 32-Bit-Ganzzahlen in Netzwerk-Bytereihenfolge (Big-Endian). command_length ist die Gesamtzahl der Oktette der PDU einschließlich dieser 16 Header-Bytes — ein Parser liest die ersten 4 Bytes, erfährt die Gesamtlänge und liest dann den Rest. command_id identifiziert die Operation. command_status ist 0 (ESME_ROK) in Requests und trägt in Responses einen Fehlercode. sequence_number korreliert einen Request mit seiner Response.
| Offset | Feld | Größe | Zweck |
|---|---|---|---|
| 0 | command_length | 4 Oktette | Gesamtlänge der PDU in Oktetten, einschließlich Header |
| 4 | command_id | 4 Oktette | Operations-Identifikator (z. B. submit_sm = 0x00000004) |
| 8 | command_status | 4 Oktette | 0 in einer Anfrage; Fehlercode in einer Antwort |
| 12 | sequence_number | 4 Oktette | Korreliert Anfrage↔Antwort (0x00000001–0x7FFFFFFF) |
command_id und das Response-Bit
Jede Operation hat eine command_id. Die zugehörige Response verwendet denselben Wert mit gesetztem höchstwertigem Bit (logisches OR mit 0x80000000). So ist submit_sm 0x00000004 und submit_sm_resp 0x80000004. generic_nack (0x80000000) ist die Sammel-Fehlerantwort für eine nicht parsbare oder ungültige PDU.
| Operation | Request | Response |
|---|---|---|
| generic_nack | — | 0x80000000 |
| bind_receiver | 0x00000001 | 0x80000001 |
| bind_transmitter | 0x00000002 | 0x80000002 |
| query_sm | 0x00000003 | 0x80000003 |
| submit_sm | 0x00000004 | 0x80000004 |
| deliver_sm | 0x00000005 | 0x80000005 |
| unbind | 0x00000006 | 0x80000006 |
| replace_sm | 0x00000007 | 0x80000007 |
| cancel_sm | 0x00000008 | 0x80000008 |
| bind_transceiver | 0x00000009 | 0x80000009 |
| enquire_link | 0x00000015 | 0x80000015 |
| data_sm | 0x00000103 | 0x80000103 |
Der Body und wie Felder codiert werden
Nach dem Header folgt der operationsspezifische Body aus Pflichtparametern, optional gefolgt von optionalen TLV-Parametern. SMPP verwendet drei Feldcodierungen. Ganzzahlen sind fester Größe, vorzeichenlos und Big-Endian. C-Octet Strings sind ASCII-Text, terminiert durch ein NULL (0x00), mit einer angegebenen Maximallänge, die den Terminator einschließt. Octet Strings sind rohe Byte-Felder, deren Länge durch ein vorangestelltes Längenfeld angegeben wird (zum Beispiel short_message, dessen Größe durch sm_length bestimmt wird).
| Typ | Kodierung |
|---|---|
| Integer | Feste 1/2/4 Oktette, vorzeichenlos, Big-Endian (Netzwerk-Byte-Reihenfolge) |
| C-Octet String | NUL-terminiertes ASCII; die maximale Länge schließt das 0x00-Abschlusszeichen ein |
| C-Octet String (Decimal/Hex) | Wie oben, jedoch beschränkt auf dezimale oder hexadezimale ASCII-Ziffern |
| Octet String | Rohbytes; Länge wird durch ein separates Längenfeld angegeben, kein Abschlusszeichen |
Ein durchgerechnetes Beispiel: submit_sm auf der Leitung
Eine minimale submit_sm-PDU. Die command_length des Headers (0x0000003D = 61) ist die Gesamt-Byte-Zahl; command_id 0x00000004 ist submit_sm; command_status 0 kennzeichnet einen Request; sequence_number 0x0000000F korreliert die Response. Der Body folgt dann in der festen Feldreihenfolge, die die Spezifikation definiert.
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_messageHäufig gestellte Fragen
Schließt command_length den Header ein?
Ja. command_length ist die Gesamtlänge der gesamten PDU in Oktetten, einschließlich des 16-Byte-Headers. Ein Empfänger liest genau command_length Bytes, um eine vollständige PDU aus dem TCP-Stream zu entnehmen.
Welche Bytereihenfolge verwendet SMPP?
Netzwerk-Bytereihenfolge — Big-Endian — für alle mehroktettigen Ganzzahlfelder, einschließlich jedes Feldes im Header. Ein 4-Byte-Wert von 61 wird als 00 00 00 3D übertragen.
Wie werden Textfelder terminiert?
Textfelder sind C-Octet Strings: ASCII-Zeichen, terminiert durch ein einzelnes NULL-Byte (0x00). Ein leerer C-Octet String ist nur das NULL-Byte. Die angegebene Maximallänge schließt diesen Terminator ein.
Was ist ein generic_nack?
generic_nack (command_id 0x80000000) ist die Antwort, die der Empfänger zurückgibt, wenn eine PDU nicht geparst werden kann oder grundlegend ungültig ist — zum Beispiel bei fehlerhafter command_length oder unbekannter command_id. Der zugehörige command_status trägt den Grund.
Wie grenzt ein Empfänger PDUs im TCP-Stream ab?
TCP ist ein Byte-Stream ohne Nachrichtengrenzen, daher liest der Empfänger die ersten 4 Bytes, um die command_length zu ermitteln, und liest dann so viele Bytes insgesamt, um eine vollständige PDU zu isolieren, bevor er den Rest von Header und Body parst.
Quellenspezifikationen
Diese Seite basiert auf den veröffentlichten Standards. (Wird in einem neuen Tab geöffnet.)