BroadNet
SMPPWire-Format

SMPP-PDU-Anatomie: Header und Body

Aktualisiert am 3 Min. LesezeitStandardsbasiert
Direkte Antwort

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.

DiagrammEine SMPP-Sitzung zwischen Ihrer Plattform und BroadNet
Ihre Plattform (ESME)
BroadNet SMSC
Eine dauerhafte TCP/TLS-Verbindung
  1. bind_transceiverSitzung öffnen und authentifizieren
  2. bind_transceiver_respSitzung akzeptiert
  3. submit_smNachricht senden
  4. submit_sm_respAkzeptiert, Nachrichten-ID zurückgegeben
  5. deliver_smZustellungsbericht oder eingehende Nachricht
  6. deliver_sm_respBestätigt
  7. enquire_linkKeepalive im Leerlauf
§01

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.

SMPP-Header-Felder (16 Bytes, Big-Endian)
OffsetFeldGrößeZweck
0command_length4 OktetteGesamtlänge der PDU in Oktetten, einschließlich Header
4command_id4 OktetteOperations-Identifikator (z. B. submit_sm = 0x00000004)
8command_status4 Oktette0 in einer Anfrage; Fehlercode in einer Antwort
12sequence_number4 OktetteKorreliert Anfrage↔Antwort (0x00000001–0x7FFFFFFF)
§02

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.

Gängige command_id-Werte
OperationRequestResponse
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

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).

SMPP-Feldcodierungen
TypKodierung
IntegerFeste 1/2/4 Oktette, vorzeichenlos, Big-Endian (Netzwerk-Byte-Reihenfolge)
C-Octet StringNUL-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 StringRohbytes; Länge wird durch ein separates Längenfeld angegeben, kein Abschlusszeichen
§04

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.

submit_sm-Header + Beginn des Body (kommentiert)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
Häufig gestellte Fragen

Hä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.

Referenzen

Quellenspezifikationen

Diese Seite basiert auf den veröffentlichten Standards. (Wird in einem neuen Tab geöffnet.)

BNWird vom BroadNet -Entwicklungsteam betreut.·Messaging in Carrier-Qualität seit 2003
Hänge es an den Draht

Entwicklung mit echtem SMPP Binding und REST-API.

Fordern Sie Testzugriff mit echten Testschlüsseln an: Senden Sie zunächst an Ihre eigene verifizierte Nummer und gehen Sie dann in über 200 Ländern zum Produktivbetrieb über, sobald Ihre Absenderidentität und die Routen genehmigt wurden.