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.
bind_transceiverOuvrir et authentifier la sessionbind_transceiver_respSession acceptéesubmit_smEnvoyer un messagesubmit_sm_respAccepté, ID du message renvoyédeliver_smAccusé de réception ou message entrantdeliver_sm_respConfirméenquire_linkKeepalive en cas d'inactivité
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.
| Décalage | Champ | Taille | Objectif |
|---|---|---|---|
| 0 | command_length | 4 octets | Longueur totale de la PDU en octets, en-tête inclus |
| 4 | command_id | 4 octets | Identifiant d'opération (ex. submit_sm = 0x00000004) |
| 8 | command_status | 4 octets | 0 dans une requête ; code d’erreur dans la réponse |
| 12 | sequence_number | 4 octets | Corrèle requête↔réponse (0x00000001–0x7FFFFFFF) |
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.
| Opération | Requête | Réponse |
|---|---|---|
| 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 |
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).
| Type | Encodage |
|---|---|
| Integer | Non signé à taille fixe de 1/2/4 octets, big-endian (ordre des octets réseau) |
| C-Octet String | ASCII 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 String | Octets bruts ; longueur fournie par un champ de longueur séparé, sans terminateur |
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.
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_messageQuestions 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.
Spécifications sources
Les normes publiées sur lesquelles repose cette page. S'ouvre dans un nouvel onglet.