BroadNet
SMPPFormat binaire

Anatomie d'une PDU SMPP : en-tête et corps

Mis à jour le 3 min de lectureFondé sur des normes
Réponse directe

Chaque message SMPP est une PDU (Protocol Data Unit) composée d'un en-tête fixe de 16 octets suivi d'un corps propre à l'opération. L'en-tête est constitué de quatre entiers de 4 octets en big-endian : command_length, command_id, command_status et sequence_number. command_length compte la PDU entière, en-tête compris ; un récepteur lit donc d'abord 4 octets, puis le reste.

SchémaUne session SMPP entre votre plateforme et BroadNet
Votre plateforme (ESME)
BroadNet SMSC
Une connexion TCP/TLS persistante
  1. bind_transceiverOuvrir et authentifier la session
  2. bind_transceiver_respSession acceptée
  3. submit_smEnvoyer un message
  4. submit_sm_respAccepté, ID du message renvoyé
  5. deliver_smAccusé de réception ou message entrant
  6. deliver_sm_respConfirmé
  7. enquire_linkKeepalive en cas d'inactivité
§01

L'en-tête de 16 octets

Chaque PDU commence par les mêmes quatre entiers non signés de 32 bits en ordre réseau (big-endian). command_length est le nombre total d'octets de la PDU, ces 16 octets d'en-tête inclus — un analyseur lit les 4 premiers octets, apprend la longueur totale, puis lit le reste. command_id identifie l'opération. command_status vaut 0 (ESME_ROK) dans les requêtes et porte un code d'erreur dans les réponses. sequence_number corrèle une requête avec sa réponse.

Champs de l'en-tête SMPP (16 octets, big-endian)
DécalageChampTailleObjectif
0command_length4 octetsLongueur totale de la PDU en octets, en-tête inclus
4command_id4 octetsIdentifiant d'opération (ex. submit_sm = 0x00000004)
8command_status4 octets0 dans une requête ; code d’erreur dans la réponse
12sequence_number4 octetsCorrèle requête↔réponse (0x00000001–0x7FFFFFFF)
§02

command_id et le bit de réponse

Chaque opération possède un command_id. La réponse correspondante utilise la même valeur avec le bit de poids fort positionné (OU logique avec 0x80000000). Ainsi submit_sm vaut 0x00000004 et submit_sm_resp vaut 0x80000004. generic_nack (0x80000000) est la réponse d'erreur générique pour une PDU non analysable ou invalide.

Valeurs courantes de command_id
OpérationRequêteRéponse
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

Le corps et l'encodage des champs

Après l'en-tête vient le corps propre à l'opération, composé des paramètres obligatoires, éventuellement suivis de paramètres optionnels TLV. Le SMPP utilise trois types d'encodage de champ. Les entiers sont de taille fixe, non signés, big-endian. Les C-Octet Strings sont du texte ASCII terminé par un NULL (0x00), avec une longueur maximale déclarée qui inclut le terminateur. Les Octet Strings sont des champs d'octets bruts dont la longueur est donnée par un champ de longueur précédent (par exemple short_message, dont la taille est fixée par sm_length).

Encodages des champs SMPP
TypeEncodage
IntegerNon signé à taille fixe de 1/2/4 octets, big-endian (ordre des octets réseau)
C-Octet StringASCII terminé par un caractère nul ; la longueur maximale inclut le terminateur 0x00
C-Octet String (Decimal/Hex)Comme ci-dessus, mais limité aux chiffres ASCII décimaux ou hexadécimaux
Octet StringOctets bruts ; longueur fournie par un champ de longueur séparé, sans terminateur
§04

Un exemple concret : submit_sm sur le fil

Une PDU submit_sm minimale. Le command_length de l'en-tête (0x0000003D = 61) est le nombre total d'octets ; command_id 0x00000004 est submit_sm ; command_status 0 marque une requête ; sequence_number 0x0000000F corrèle la réponse. Le corps suit ensuite dans l'ordre de champs fixe défini par la spécification.

En-tête submit_sm + début du corps (annoté)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

Questions fréquemment posées

command_length inclut-il l'en-tête ?

Oui. command_length est la longueur totale de la PDU entière en octets, l'en-tête de 16 octets inclus. Un récepteur lit exactement command_length octets pour consommer une PDU complète depuis le flux TCP.

Quel ordre des octets le SMPP utilise-t-il ?

L'ordre réseau — big-endian — pour tous les champs entiers multi-octets, y compris chaque champ de l'en-tête. Une valeur de 4 octets égale à 61 est transmise sous la forme 00 00 00 3D.

Comment les champs texte sont-ils terminés ?

Les champs texte sont des C-Octet Strings : des caractères ASCII terminés par un seul octet NULL (0x00). Une C-Octet String vide est simplement l'octet NULL. La longueur maximale déclarée inclut ce terminateur.

Qu'est-ce qu'un generic_nack ?

generic_nack (command_id 0x80000000) est la réponse que le récepteur renvoie lorsqu'une PDU ne peut être analysée ou est fondamentalement invalide — par exemple un command_length erroné ou un command_id inconnu. Son command_status en porte la raison.

Comment un récepteur délimite-t-il les PDU sur le flux TCP ?

TCP est un flux d'octets sans frontières de message ; le récepteur lit donc les 4 premiers octets pour obtenir command_length, puis lit ce nombre total d'octets afin d'isoler une PDU complète avant d'analyser le reste de l'en-tête et le corps.

Références

Spécifications sources

Les normes publiées sur lesquelles repose cette page. S'ouvre dans un nouvel onglet.

BNMaintenu par l'équipe d'ingénierie BroadNet·Messagerie de qualité opérateur depuis 2003
Placez-le sur le fil

Conçu avec une véritable liaison SMPP et une API REST.

Demandez un accès de test avec de véritables clés de test : envoyez d’abord à votre propre numéro vérifié, puis passez en production dans plus de 200 pays une fois que votre identité d’expéditeur et vos routes seront approuvées.