BroadNet
SMPPFormato de transmissão

Anatomia do PDU SMPP: cabeçalho e corpo

Atualizado em 3 min de leituraBaseado em padrões
Resposta direta

Cada mensagem SMPP é um PDU (Protocol Data Unit) com um cabeçalho fixo de 16 bytes seguido de um corpo específico da operação. O cabeçalho são quatro inteiros big-endian de 4 bytes: command_length, command_id, command_status e sequence_number. O command_length conta o PDU inteiro incluindo o cabeçalho, pelo que o recetor lê primeiro 4 bytes e depois o resto.

DiagramaUma sessão SMPP entre a sua plataforma e BroadNet
A sua plataforma (ESME)
BroadNet SMSC
Uma conexão TCP/TLS persistente
  1. bind_transceiverAbrir e autenticar a sessão
  2. bind_transceiver_respSessão aceita
  3. submit_smEnviar uma mensagem
  4. submit_sm_respAceito, ID da mensagem devolvida
  5. deliver_smRelatório de entrega ou mensagem recebida
  6. deliver_sm_respConfirmado
  7. enquire_linkKeepalive em modo ocioso
§01

O cabeçalho de 16 bytes

Cada PDU começa com os mesmos quatro inteiros de 32 bits sem sinal em ordem de rede (big-endian). O command_length é a contagem total de octetos do PDU incluindo estes 16 bytes de cabeçalho — um parser lê os primeiros 4 bytes, fica a saber o comprimento total e depois lê o restante. O command_id identifica a operação. O command_status é 0 (ESME_ROK) nos pedidos e transporta um código de erro nas respostas. O sequence_number correlaciona um pedido com a sua resposta.

Campos do cabeçalho SMPP (16 bytes, big-endian)
OffsetCampoTamanhoFinalidade
0command_length4 octetosComprimento total da PDU em octetos, incluindo o cabeçalho
4command_id4 octetosIdentificador de operação (ex: submit_sm = 0x00000004)
8command_status4 octetos0 numa solicitação; código de erro numa resposta
12sequence_number4 octetosCorrelaciona solicitação↔resposta (0x00000001–0x7FFFFFFF)
§02

command_id e o bit de resposta

Cada operação tem um command_id. A resposta correspondente usa o mesmo valor com o bit mais significativo ativado (OR lógico com 0x80000000). Assim, submit_sm é 0x00000004 e submit_sm_resp é 0x80000004. O generic_nack (0x80000000) é a resposta de erro genérica para um PDU não interpretável ou inválido.

Valores comuns de command_id
OperaçãoRequisiçãoResposta
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

O corpo e como os campos são codificados

A seguir ao cabeçalho vem o corpo específico da operação com parâmetros obrigatórios, opcionalmente seguido de parâmetros opcionais TLV. O SMPP usa três codificações de campo. Os inteiros são de tamanho fixo, sem sinal, big-endian. As C-Octet Strings são texto ASCII terminado por um NULL (0x00), com um comprimento máximo declarado que inclui o terminador. As Octet Strings são campos de bytes em bruto cujo comprimento é dado por um campo de comprimento anterior (por exemplo short_message, cujo tamanho é definido por sm_length).

Codificações de campo do SMPP
TipoCodificação
Integer1/2/4 octetos fixos, sem sinal, big-endian (ordem de bytes de rede)
C-Octet StringASCII terminado em NUL; o comprimento máximo inclui o terminador 0x00
C-Octet String (Decimal/Hex)Como acima, mas restrito a dígitos ASCII decimais ou hexadecimais
Octet StringBytes brutos; comprimento fornecido por um campo de comprimento separado, sem terminador
§04

Um exemplo prático: submit_sm em trânsito

Um PDU submit_sm mínimo. O command_length do cabeçalho (0x0000003D = 61) é a contagem total de bytes; o command_id 0x00000004 é submit_sm; o command_status 0 marca um pedido; o sequence_number 0x0000000F correlaciona a resposta. O corpo segue depois na ordem fixa de campos definida pela especificação.

cabeçalho submit_sm + início do corpo (anotado)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
Perguntas frequentes

Perguntas frequentes

O command_length inclui o cabeçalho?

Sim. O command_length é o comprimento total do PDU inteiro em octetos, incluindo o cabeçalho de 16 bytes. Um recetor lê exatamente command_length bytes para consumir um PDU completo do fluxo TCP.

Que ordem de bytes usa o SMPP?

Ordem de rede — big-endian — para todos os campos inteiros de vários octetos, incluindo todos os campos do cabeçalho. Um valor de 4 bytes igual a 61 é transmitido como 00 00 00 3D.

Como são terminados os campos de texto?

Os campos de texto são C-Octet Strings: caracteres ASCII terminados por um único byte NULL (0x00). Uma C-Octet String vazia é apenas o byte NULL. O comprimento máximo declarado inclui esse terminador.

O que é um generic_nack?

O generic_nack (command_id 0x80000000) é a resposta que o recetor devolve quando um PDU não pode ser interpretado ou é fundamentalmente inválido — por exemplo um command_length incorreto ou um command_id desconhecido. O seu command_status transporta o motivo.

Como delimita um recetor os PDUs no fluxo TCP?

O TCP é um fluxo de bytes sem fronteiras de mensagem, pelo que o recetor lê os primeiros 4 bytes para obter o command_length e depois lê esse número total de bytes para isolar um PDU completo antes de interpretar o resto do cabeçalho e do corpo.

Referências

Especificações de origem

Os padrões publicados nos quais esta página se baseia. Abre num novo separador.

BNMantido pela equipa de engenharia BroadNet·Mensagens de nível de operadora desde 2003
Coloque-o no fio.

Construa com uma vinculação SMPP real e uma API REST.

Solicite acesso de teste com chaves de teste reais: envie primeiro para o seu próprio número verificado e, em seguida, passe para o ambiente de produção em mais de 200 países assim que a sua identidade de remetente e rotas forem aprovadas.