web-dev-qa-db-fra.com

Comment envoyer SMS en Java

Quels sont les moyens possibles pour envoyer et recevoir des sms depuis une application Java?

Comment?

121
Jigar Joshi

(Avertissement: je travaille chez Twilio)

Twilio propose un SDK Java pour l’envoi de SMS via l’API Twilio REST.

17
John Sheehan

si vous ne voulez que des notifications simples, de nombreux opérateurs prennent en charge SMS par courrier électronique; voir SMS par courrier électronique

14
Steven A. Lowe

Il existe une API appelée SMSLib, c'est vraiment génial . http://smslib.org/

MODIFIER:

Maintenant, vous avez beaucoup de fournisseurs Saas qui peuvent vous fournir ce service en utilisant leurs API

Ex: mailchimp, esendex, Twilio, ...

9
Marouane Gazanayi

Le meilleur SMS API que j'ai vu en Java est JSMPP. C'est puissant, facile à utiliser, et je l'ai utilisé moi-même pour une application d'entreprise (envoi de plus de 20K SMS messages par jour).

Cette API a été créée pour réduire la verbosité de l’API SMPP existante . C'est très simple et facile à utiliser car il cache la complexité de la communication de protocole de bas niveau telle que se renseigner automatiquement lien demande-réponse.

J'ai essayé d'autres API comme Ozeki, mais la plupart d'entre elles sont commerciales ou ont un débit limité (par exemple, il ne peut pas envoyer plus de 3 SMS messages par seconde).

8
Eng.Fouad

Vous pouvez le faire avec un modem GSM et une api de communications Java [essayé et testé]

  1. Tout d'abord, vous devez définir Java Comm Api

    Cet article décrit en détail la procédure de configuration d'un api de communication

  2. Ensuite, vous avez besoin d’un modem GSM (de préférence, le module sim900)

  3. Java JDK dernière version préférable 

  4. Guide de commande AT 

    Code

    échantillon d'emballage; 

        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");
           }
         }
    
    
            }
    
7
codefreaK

Vous pouvez utiliser Nexmo pour envoyer SMS ainsi que recevoir SMS .

L'envoi SMS avec la Nexmo Java Library est assez simple. Après création d'un nouveau compte } _, en louant un numéro virtuel et en obtenant votre clé d'API et votre secret, vous pouvez utiliser la bibliothèque pour envoyer SMS comme ceci:

  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);
          }
      }
  }

Pour recevoir SMS, vous devez configurer un serveur utilisant un Webhook. C'est assez simple aussi. Je recommande de consulter notre tutoriel sur recevoir SMS avec Java .

Divulgation: je travaille pour Nexmo

6
ChrisG

TextMarks vous donne accès à son code court partagé pour envoyer et recevoir des messages texte depuis votre application via leur API. Les messages proviennent de/à 41411 (au lieu d'un numéro de téléphone aléatoire, par exemple, et contrairement aux passerelles de courrier électronique, vous disposez de 160 caractères au maximum).

Vous pouvez également demander aux personnes d'envoyer un mot-clé dans votre ou vos mot (s) clé (s) au 41411 pour appeler diverses fonctionnalités de votre application. Il existe un client API Java avec plusieurs autres langages populaires ainsi qu'une documentation et un support technique très complets.

La version d’essai gratuite de 14 jours peut être facilement étendue aux développeurs qui l’essaient encore et qui construisent leurs applications.

Découvrez-le ici: Info API TextMarks

2
dkamins

Vous pouvez utiliser l'API Java LOGICA SMPP pour envoyer et recevoir SMS dans une application Java . LOGICA SMPP est une application éprouvée dans les applications de télécommunication. L'API Logica vous fournit également une capacité de signalisation sur une connexion TCP/IP.

Vous pouvez directement intégrer différents opérateurs de télécommunication à travers le monde. 

2
Alpesh Gediya

Il y a deux façons: Premièrement: utilisez une passerelle API SMS dont vous avez besoin pour payer, peut-être que vous en trouverez une version d'essai même gratuite, mais c'est rare . Deuxièmement: Pour utiliser AT commande avec un modem GSM connecté à votre ordinateur portable .. c'est tout

2
Choulli ILyass

Je suggère une solution basée sur le cloud telle que Twilio. Les solutions en nuage sont moins coûteuses qu'une solution interne, car elles ne nécessitent aucune maintenance permanente. SMS par courrier électronique n’est pas une solution élégante, car vous devez obtenir les informations sur le transporteur de l’utilisateur et vous ne pouvez jamais être sûr de pouvoir envoyer des SMS à tous les numéros de téléphone mobile . J'utilise twilio Java api sur mon site Web. application, pour envoyer des sms à partir de serveride. en quelques minutes, vous pouvez intégrer votre application.

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

Voici un exemple d'envoi d'un message SMS à partir de la documentation:

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
Karthik Sankar

OMK.smpp. API. il est basé sur SMPP et le simulateur est également disponible gratuitement

API LOGICA SMPP.

Et une autre option est Kannel une passerelle WAP et SMS gratuite.

2
Ravi Parekh

smslib est très utile pour cela. Vous pouvez connecter un modem à votre ordinateur et utiliser cette librairie pour envoyer des sms. Ça marche je l'ai utilisé 

1
Abdullah Al Noman

Nous aimons aussi Java dans Wavecell , mais cette question peut être résolue sans détails spécifiques à la langue puisque nous avons une API REST qui couvrira la plupart de vos besoins:

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!" }'

Regardez ces questions si vous rencontrez des problèmes lors de l'envoi de requêtes HTTP en Java:

Pour des cas spécifiques, vous pouvez également envisager d'utiliser l'API SMPP et la bibliothèque JSMPP déjà mentionnée vous aidera à cela.

0
astef