Como enviar SMS em Java

Quais são as formas possíveis de enviar e receber sms da aplicação java ?

Nota: estou à espera de uma lista de maneiras possíveis. também a sua opinião sobre cada um, o que é melhor / como?

 121
Author: Jigar Joshi, 2010-04-03

16 answers

(declaração de exoneração de Responsabilidade: trabalho na Twilio)

Twilio oferece um SDK Java para o envio de SMS através da API Twilio REST.

 16
Author: John Sheehan - Runscope, 2016-03-07 16:19:23

Se só quiser notificações simples, muitas transportadoras suportam SMS via email; veja SMS através de E-Mail

 14
Author: Steven A. Lowe, 2010-04-03 06:14:32
Há uma API chamada SMSLib, é realmente incrível. http://smslib.org/

Editar:

Agora você tem um monte de provedores de Saas que podem lhe dar este serviço usando lá APIs

Ex: mailchimp, esendex, Twilio ,..

 9
Author: Marouane Gazanayi, 2018-05-15 14:53:45
A melhor API de SMS que já vi em Java é JSMPP. É poderoso, fácil de usar, e eu mesmo o usei para uma aplicação de nível empresarial (enviando mais de 20k mensagens SMS diariamente).

Esta API criou para reduzir a verbosidade da API SMPP existente. É muito simples e fácil de usar porque esconde a complexidade de a comunicação de Protocolo de baixo nível, como a consulta automática link pedido-resposta.

Tentei outras APIs como o Ozeki, mas a maioria delas é comercial ou tem limitação no seu rendimento (ou seja, não pode enviar mais de 3 mensagens SMS num segundo, por exemplo).

 8
Author: Eng.Fouad, 2013-04-18 21:13:38

Você pode usar Nexmo para enviar SMSassim como receber SMS.

Enviar SMS com a biblioteca Java Nexmo é bastante simples. Depois de criar uma nova conta , alugar um número virtual e obter a sua chave & segredo da API, poderá usar a biblioteca para enviar SMS como:

  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, terá de configurar um servidor que consuma um webhook. Também é bastante simples. Eu recomendo verificar o nosso tutorial em recebendo SMS com Java .

divulgação: eu trabalho para a Nexmo

 6
Author: ChrisG, 2017-11-10 16:13:30

Pode fazer isto com um Modem GSM e uma Api de comunicações Java [experimentada e testada]

  1. Primeiro você precisa definir Java Comm Api

    Este artigo descreve em detalhe como configurar a Api de comunicação

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

  3. Java JDK última versão preferível

  4. No Guia de comandos

    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");
           }
         }
    
    
            }
    
 5
Author: Sachin Divakar, 2015-07-11 19:55:40

Os Favoritos dão-lhe acesso ao seu shortcode partilhado para enviar e receber mensagens de texto da sua aplicação através da sua API. As mensagens vêm de / para 41411 (em vez de, por exemplo, um telefone Aleatório# e, ao contrário dos portais de E-mail, você tem os 160 caracteres completos para trabalhar).

Também pode dizer às pessoas para enviarem texto nas suas palavras-chave para 41411 para invocarem várias funcionalidades na sua aplicação. Há um cliente API JAVA, juntamente com várias outras linguagens populares e documentação muito abrangente e técnica suportar.

O teste gratuito de 14 dias pode ser facilmente estendido para desenvolvedores que ainda estão testando e construindo seus aplicativos.

Veja aqui: Informação da API dos favoritos do texto

 2
Author: dkamins, 2011-12-20 03:17:03

Você pode logar a API SMPP Java para enviar e receber SMS na aplicação Java. LOGICA SMPP é api bem comprovada na aplicação telecom. A API Logica também lhe fornece capicidade de sinalização na ligação TCP / IP.

Pode integrar-se directamente com vários operadores de telecomunicações em todo o mundo.
 2
Author: Alpesh Gediya, 2013-04-18 10:49:54
Há duas maneiras. : Primeiro: Use um Gateway API SMS que você precisa para pagar por ele, talvez você encontrar algumas provações mesmo livres, mas é escasso . Segundo: usar no comando com um modem GSM conectado ao seu laptop . é tudo.
 2
Author: Choulli ILyass, 2013-08-23 17:41:43
Depende de como vai trabalhar e de quem é o seu fornecedor.

Se você trabalha com uma empresa de SMS-gateway você provavelmente vai trabalhar através do protocolo SMPP (3.4 ainda é o mais comum), então dê uma olhada no OpenSMPP e jSMPP. Estas são poderosas libs para trabalhar com o SMPP.

Se vai trabalhar com o seu próprio hardware (por exemplo, um modem gsm), a maneira mais fácil de enviar mensagens é através de comandos AT, eles diferem dependendo do modelo, por isso, deve descobrir o que são os comandos AT apoiado pelo seu modem. Em seguida, se o seu modem tiver um IP e estiver aberto à ligação, poderá enviar comandos através do 'socket' de 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, irá trabalhar através de uma porta COM, mas o método é o mesmo (enviar comandos AT), poderá encontrar mais informações sobre como trabalhar com portas seriais aqui.

 2
Author: DenisD, 2014-07-10 11:22:22

OMK.smpp. CONJUNTO. é a base em SMPP. e o simulador também está disponível gratuitamente

LOGICA SMPP API.

E outra opção é Kannel uma 'gateway' WAP e SMS livres.

 2
Author: Ravi Parekh, 2014-08-08 11:49:06
Sugiro uma solução baseada em nuvens como o Twilio. As soluções baseadas em nuvem são rentáveis, mais do que uma solução interna, pois não há manutenção contínua, necessária. SMS através de E-mail não é uma solução elegante, como você tem que obter as informações da portadora do Usuário e você nunca pode ter certeza de que você pode enviar todos os números de celular. Estou usando twilio java api em minha aplicação web, para enviar sms de serverside. em poucos minutos, você pode integrar-se com o seu aplicacao.

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

Aqui está um exemplo a enviar 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());
  }
}
 2
Author: rickyrobinett, 2016-02-18 20:51:08

O Smslib é muito útil para este fim. o u pode ligar um modem ao seu pc e usar esta lib para enviar sms . Funciona. já o usei.

 1
Author: Abdullah Al Noman, 2014-11-24 10:32:05

Também adoramos Java em Wavecell , mas esta pergunta pode ser respondida sem detalhes específicos da linguagem, Uma vez que temos uma API de descanso que irá 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 tiver problemas em Enviar pedidos HTTP em Java:

Para casos específicos, pode também considerar a utilização do a API SMPP e já mencionada a biblioteca JSMPP vai ajudar nisso.

 0
Author: astef, 2017-09-17 19:06:35

Pode usar comandos AT & T para enviar sms através do modem GSM.

 -2
Author: Musaddique, 2016-03-16 09:31:29