Avance item por item e marque conforme concluir.
bind_transceiverAbrir e autenticar a sessãobind_transceiver_respSessão aceitasubmit_smEnviar uma mensagemsubmit_sm_respAceito, ID da mensagem devolvidadeliver_smRelatório de entrega ou mensagem recebidadeliver_sm_respConfirmadoenquire_linkKeepalive em modo ocioso
Configuração de sessão e bind
Escolha o modo de bind correto para a direção do seu tráfego e confirme a versão de protocolo negociada antes de enviar uma única mensagem.
- Confirme a versão do SMPP — v3.4 para a maioria das rotas, v5.0 onde o fornecedor suporte o estado de congestionamento e TLVs melhorados.A v5.0 é compatível com versões anteriores; não assuma que as funcionalidades estão disponíveis até o bind_resp o confirmar.
- Escolha o tipo de bind correto por sessão.transmissor (apenas MT), recetor (apenas DLR/MO), ou transcetor (ambos numa única sessão). Prefira o transcetor para reduzir a metade o número de ligações onde o fornecedor o permita.
- Configure o system_id, password, system_type e address_range exatamente como aprovisionados.Um address_range incompatível bloqueia silenciosamente o encaminhamento de MO/DLR em binds de recetor.
- Acorde por escrito com o fornecedor o número de binds concorrentes e o TPS por bind.Abrir mais binds do que os aprovisionados é a causa mais comum de uma conta limitada (throttled) ou suspensa.
- Trate explicitamente os códigos de estado do bind_resp — repita a tentativa em ESME_RALYBND e recue em ESME_RBINDFAIL.Nunca repita um bind falhado em ciclo contínuo; use recuo exponencial com jitter.
Submissão de mensagens (submit_sm)
- Configure corretamente source_addr_ton / source_addr_npi e dest_addr_ton / dest_addr_npi para sender IDs alfanuméricos vs numéricos.Remetente alfanumérico → TON 5 (alfanumérico); MSISDN internacional → TON 1, NPI 1.
- Escolha o data_coding correto: GSM de 7 bits (0), 8 bits (4), ou UCS-2 (8) para Unicode.Misturar codificações sem configurar o data_coding causa mojibake e segmentação incorreta.
- Implemente a concatenação de mensagens longas via UDH ou os TLVs opcionais SAR (sar_msg_ref_num, sar_total_segments, sar_segment_seqnum).Escolha um método e mantenha-o consistente; algumas rotas rejeitam UDH, outras rejeitam os TLVs SAR.
- Solicite relatórios de entrega com registered_delivery = 1 apenas onde os consuma.Solicitar DLRs que não são processados desperdiça débito e pode gerar avisos por parte do fornecedor.
- Respeite a semântica de validity_period e schedule_delivery_time para o seu caso de uso (OTP = validade curta).Os OTP de curta duração devem transportar um validity_period apertado para que as mensagens obsoletas não sejam entregues tarde.
Parâmetros opcionais (TLVs) que vale a pena configurar
- message_payload — para cargas úteis que excedam o limite do campo short_message.Não preencha simultaneamente short_message e message_payload; os fornecedores rejeitam isso.
- TLVs sar_* — concatenação baseada em normas sem bytes UDH no corpo.
- dest_addr_subunit / source_addr_subunit — onde a rota o exija para o encaminhamento ao telemóvel.
- Transporte metadados fornecidos pelo cliente apenas em TLVs aprovados pelo fornecedor.TLVs personalizados fora do intervalo acordado são frequentemente removidos ou causam erros de análise a jusante.
Tratamento de relatórios de entrega (DLR)
Os relatórios de entrega chegam como PDUs deliver_sm e são a espinha dorsal da sua reconciliação e dos relatórios de qualidade.
- Analise o recibo a partir do campo short_message do deliver_sm: id, sub, dlvrd, data de submissão, data de conclusão, stat, err.O campo `stat` (DELIVRD, UNDELIV, EXPIRED, REJECTD, etc.) é o seu estado final.
- Correlacione os DLR com a sua submissão usando o formato de message_id do fornecedor, não apenas o texto do recibo.O message_id pode ser devolvido em hexadecimal no submit_resp mas em decimal no DLR — normalize ambos.
- Trate os recibos intermédios (não finais) separadamente dos estados finais.O bit 0x04 do esm_class marca um relatório de entrega; só os valores finais de `stat` devem fechar uma mensagem.
- Devolva sempre um deliver_sm_resp — um DLR não confirmado é reenviado e pode bloquear a janela.Responda prontamente mesmo que o processamento a jusante seja assíncrono.
- Associe os códigos de erro da operadora a uma taxonomia normalizada (assinante ausente, telemóvel ocupado, bloqueado por spam, número inválido).Os códigos de erro em bruto variam por rota; uma taxonomia normalizada torna a qualidade comparável entre rotas.
Keepalive e controlo de fluxo
- Envie enquire_link num temporizador de inatividade (normalmente 30–60s) e trate uma resposta enquire_link_resp em falta como uma sessão morta.É a única forma fiável de detetar uma ligação TCP semiaberta.
- Implemente a janela SMPP: limite os PDUs pendentes sem confirmação e pause as submissões quando a janela estiver cheia.Disparar submit_sm às cegas para além da janela é o que desencadeia o ESME_RTHROTTLED.
- Recue perante o ESME_RTHROTTLED (0x58) em vez de repetir a tentativa imediatamente.Acrescente jitter para que as tempestades de reconexão não se sincronizem entre trabalhadores.
- Respeite unbind / unbind_resp para um encerramento controlado; reconecte com recuo em caso de desconexões inesperadas.
Segurança do transporte (TLS)
- Use SMPP sobre TLS onde o fornecedor o disponibilize; desative os binds em texto simples em produção.O SMPP não tem encriptação nativa — o TLS é o controlo ao nível do transporte.
- Fixe (pin) ou valide a cadeia de certificados do servidor e imponha TLS 1.2+.Rejeite certificados expirados ou autoassinados; não desative a verificação 'para funcionar'.
- Restrinja os binds a IPs de origem numa lista de permissões em ambos os lados.A lista de IPs permitidos é um controlo padrão da operadora e uma forma rápida de conter fugas de credenciais.
- Rode as credenciais SMPP com regularidade e guarde-as num gestor de segredos, nunca no código.
Plano de testes pré-produção
- Envie para um MSISDN de teste real em cada rota-alvo e confirme a receção no telemóvel de ponta a ponta.
- Verifique o ciclo completo do DLR para os resultados entregue, não entregue, expirado e rejeitado.
- Teste mensagens longas (multissegmento) e conteúdo Unicode (UCS-2) em cada rota.
- Faça testes de carga no TPS aprovisionado e confirme o comportamento controlado no limite da janela/throttle.
- Simule uma ligação interrompida a meio da janela e confirme uma reconexão limpa sem submissões duplicadas.A idempotência na repetição impede a faturação duplicada e a entrega duplicada ao telemóvel.
- Confirme a monitorização: estado do bind, ocupação da janela, latência de submissão/DLR, e taxas de códigos de erro alertam todas.
Normas e referências regulatórias citadas neste guia. A BroadNet é membro associado da GSMA e membro do MEF e opera mensagens de nível de operadora desde 2003.