Binds SMPP e enquire_link: manter viva a ligação de SMS num VPS

WhatsApp e APIs·· 19 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 uma ligação TCP ao anfitrião e à porta que o fornecedor lhe deu, seguida de um bind com o seu system_id e a palavra-passe. Se o bind_resp chega com o estado 0, está dentro. Daí em diante, quando a ligação 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 a ligação em silêncio, e o seu programa continua a julgar 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 esta ligação.
bind_receiver Só recebe: os deliver_sm com respostas e recibos.
bind_transceiver Envia e recebe pela mesma ligação. É o mais simples quando o fornecedor o permite.
enquire_link / enquire_link_resp «Está aí?» / «Estou». Mantém a ligação viva e denuncia uma ligação morta.
unbind / unbind_resp Despedida antes de fechar. Sem ela, o fornecedor pode continuar a contar 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 uma ligação que aguenta

1 Confirme que o VPS chega ao fornecedor. A porta de saída tem de estar aberta na firewall do VPS e o fornecedor tem de 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, palavra-passe e, se o fornecedor pedir, system_type. Erros comuns no bind_resp: palavra-passe 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 a ligação 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 ligaçã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 a ligação 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 registos 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.
Registe o comando, o sequence_number e o estado de cada pacote, nunca a palavra-passe nem o texto de mensagens com códigos. Com o sequence_number liga cada resposta _resp ao pedido que a originou. Onde ver os registos: registos 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 registos 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 7.560,00 Kz/mês (plano de 3 anos, com cupão)

Ver planos
Esta resposta foi útil? A sua resposta ajuda-nos a melhorar este artigo.