Conectar por SMPP e HTTP

Levar uma rota de teste à produção sem quebrar binds, janelas ou recibos: estado do bind, taxa, keep-alive, codificação, callbacks e falhas.

Uma conexão de mensageria em produção é um contrato operacional, não apenas um endpoint. O SMPP adiciona estado de bind, uma janela de taxa, tráfego de keep-alive e recibos na sessão. O HTTP adiciona autenticação por requisição e callbacks. O guia converte os dois em uma sequência do teste à produção.

O estado do bind é a primeira coisa a dominar

Um bind é uma sessão com uma direção declarada. Um transmissor envia, um receptor aceita mensagens recebidas e recibos, e um transceptor faz as duas coisas. O provedor emite credenciais para o tipo de bind que você precisa, e o cliente deve tratar o bind como estado: abrindo, vinculado, limitado, reconectando ou fechado. Um cliente que assume que o bind está sempre no ar perde mensagens na primeira queda.

Registre o estado do bind de forma explícita. Anote cada requisição e resposta de bind, a versão de interface, o system ID e o código de erro. Em uma queda, reconecte com backoff e não reenvie os envios em voo até saber se a central os aceitou. O message ID de submit_sm_resp é a única forma confiável de saber.

O bind e o primeiro envio

  1. Aplicação (ESME)
  2. bind_transceiver Abrir a sessão
  3. SMSC
  4. submit_sm_resp Aceito para entrega
  5. Recibo de entrega
A sessão abre uma vez. Cada envio recebe uma resposta com um message ID; o recibo chega depois pela mesma sessão. Fonte: smpp.org: sessões SMPP e operações PDU
Descrição em texto

O cliente envia uma requisição de bind e recebe uma resposta. Envia uma mensagem com submit_sm e recebe submit_sm_resp com um message ID. Mais tarde a central envia uma PDU deliver_sm com o recibo, e o cliente responde com deliver_sm_resp. Um unbind fecha a sessão.

Janela, heartbeat e codificação

A janela é o número de requisições em voo que a central aceita em um bind. Mantenha o contador abaixo dela e deixe a janela esvaziar antes de uma rajada. Um envio limitado é um sinal para reduzir o ritmo; tentar de novo no mesmo ritmo enche a fila e converte uma mensagem lenta em um congestionamento. Dimensione o número de binds pela taxa de pico, não pela média mensal.

As trocas de keep-alive dizem aos dois lados que a sessão está viva. Envie enquire_link em uma cadência e feche uma sessão que para de responder. Para a codificação, envie GSM-7 quando o conteúdo permitir e UCS-2 caso contrário. Um único caractere fora do conjunto GSM-7 muda a mensagem inteira para UCS-2 e pode mudar o número de segmentos. Teste o modelo exato, incluindo os valores das variáveis.

Recibos de entrega

Um recibo chega de forma assíncrona como uma PDU deliver_sm. Carrega o message ID original, um estado como entregue, expirado, não entregue ou desconhecido, e muitas vezes um código de rede. Pareie por message ID e guarde o estado com o registro da mensagem. Não pareie por ordem de chegada e não trate um recibo ausente como uma mensagem que falhou.

Os formatos de recibo diferem. Centrais novas usam um campo tag-length-value message_state; as antigas colocam texto chave-valor no campo da mensagem curta. Analise os dois. Normalize os estados que a sua aplicação precisa e guarde o código bruto, para que um caso de suporte possa ser rastreado até o que a rede disse.

Modos de falha e primeira resposta

Cada linha nomeia um sintoma, a causa provável e a primeira checagem.
SintomaCausa provávelPrimeira checagem
Bind recusadoCredenciais, tipo de bind ou versão de interface erradosLeia o código de resposta do bind e a versão de interface
Timeouts subindoJanela excedida ou rota lentaVerifique as requisições em voo e os códigos de resposta antes de repetir
Bind aberto, sem respostasA sessão está morta ou o cliente parou o keep-aliveEnvie enquire_link e reconecte com backoff
Recibo ausenteO recibo nunca chegou ao handlerVerifique o log da sessão e o message ID antes de reenviar
Caracteres erradosConteúdo GSM-7 enviado como UCS-2, ou o contrárioVerifique a codificação de dados e a contagem de segmentos
Callback com timeoutO endpoint está lento ou inacessívelResponda rápido, processe de forma assíncrona, verifique a assinatura

A ordem da resposta importa: observe e depois mude uma variável.

Da rota de teste à produção

  1. Conecte à rota de teste

    Use as credenciais de teste e o tipo de bind que vai usar em produção. Confirme a resposta do bind e a versão de interface.

  2. Envie os modelos reais

    Teste o conteúdo que vai lançar, com links, variáveis e a mensagem mais longa. Registre a codificação e o número de segmentos.

  3. Leia os recibos

    Pareie cada recibo por message ID. Confirme os estados e os códigos de erro que a sua aplicação vai receber.

  4. Teste o caminho de falha

    Envie para um número inválido, um celular cheio e um serviço bloqueado. Confirme os estados e o tratamento da aplicação.

  5. Dimensione a janela

    Rode um teste na taxa de pico e confirme que as requisições em voo ficam abaixo da janela. Adicione um bind se não ficarem.

  6. Ligue o monitoramento

    Alerte sobre o estado do bind, a latência de envio, a latência de recibo e a mistura de estados. Nomeie a pessoa que age em cada alerta.

  7. Mude o tráfego de produção

    Mova primeiro uma parcela pequena, compare os recibos com o teste e aumente. Mantenha a rota de teste como alternativa.

Autenticação HTTP e callbacks

Uma integração HTTP autentica cada requisição com a chave emitida no onboarding. Rotacione a chave antes de ela expirar e mantenha a anterior válida durante a sobreposição. Um envio devolve uma resposta aceita com um message ID; o recibo e qualquer mensagem recebida chegam à sua URL de callback.

O endpoint de callback deve verificar a assinatura, responder rápido e processar o evento depois da resposta. Um endpoint lento provoca retentativas, e retentativas provocam duplicados se o handler não for idempotente. Mantenha o endpoint acessível através de mudanças de certificado e DNS, e alerte quando a taxa de falhas do callback subir. A explicação de SMPP cobre a sessão; a comparação de transportes cobre a escolha.

Decodificador SMPP e DLR

O decodificador roda no navegador; o recibo colado não sai de lá.

Cole um command_status, os campos stat e err de um relatório de entrega ou uma PDU em hexadecimal para ver o que significa e o que verificar.

sample
id:0123456789 sub:001 dlvrd:001 submit date:2610181200 done date:2610181201 stat:DELIVRD err:000 text:Seu código é 123456
Abrir a ferramenta

Perguntas frequentes

Qual versão de SMPP devemos usar?

O SMPP 3.4 é a versão amplamente implantada. Use a 5.0 apenas onde a central e o seu stack a suportem.

Quantos binds precisamos?

Os suficientes para manter a taxa de pico abaixo da janela, com margem para a queda de um bind. Peça ao provedor a alocação por bind.

O callback deve responder antes de processar?

Sim. Verifique a assinatura, responda com sucesso e depois processe. Uma resposta lenta provoca retentativas e duplicados.

E se um recibo nunca chegar?

Verifique primeiro o log da sessão e o message ID. Um recibo ausente não prova que a mensagem falhou.

Como testamos uma falha?

Envie para um número inválido, um celular cheio e um serviço bloqueado. Registre o estado e o código de erro de cada um.
  • Manual global de Sender ID para A2P

    Como os Sender IDs funcionam nos mercados: caminhos alfanuméricos, numéricos e de código curto, expectativas de registro e exemplos de países.

  • A2P SMS

    SMS aplicação-pessoa: o tráfego que uma aplicação envia ao aparelho de uma pessoa, como um código de verificação ou um alerta de transação.

  • DLR

    Um recibo de entrega informa o status que a rede móvel atribui a um SMS enviado: entregue, expirado, rejeitado ou desconhecido, entre outros.

Adjacente ao que oferecemos

Explicamos isto aqui porque afeta o uso do nosso serviço.