Binds SMPP e enquire_link: manter viva o link de SMS num VPS

WhatsApp e APIs·· 105 visualizações· 4 min de leitura

A resposta curta (para quem tem um VPS e uma conta SMPP): uma sessão SMPP começa com um link TCP ao anfitrião e à porta que o fornecedor lhe deu, seguida de um bind com o seu system_id e a senha. Se o bind_resp chega com o estado 0, está dentro. Daí em diante, quando o link está calada, cada lado manda de vez em quando um enquire_link («está aí?») e o outro responde enquire_link_resp. Sem isto, uma firewall ou um NAT pelo caminho pode esquecer o link em silêncio, e o seu programa continua julgando que está ligado quando já não está.

Os comandos da sessão

Comando O que faz
bind_transmitter Só envia. Relatórios de entrega e respostas não chegam por este link.
bind_receiver Só recebe: os deliver_sm com respostas e recibos.
bind_transceiver Envia e recebe pela mesma conexão. É o mais simples quando o fornecedor o permite.
enquire_link / enquire_link_resp «Está aí?» / «Estou». Mantém o link viva e denuncia um link morta.
unbind / unbind_resp Despedida antes de fechar. Sem ela, o fornecedor pode continuar contando a sessão antiga como aberta.
generic_nack O outro lado não percebeu um pacote (tamanho errado, comando desconhecido). Quase sempre um erro no cliente.

Como montar um link que aguenta

1 Confirme que o VPS chega ao fornecedor. A porta de saída tem que estar aberta na firewall do VPS e o fornecedor tem que ter autorizado o IP do VPS. Teste com o anfitrião e a porta que ele lhe deu: nc -vz SMPP_HOST SMPP_PORT Se o teste fica à espera até desistir, é firewall ou IP não autorizado; se é recusado logo, a porta está errada. Veja portas e firewall num VPS.
2 Faça o bind com credenciais lidas do ambiente, não escritas no código: system_id, senha e, se o fornecedor pedir, system_type. Erros comuns no bind_resp: senha inválida, bind recusado, ou «já ligado» (a sessão antiga ainda conta, ou há duas cópias do cliente a correr).
3 Mande um enquire_link quando o link está calada há algum tempo. Use o intervalo que o fornecedor recomenda, e que seja mais curto do que o tempo que as firewalls e NAT pelo caminho levam a esquecer uma conexão parada. E responda sempre aos enquire_link que o fornecedor lhe manda: não responder é uma causa clássica de o fornecedor cortar a sessão.
4 Se um enquire_link fica sem resposta dentro do seu prazo, ou o link fecha, dê a sessão por morta: feche, espere, e volte a ligar com pausas cada vez maiores entre tentativas, para não martelar o fornecedor. Os envios que ainda não tinham submit_sm_resp voltam para a fila; não se perdem nem se dão por enviados.
5 Respeite a janela e o ritmo. A janela é quantos pacotes pode ter enviados sem resposta ao mesmo tempo, e quem a define é o fornecedor. Acima dela, ou acima do ritmo combinado, chegam erros como ESME_RTHROTTLED ou ESME_RMSGQFUL: abrande e volte a tentar mais tarde.
6 Ponha o cliente a correr como serviço do systemd, com reinício automático e os registros no journal (executar o programa como serviço). Ao parar, o programa deve apanhar o sinal de paragem e mandar um unbind antes de fechar.
Corra uma só cópia do cliente por conta, a menos que o fornecedor tenha autorizado vários binds. Duas cópias (uma esquecida numa sessão de terminal, mais o serviço) dão erros de «já ligado» ou dividem os recibos entre dois processos, e um deles deita-os fora.
Registre o comando, o sequence_number e o estado de cada pacote, nunca a senha nem o texto de mensagens com códigos. Com o sequence_number liga cada resposta _resp ao pedido que a originou. Onde ver os registros: registros num VPS Linux.

O VPS não consegue ligar ao fornecedor de SMS? Envie-nos o anfitrião, a porta e o resultado do teste com o nc, e ajudamos a perceber onde está o bloqueio (num VPS não gerido, a firewall é gerida por si).

Abrir pedido de suporte

VEJA TAMBÉM

SMPP ou API HTTP de SMS: o que é cada uma e de qual precisa a sua aplicação

Relatórios de entrega de SMS (DLR): como a aplicação sabe se a mensagem chegou

Como executar o seu programa como um serviço do systemd que arranca com o servidor

Portas e firewall num VPS: porque a aplicação não é alcançável

Onde estão os registros num VPS Linux: journalctl e /var/log

Variáveis de ambiente e segredos da sua aplicação

PRODUTO RECOMENDADO

Servidor VPS com acesso root

Recursos só seus, o sistema que escolher, reinstalação quando quiser. desde R$ 46,20/mês (plano de 3 anos, com cupom)

Ver planos
Esta resposta foi útil? Sua resposta nos ajuda a melhorar este artigo.