Como enviar SMS em Java

133

Quais são as formas possíveis de enviar e receber sms do aplicativo Java?

Quão?

Jigar Joshi
fonte

Respostas:

19

(Aviso: trabalho na Twilio)

O Twilio oferece um Java SDK para enviar SMS por meio da API REST do Twilio.

John Sheehan - Runscope
fonte
e se eu quiser recebê-lo no meu servidor?
precisa saber é o seguinte
Você se inscrever para uma conta Twilio, em seguida, atribuir um URL a ser atingida quando uma mensagem é recebida: twilio.com/sms
John Sheehan
1
Obrigado pelo Twilio. :)
Chirag Savsani
15

se tudo o que você deseja são notificações simples, muitas operadoras suportam SMS por e-mail; veja SMS por e-mail

Steven A. Lowe
fonte
10

A melhor API de SMS que eu já vi em Java é JSMPP. É poderoso, fácil de usar, e eu mesmo o usei para um aplicativo de nível empresarial (enviando mais de 20 mil mensagens SMS diariamente).

Essa API criada para reduzir a verbosidade da API SMPP existente. É muito simples e fácil de usar, pois oculta a complexidade da comunicação de protocolo de baixo nível, como perguntar automaticamente a resposta de solicitação de link.

Eu tentei algumas outras APIs como o Ozeki, mas a maioria delas é comercial ou tem limitação na taxa de transferência (por exemplo, não é possível enviar mais de três mensagens SMS por segundo).

Eng.Fouad
fonte
10

Existe uma API chamada SMSLib, é realmente incrível. http://smslib.org/

Agora você tem muitos provedores de Saas que podem oferecer esse serviço usando suas APIs

Ex: mailchimp, esendex, Twilio, ...

Marouane Gazanayi
fonte
9

Você pode fazer isso com um modem GSM e API de comunicações Java [experimentado e testado]

  1. Primeiro você precisa definir o Java Comm Api

    Este artigo descreve em detalhes como configurar a API de comunicação

  2. Em seguida, você precisa de um modem GSM (de preferência módulo sim900)

  3. É preferível a versão mais recente do Java JDK

  4. AT Command Guide

    Código

    amostra de embalagem;

        import java.io.*;
        import java.util.*;
    
        import gnu.io.*;
    
        import java.io.*;
    
    
        import org.apache.log4j.chainsaw.Main;
    
        import sun.audio.*;
    
        public class GSMConnect implements SerialPortEventListener, 
         CommPortOwnershipListener {
    
         private static String comPort = "COM6"; // This COM Port must be connect with GSM Modem or your mobile phone
         private String messageString = "";
         private CommPortIdentifier portId = null;
         private Enumeration portList;
         private InputStream inputStream = null;
         private OutputStream outputStream = null;
         private SerialPort serialPort;
         String readBufferTrial = "";
         /** Creates a new instance of GSMConnect */
         public GSMConnect(String comm) {
    
           this.comPort = comm;
    
         }
    
         public boolean init() {
           portList = CommPortIdentifier.getPortIdentifiers();
           while (portList.hasMoreElements()) {
             portId = (CommPortIdentifier) portList.nextElement();
             if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
               if (portId.getName().equals(comPort)) {
                   System.out.println("Got PortName");
                 return true;
               }
             }
           }
           return false;
         }
    
         public void checkStatus() {
           send("AT+CREG?\r\n");
         }
    
    
    
         public void send(String cmd) {
           try {
             outputStream.write(cmd.getBytes());
           } catch (IOException e) {
             e.printStackTrace();
           }
         }
    
         public void sendMessage(String phoneNumber, String message) {
               char quotes ='"';
           send("AT+CMGS="+quotes + phoneNumber +quotes+ "\r\n");
           try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
            //   send("AT+CMGS=\""+ phoneNumber +"\"\r\n");
           send(message + '\032');
           System.out.println("Message Sent");
         }
    
         public void hangup() {
           send("ATH\r\n");
         }
    
         public void connect() throws NullPointerException {
           if (portId != null) {
             try {
               portId.addPortOwnershipListener(this);
    
               serialPort = (SerialPort) portId.open("MobileGateWay", 2000);
               serialPort.setSerialPortParams(115200,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);
             } catch (PortInUseException | UnsupportedCommOperationException e) {
               e.printStackTrace();
             }
    
             try {
               inputStream = serialPort.getInputStream();
               outputStream = serialPort.getOutputStream();
    
             } catch (IOException e) {
               e.printStackTrace();
             }
    
             try {
               /** These are the events we want to know about*/
               serialPort.addEventListener(this);
               serialPort.notifyOnDataAvailable(true);
               serialPort.notifyOnRingIndicator(true);
             } catch (TooManyListenersException e) {
               e.printStackTrace();
             }
    
        //Register to home network of sim card
    
             send("ATZ\r\n");
    
           } else {
             throw new NullPointerException("COM Port not found!!");
           }
         }
    
         public void serialEvent(SerialPortEvent serialPortEvent) {
           switch (serialPortEvent.getEventType()) {
             case SerialPortEvent.BI:
             case SerialPortEvent.OE:
             case SerialPortEvent.FE:
             case SerialPortEvent.PE:
             case SerialPortEvent.CD:
             case SerialPortEvent.CTS:
             case SerialPortEvent.DSR:
             case SerialPortEvent.RI:     
             case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
             case SerialPortEvent.DATA_AVAILABLE:
    
               byte[] readBuffer = new byte[2048];
               try {
                 while (inputStream.available() > 0) 
                 {
                   int numBytes = inputStream.read(readBuffer);
    
                   System.out.print(numBytes);
                   if((readBuffer.toString()).contains("RING")){
                   System.out.println("Enter Inside if RING Loop");    
    
    
    
                   }
                 }
    
                 System.out.print(new String(readBuffer));
               } catch (IOException e) {
               }
               break;
           }
         }
         public void outCommand(){
             System.out.print(readBufferTrial);
         }
         public void ownershipChange(int type) {
           switch (type) {
             case CommPortOwnershipListener.PORT_UNOWNED:
               System.out.println(portId.getName() + ": PORT_UNOWNED");
               break;
             case CommPortOwnershipListener.PORT_OWNED:
               System.out.println(portId.getName() + ": PORT_OWNED");
               break;
             case CommPortOwnershipListener.PORT_OWNERSHIP_REQUESTED:
               System.out.println(portId.getName() + ": PORT_INUSED");
               break;
           }
    
         }
         public void closePort(){
    
            serialPort.close(); 
         }
    
         public static void main(String args[]) {
           GSMConnect gsm = new GSMConnect(comPort);
           if (gsm.init()) {
             try {
                 System.out.println("Initialization Success");
               gsm.connect();
               Thread.sleep(5000);
               gsm.checkStatus();
               Thread.sleep(5000);
    
               gsm.sendMessage("+91XXXXXXXX", "Trial Success");
    
               Thread.sleep(1000);
    
               gsm.hangup();
               Thread.sleep(1000);
               gsm.closePort();
               gsm.outCommand();
               System.exit(1);
    
    
             } catch (Exception e) {
               e.printStackTrace();
             }
           } else {
             System.out.println("Can't init this card");
           }
         }
    
    
            }
codefreaK
fonte
7

Você pode usar o Nexmo para enviar e receber SMS .

O envio de SMS com a Nexmo Java Library é bastante simples. Depois de criar uma nova conta , alugar um número virtual e obter a chave e o segredo da API, você pode usar a biblioteca para enviar SMS da seguinte forma:

  public class SendSMS {

      public static void main(String[] args) throws Exception {
          AuthMethod auth = new TokenAuthMethod(API_KEY, API_SECRET);
          NexmoClient client = new NexmoClient(auth);

          TextMessage message = new TextMessage(FROM_NUMBER, TO_NUMBER, "Hello from Nexmo!");

          //There may be more than one response if the SMS sent is more than 160 characters.
          SmsSubmissionResult[] responses = client.getSmsClient().submitMessage(message);
            for (SmsSubmissionResult response : responses) {
            System.out.println(response);
          }
      }
  }

Para receber SMS, você precisará configurar um servidor que consome um webhook. Isso é bastante simples também. Eu recomendo verificar o nosso tutorial sobre o recebimento de SMS com Java .

Divulgação: Eu trabalho na Nexmo

ChrisG
fonte
2

O TextMarks fornece acesso ao seu código de acesso compartilhado para enviar e receber mensagens de texto do seu aplicativo por meio da API. As mensagens vêm de / para 41411 (em vez de, por exemplo, um número de telefone aleatório e, diferentemente dos gateways de e-mail, você tem 160 caracteres completos para trabalhar).

Você também pode instruir as pessoas a digitarem suas palavras-chave para 41411 para invocar várias funcionalidades no seu aplicativo. Há um cliente da API JAVA junto com vários outros idiomas populares e documentação e suporte técnico muito abrangentes.

A avaliação gratuita de 14 dias pode ser facilmente estendida para desenvolvedores que ainda estão testando e criando seus aplicativos.

Confira aqui: Informações da API TextMarks

dkamins
fonte
2

Você pode usar a API Java LOGICA SMPP para enviar e receber SMS no aplicativo Java. O LOGICA SMPP é uma API comprovada em aplicações de telecomunicações. A API da Logica também fornece capacidade de sinalização na conexão TCP / IP.

Você pode se integrar diretamente com várias operadoras de telecomunicações em todo o mundo.

Alpesh Gediya
fonte
2

Há duas maneiras: Primeiro: use um SMS API Gateway que você precisa pagar por isso; talvez você encontre algumas avaliações gratuitas, mas é escassa. Segundo: Para usar o comando AT com um modem GSM conectado ao seu laptop. Isso é tudo

Choulli ILyass
fonte
2

Depende de como você vai trabalhar e quem é seu provedor.

Se você trabalha com uma empresa de gateway sms, provavelmente trabalha com o protocolo SMPP (o 3.4 ainda é o mais comum), então dê uma olhada no OpenSMPP e no jSMPP. Essas são bibliotecas poderosas para trabalhar com o SMPP.

Se você estiver trabalhando com seu próprio hardware (por exemplo, um modem GSM), a maneira mais fácil de enviar mensagens é através dos comandos AT, eles diferem dependendo do modelo, portanto, você deve descobrir quais comandos AT são suportados pelo seu modem. . Em seguida, se o seu modem tiver um IP e aberto à conexão, você poderá enviar comandos pelo soquete java

Socket smppSocket = new Socket("YOUR_MODEM_IP", YOUR_MODEM_PORT);
DataOutputStream os = new DataOutputStream(smppSocket.getOutputStream());
DataInputStream is = new DataInputStream(smppSocket.getInputStream());

os.write(some_byte_array[]);
is.readLine();

Caso contrário, você trabalhará através de uma porta COM, mas o método é o mesmo (enviando comandos AT), você pode encontrar mais informações sobre como trabalhar com portas seriais aqui .

DenisD
fonte
2

OMK.smpp. API. sua base no SMPP e simulador também está disponível gratuitamente

API LOGICA SMPP.

E outra opção é o Kannel, um gateway WAP e SMS gratuito.

Ravi Parekh
fonte
A configuração do kannel faz você suar se você conseguir configurá-lo com modem, compartilhe os procedimentos.
Dun0523
2

Sugiro uma solução baseada em nuvem como o Twilio. As soluções baseadas em nuvem são econômicas, do que uma solução interna, pois não há manutenção contínua necessária. O SMS por e-mail não é uma solução elegante, pois você precisa obter as informações da operadora do usuário e nunca pode ter certeza de que pode enviar mensagens de texto para todos os números de celular. Estou usando o twilio java api no meu aplicativo da web para enviar sms do lado do servidor. em alguns minutos, você pode integrar-se ao seu aplicativo.

https://www.twilio.com/docs/java/install

Aqui está um exemplo do envio de uma mensagem SMS dos documentos:

import com.twilio.sdk.TwilioRestClient;
import com.twilio.sdk.TwilioRestException;
import com.twilio.sdk.resource.factory.MessageFactory;
import com.twilio.sdk.resource.instance.Message;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;

import java.util.ArrayList;
import java.util.List;

public class Example {

  // Find your Account Sid and Token at twilio.com/user/account
  public static final String ACCOUNT_SID = "{{ account_sid }}";
  public static final String AUTH_TOKEN = "{{ auth_token }}";

  public static void main(String[] args) throws TwilioRestException {
    TwilioRestClient client = new TwilioRestClient(ACCOUNT_SID, AUTH_TOKEN);

    // Build a filter for the MessageList
    List<NameValuePair> params = new ArrayList<NameValuePair>();
    params.add(new BasicNameValuePair("Body", "Test Twilio message"));
    params.add(new BasicNameValuePair("To", "+14159352345"));
    params.add(new BasicNameValuePair("From", "+14158141829"));

    MessageFactory messageFactory = client.getAccount().getMessageFactory();
    Message message = messageFactory.create(params);
    System.out.println(message.getSid());
  }
}
rickyrobinett
fonte
1
Pago, mas é menos de um centavo por mensagem de texto.
Karthik Sankar
1

O smslib é muito útil para esse fim. Você pode conectar um modem ao seu PC e usar esta lib para enviar sms. Funciona eu usei

Abdullah Al Noman
fonte
1

Também adoramos Java no Wavecell , mas essa pergunta pode ser respondida sem detalhes específicos do idioma, pois temos uma API REST que cobrirá a maioria das suas necessidades:

curl -X "POST" https://api.wavecell.com/sms/v1/amazing_hq/single \
    -u amazing:1234512345 \
    -H "Content-Type: application/json" \
    -d $'{ "source": "AmazingDev", "destination": "+6512345678", "text": "Hello, World!" }'

Veja estas perguntas se você tiver problemas com o envio de solicitações HTTP em Java:

Para casos específicos, você também pode considerar o uso da API SMPP e a biblioteca JSMPP já mencionada ajudará nisso.

astef
fonte
0

Você pode usar o Twilio para isso. Mas se você estiver procurando por uma solução alternativa complicada, siga a solução alternativa que mencionei abaixo.

Isso não é possível para receber sms. Mas este é um método complicado que você pode usar para enviar sms para número de clientes. Você pode usar a API do twitter. Podemos seguir a conta do twitter do nosso celular com um sms. Nós apenas temos que enviar sms para o twitter. Imagine que criamos uma conta no Twitter com o nome de usuário @username. Em seguida, podemos enviar sms para 40404, como mostrado abaixo.

follow @username

Começamos a receber tweets que são twittados nessa conta.

Então, depois de criar uma conta no Twitter, podemos usar a API do Twitter para postar tweets dessa conta. Todos os clientes que seguiram essa conta, como mencionei antes, começarão a receber tweets.

Você pode aprender a postar tweets com a API do twitter no link a seguir.

API do Twitter

Antes de começar a desenvolver, você precisa obter permissão para usar a API do Twitter. Você pode obter acesso à API do twitter no seguinte link.

Console do desenvolvedor do Twitter

Esta não é a melhor solução para o seu problema, mas espero que isso ajude.

hackerbuddy
fonte
-3

Você pode usar os comandos da AT&T para enviar sms usando o modem GSM.

Musaddique
fonte