Como Enviar SMS através da API SMPP usando Java
A API Short Message Peer-to-Peer (SMPP) é um protocolo de telecomunicações poderoso projetado para trocar mensagens SMS entre Centros de Serviço de Mensagens Curtas (SMSCs) e Entidades Externas de Mensagens Curtas (ESMEs). Ao utilizar Java e a API SMPP, os desenvolvedores podem construir aplicações robustas para enviar e receber mensagens SMS de forma eficiente. Este guia abrangente orienta você através do processo de implementação da API SMPP em Java para se conectar ao Ozeki SMS Gateway, com exemplos práticos de código para gerenciamento de conexão, envio de mensagens e tratamento de relatórios de entrega.
Por que Usar Java e a API SMPP para Mensagens SMS?
Java é uma linguagem de programação versátil e independente de plataforma, amplamente utilizada para
construir aplicações de nível empresarial. Quando combinada com a API SMPP,
Java permite que os desenvolvedores criem soluções de SMS escaláveis que se integram perfeitamente
com gateways de SMS como o Ozeki. O protocolo SMPP é ideal para aplicações de SMS de alto volume
devido à sua confiabilidade, suporte a mensagens em massa e capacidades de rastreamento de entrega.
Este guia utiliza a biblioteca jSMPP
, uma implementação pura
Java do protocolo SMPP, para simplificar o desenvolvimento.
Configuração do Cliente da API SMPP em Java para Envio de Mensagens SMS
Para começar a enviar mensagens SMS usando a API SMPP em Java, você
precisa configurar uma conta de usuário SMPP no
servidor SMPP do Ozeki SMS Gateway e configurar sua
aplicação Java para se conectar ao seu servidor SMPP. A biblioteca jSMPP
é uma escolha popular para desenvolvedores Java devido ao seu suporte abrangente para
recursos do protocolo SMPP. Abaixo, descrevemos as etapas para configurar seu projeto Java.
Passo 1: Adicionar a Dependência jSMPP
Para usar a biblioteca jSMPP
em seu projeto Java, inclua a seguinte
dependência Maven no seu arquivo pom.xml
:
<dependency> <groupId>org.jsmpp</groupId> <artifactId>jsmpp</artifactId> <version>2.3.10</version> </dependency>
Esta dependência fornece todas as classes necessárias para implementar a API SMPP em Java, incluindo gerenciamento de sessão, codificação de mensagens e tratamento de recibos de entrega.
Passo 2: Exemplo Básico de Conexão SMPP
Conectar-se a um servidor SMPP requer estabelecer uma sessão e vinculá-la ao
Ozeki SMS Gateway. O seguinte código Java demonstra como criar um cliente
SMPP simples usando a biblioteca jSMPP
:
import org.jsmpp.*; import org.jsmpp.bean.*; import org.jsmpp.session.*; public class SimpleSMPPClient { public static void main(String[] args) { SMPPSession session = new SMPPSession(); try { // Conectar e vincular ao Ozeki SMS Gateway session.connectAndBind( "your.ozeki.server", 2775, new BindParameter( BindType.BIND_TX, "your_username", "your_password", "cp", TypeOfNumber.ALPHANUMERIC, NumberingPlanIndicator.UNKNOWN, null) ); System.out.println("Conectado com sucesso ao servidor SMPP"); // Adicione o código de envio de mensagem aqui } catch (Exception e) { System.err.println("Falha ao conectar e vincular ao servidor SMPP: " + e.getMessage()); } finally { session.unbindAndClose(); } } }
Neste exemplo, substitua your.ozeki.server
, your_username
,
e your_password
pelas credenciais reais fornecidas pelo administrador do
Ozeki SMS Gateway. O BindType.BIND_TX
indica um
vínculo transmissor, adequado para enviar mensagens SMS.
Gerenciamento de Conexões da API SMPP em Java para Entrega Confiável de SMS
A entrega confiável de SMS requer a manutenção de uma conexão SMPP ativa. O protocolo SMPP utiliza mensagens keep-alive (PDUs enquire_link) para garantir que a conexão permaneça ativa. Abaixo está um exemplo de como configurar as definições de keep-alive e monitorar alterações de estado de sessão em Java:
session.setEnquireLinkTimer(30000); // Enviar keep-alive a cada 30 segundos session.setTransactionTimer(10000); // Definir tempo limite de transação para 10 segundos // Adicionar listener de estado de sessão para monitoramento session.addSessionStateListener(new SessionStateListener() { @Override public void onStateChange(SessionState newState, SessionState oldState, Session source) { System.out.println("O estado da sessão SMPP mudou de " + oldState + " para " + newState); } });
Essas configurações garantem que a conexão permaneça estável, e o listener de estado de sessão ajuda você a monitorar alterações, como desconexões, para um tratamento robusto de erros.
Enviando SMS com Java através da API SMPP
Uma vez conectado, você pode enviar mensagens SMS usando o PDU submit_sm
.
O seguinte método Java demonstra como enviar um SMS usando a API SMPP
em Java:
public static void sendSMS(SMPPSession session, String sender, String recipient, String message) throws Exception { try { String messageId = session.submitShortMessage( "CMT", // Tipo de serviço TypeOfNumber.ALPHANUMERIC, // TON de origem NumberingPlanIndicator.UNKNOWN, // NPI de origem sender, // Endereço do remetente TypeOfNumber.INTERNATIONAL, // TON de destino NumberingPlanIndicator.ISDN, // NPI de destino recipient, // Endereço do destinatário new ESMClass(), // Classe ESM (byte)0, // ID do protocolo (byte)1, // Flag de prioridade null, // Tempo de entrega agendado null, // Período de validade new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS_FAILURE), // Recibo de entrega (byte)0, // Flag de substituição se presente new GeneralDataCoding(Alphabet.ALPHA_DEFAULT), // Codificação de dados (byte)0, // ID da mensagem padrão message.getBytes() // Conteúdo da mensagem ); System.out.println("SMS enviado com ID da mensagem: " + messageId); } catch (PDUException e) { System.err.println("Parâmetro PDU inválido: " + e.getMessage()); throw e; } catch (ResponseTimeoutException e) { System.err.println("Tempo limite de resposta: " + e.getMessage()); throw e; } catch (InvalidResponseException e) { System.err.println("Resposta inválida: " + e.getMessage()); throw e; } catch (NegativeResponseException e) { System.err.println("Resposta negativa recebida: " + e.getMessage()); throw e; } catch (Exception e) { System.err.println("Falha ao enviar SMS: " + e.getMessage()); throw e; } }
Este método envia um SMS com rastreamento de recibo de entrega habilitado. O
parâmetro RegisteredDelivery
garante que você receba notificações
sobre o status de entrega da mensagem.
Para rastrear se um SMS foi entregue com sucesso, você pode vincular sua sessão SMPP
como um transceptor (BindType.BIND_TRX
) e implementar um listener de receptor
de mensagens. Abaixo está um exemplo de como tratar relatórios de entrega em Java:
// Vincular como transceptor para enviar e receber mensagens BindParameter bindParam = new BindParameter( BindType.BIND_TRX, "seu_usuario", "sua_senha", "cp", TypeOfNumber.ALPHANUMERIC, NumberingPlanIndicator.UNKNOWN, null ); // Definir listener de receptor de mensagens para relatórios de entrega session.setMessageReceiverListener(new MessageReceiverListener() { @Override public void onAcceptDeliverSm(DeliverSm deliverSm) { if (MessageType.SMSC_DEL_RECEIPT.containedIn(deliverSm.getEsmClass())) { DeliveryReceipt delReceipt = deliverSm.getShortMessageAsDeliveryReceipt(); System.out.println(String.format( "Recebido recibo de entrega para a mensagem %s: %s", delReceipt.getId(), delReceipt.getFinalStatus() )); } // Responder ao relatório de entrega try { byte[] messageId = new byte[]{1}; session.deliverSmResponse(0, messageId, deliverSm); } catch (PDUException e) { System.err.println("Falha ao responder a deliver_sm: " + e.getMessage()); } } });
Este código processa recibos de entrega, permitindo que você rastreie o sucesso ou falha de cada SMS enviado através da API SMPP em Java.
Cliente Java SMPP Completo para Envio de SMS via API SMPP
Abaixo está uma classe Java completa que integra gerenciamento de conexão, envio de mensagens, e tratamento de relatórios de entrega. Esta implementação está pronta para produção com tratamento adequado de erros e gerenciamento de recursos:
import org.jsmpp.*; import org.jsmpp.bean.*; import org.jsmpp.session.*; import org.jsmpp.util.*; public class SMPPClient implements AutoCloseable { private SMPPSession session; private String host; private int port; private String username; private String password; public SMPPClient(String host, int port, String username, String password) { this.host = host; this.port = port; this.username = username; this.password = password; this.session = new SMPPSession(); } public void connect() throws Exception { try { BindParameter bindParam = new BindParameter( BindType.BIND_TRX, username, password, "cp", TypeOfNumber.ALPHANUMERIC, NumberingPlanIndicator.UNKNOWN, null ); session.connectAndBind(host, port, bindParam); // Configurar parâmetros da sessão session.setEnquireLinkTimer(30000); session.setTransactionTimer(10000); // Configurar o listener de relatórios de entrega session.setMessageReceiverListener(new DeliveryReceiptListener()); System.out.println("Conectado com sucesso ao servidor SMPP"); } catch (Exception e) { System.err.println("Falha ao conectar ao servidor SMPP: " + e.getMessage()); throw e; } } public String sendSMS(String sender, String recipient, String message) throws Exception { try { return session.submitShortMessage( "CMT", TypeOfNumber.ALPHANUMERIC, NumberingPlanIndicator.UNKNOWN, sender, TypeOfNumber.INTERNATIONAL, NumberingPlanIndicator.ISDN, recipient, new ESMClass(), (byte)0, (byte)1, null, null, new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS_FAILURE), (byte)0, new GeneralDataCoding(Alphabet.ALPHA_DEFAULT), (byte)0, message.getBytes() ); } catch (Exception e) { System.err.println("Falha ao enviar SMS: " + e.getMessage()); throw e; } } @Override public void close() { if (session != null) { session.unbindAndClose(); } } private static class DeliveryReceiptListener implements MessageReceiverListener { @Override public void onAcceptDeliverSm(DeliverSm deliverSm) { if (MessageType.SMSC_DEL_RECEIPT.containedIn(deliverSm.getEsmClass())) { DeliveryReceipt delReceipt = deliverSm.getShortMessageAsDeliveryReceipt(); System.out.println(String.format( "Relatório de entrega recebido para a mensagem %s: %s", delReceipt.getId(), delReceipt.getFinalStatus() )); } } } public static void main(String[] args) { try (SMPPClient client = new SMPPClient( "your.ozeki.server", 2775, "your_username", "your_password")) { client.connect(); String messageId = client.sendSMS( "12345", "+1234567890", "Olá do cliente Java SMPP!" ); System.out.println("SMS enviado com ID: " + messageId); // Manter o aplicativo em execução para receber relatórios de entrega System.out.println("Pressione Ctrl+C para sair..."); Thread.sleep(Long.MAX_VALUE); } catch (Exception e) { System.err.println("Erro no cliente SMPP: " + e.getMessage()); } } }
Esta implementação completa encapsula a funcionalidade do cliente SMPP em uma
classe reutilizável, facilitando a integração em aplicações Java maiores. A
interface AutoCloseable
garante o gerenciamento adequado de recursos.
Para garantir que seu cliente Java SMPP API seja robusto e escalável, siga estas melhores práticas:
- Pool de Conexões: Use pool de conexões para aplicações de SMS de alto volume para gerenciar várias sessões SMPP com eficiência.
- Tratamento de Exceções: Implemente tratamento abrangente de exceções para recuperar-se de problemas de rede ou erros do servidor.
- Pools de Threads: Use pools de threads para processamento concorrente de mensagens e melhore o desempenho.
- Enfileiramento de Mensagens: Implemente um mecanismo de fila para garantir entrega confiável de mensagens durante interrupções de rede.
- Monitoramento de Conexão: Monitore o estado da sessão SMPP e implemente lógica de reconexão automática para maior confiabilidade.
- Codificação de Caracteres: Lide com diferentes codificações de caracteres (ex: GSM 7-bit, UCS-2) para suportar mensagens SMS internacionais.
Implementar a API SMPP em Java com o Ozeki SMS Gateway
fornece uma solução poderosa para enviar e receber mensagens SMS em suas
aplicações. A biblioteca jSMPP
simplifica as complexidades do
protocolo SMPP, permitindo que os desenvolvedores se concentrem em construir
recursos robustos de mensagens. Este guia abordou o essencial para configurar um
cliente Java SMPP, gerenciar conexões, enviar mensagens SMS e tratar relatórios
de entrega. Seguindo os exemplos e melhores práticas fornecidos, você pode criar
aplicações de SMS escaláveis e confiáveis usando Java e a
API SMPP.
Para ambientes de produção, considere adicionar recursos avançados como concatenação de mensagens para SMS longos, registro detalhado de logs e monitoramento de desempenho. O protocolo SMPP oferece capacidades adicionais, como agendamento de entrega de mensagens e configurações de prioridade, para aprimorar sua aplicação conforme os requisitos evoluem.
More information
- Como configurar uma conexão de cliente API SMPP com seu SMSC
- Como configurar um servidor API SMPP para enviar e receber SMS de múltiplos aplicativos
- Como escolher o provedor de API SMPP certo para o seu negócio
- Como enviar SMS usando a API SMPP no nível do protocolo
- Como enviar SMS através da API SMPP usando Python
- Como enviar SMS através da API SMPP usando Javascript
- Como enviar SMS através da API SMPP usando Java
- Como enviar SMS através da API SMPP usando PHP
- Como enviar SMS através da API SMPP usando C#
- Como enviar SMS através da API SMPP usando C/Cpp
- Como receber SMS usando a API SMPP
- Como receber um relatório de entrega de SMS usando a API SMPP
- FAQ da API SMPP