Comment envoyer des SMS en Java

133

Quels sont les moyens possibles d'envoyer et de recevoir des SMS depuis une application Java?

Comment?

Jigar Joshi
la source

Réponses:

19

(Clause de non-responsabilité: je travaille chez Twilio)

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

John Sheehan - Runscope
la source
et si je veux le recevoir sur mon serveur?
Jigar Joshi
Vous vous inscrivez pour un compte Twilio, puis attribuez une URL à accéder à la réception d'un message entrant: twilio.com/sms
John Sheehan
1
Merci pour Twilio. :)
Chirag Savsani
15

si vous ne voulez que de simples notifications, de nombreux opérateurs prennent en charge les SMS par e-mail; voir les SMS par e-mail

Steven A. Lowe
la source
10

La meilleure API SMS que j'ai vue en Java est JSMPP. Il est puissant, facile à utiliser et je l'ai moi-même utilisé pour une application de niveau entreprise (envoi de plus de 20 000 SMS par jour).

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

J'ai essayé d'autres API telles que Ozeki, mais la plupart d'entre elles sont soit commerciales, soit ont une limitation de débit (c'est-à-dire ne peuvent pas envoyer plus de 3 SMS en une seconde, par exemple).

Ing. Fouad
la source
10

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

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

Ex: mailchimp, esendex, Twilio, ...

Marouane Gazanayi
la source
9

Vous pouvez le faire avec un modem GSM et une API Java Communications [Essayé et testé]

  1. Vous devez d'abord définir Java Comm Api

    Cet article décrit en détail comment configurer l'API de communication

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

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

  4. Guide de commande AT

    Code

    échantillon de paquet;

        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
la source
7

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

L'envoi de SMS avec la bibliothèque Java Nexmo est assez simple. Après avoir créé un nouveau compte , loué un numéro virtuel et obtenu votre clé API et votre secret, vous pouvez utiliser la bibliothèque pour envoyer des SMS comme suit:

  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 des SMS, vous devez configurer un serveur qui utilise un webhook. C'est aussi assez simple. Je vous recommande de consulter notre tutoriel sur la réception de SMS avec Java .

Divulgation: je travaille pour Nexmo

ChrisG
la source
2

TextMarks vous donne accès à son shortcode partagé pour envoyer et recevoir des messages texte de votre application via leur API. Les messages viennent de / vers 41411 (au lieu, par exemple, d'un numéro de téléphone aléatoire et contrairement aux passerelles de messagerie électronique, vous disposez des 160 caractères complets avec lesquels travailler).

Vous pouvez également demander aux utilisateurs d'envoyer un SMS dans vos mots clés au 41411 pour appeler diverses fonctionnalités de votre application. Il existe un client API JAVA avec plusieurs autres langages populaires et une documentation et un support technique très complets.

L'essai gratuit de 14 jours peut être facilement prolongé pour les développeurs qui sont encore en train de le tester et de créer leurs applications.

Vérifiez-le ici: Infos sur l'API TextMarks

dkamins
la source
2

Vous pouvez vous LOGICA API Java SMPP pour l'envoi et la réception de SMS dans l'application Java. LOGICA SMPP est une API bien éprouvée dans les applications de télécommunications. L'API Logica vous offre également une capacité de signalisation sur la connexion TCP / IP.

Vous pouvez directement intégrer avec divers opérateurs de télécommunications à travers le monde.

Alpesh Gediya
la source
2

Il y a deux façons: Premièrement: utilisez une passerelle API SMS que vous devez payer, peut-être que vous trouverez des essais, même gratuits, mais c'est rare. Deuxièmement: Pour utiliser la commande AT avec un modem GSM connecté à votre ordinateur portable. c'est tout

Choulli ILyass
la source
2

Cela dépend de la façon dont vous allez travailler et de votre fournisseur.

Si vous travaillez avec une entreprise de passerelle sms, vous utiliserez probablement le protocole SMPP (3.4 est toujours le plus courant), alors jetez un œil sur OpenSMPP et jSMPP. Ce sont de puissantes bibliothèques pour fonctionner avec SMPP.

Si vous comptez travailler avec votre propre matériel (par exemple un modem gsm), le moyen le plus simple d'envoyer des messages consiste à utiliser des commandes AT, elles diffèrent selon le modèle, vous devriez donc savoir quelles commandes AT sont prises en charge par votre modem. . Ensuite, si votre modem a une adresse IP et est ouvert à la connexion, vous pouvez envoyer des commandes via la prise 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();

Sinon, vous travaillerez via un port COM, mais la méthode est la même (envoi de commandes AT), vous pouvez trouver plus d'informations sur le fonctionnement des ports série ici .

DenisD
la source
2

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.

Ravi Parekh
la source
La configuration du kannel vous fait perdre une sueur si vous parvenez à le configurer avec un modem, veuillez partager les procédures.
Dun0523
2

Je suggère une solution basée sur le cloud comme Twilio. Les solutions basées sur le cloud sont plus rentables qu'une solution interne car aucune maintenance continue n'est requise. Le SMS par e-mail n'est pas une solution élégante, car vous devez obtenir les informations de l'opérateur auprès de l'utilisateur et vous ne pouvez jamais être sûr de pouvoir envoyer des SMS à tous les numéros de mobile. J'utilise l'api twilio java dans mon application web, pour envoyer des sms depuis le serveur. 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());
  }
}
rickyrobinett
la source
1
Payé mais c'est moins d'un centime par SMS.
Karthik Sankar
1

smslib est très utile à cet effet. Vous pouvez connecter un modem à votre PC et utiliser cette bibliothèque pour envoyer des sms. Ça marche je l'ai utilisé

Abdullah Al Noman
la source
1

Nous aimons aussi Java dans Wavecell , mais cette question peut être répondue sans détails spécifiques au langage 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.

Astef
la source
0

Vous pouvez utiliser Twilio pour cela. Mais si vous recherchez une solution de contournement délicate, vous pouvez suivre la solution de contournement que j'ai mentionnée ci-dessous.

Ce n'est pas possible pour recevoir des sms. Mais c'est une méthode délicate que vous pouvez utiliser pour envoyer des sms à un certain nombre de clients. Vous pouvez utiliser l'API Twitter. Nous pouvons suivre le compte Twitter depuis notre téléphone portable avec un sms. Nous devons juste envoyer des sms à Twitter. Imaginez que nous créons un compte Twitter avec le nom d'utilisateur @username. Ensuite, nous pouvons envoyer des sms au 40404 comme indiqué ci-dessous.

follow @username

Ensuite, nous commençons à recevoir des tweets qui sont tweetés dans ce compte.

Ainsi, après avoir créé un compte Twitter, nous pouvons utiliser l'API Twitter pour publier des tweets à partir de ce compte. Ensuite, tous les clients qui ont suivi ce compte comme je l'ai mentionné avant de commencer à recevoir des tweets.

Vous pouvez apprendre à publier des tweets avec l'API Twitter à partir du lien suivant.

API Twitter

Avant de commencer à développer, vous devez obtenir l'autorisation d'utiliser l'API Twitter. Vous pouvez accéder à l'API Twitter à partir du lien suivant.

Console développeur Twitter

Ce n'est pas la meilleure solution pour votre problème, mais espérons que cette aide.

hackerbuddy
la source
-3

Vous pouvez utiliser les commandes AT&T pour envoyer des SMS à l'aide d'un modem GSM.

Musaddique
la source