So senden Sie SMS in Java

133

Welche Möglichkeiten gibt es, SMS von einer Java-Anwendung zu senden und zu empfangen?

Wie?

Jigar Joshi
quelle

Antworten:

19

(Haftungsausschluss: Ich arbeite bei Twilio)

Twilio bietet ein Java SDK zum Senden von SMS über die Twilio REST API.

John Sheehan - Runscope
quelle
Was ist, wenn ich es auf meinem Server empfangen möchte?
Jigar Joshi
Sie würden sich für ein Twilio-Konto anmelden und dann eine URL zuweisen, die beim Empfang
John Sheehan
1
Danke für Twilio. :)
Chirag Savsani
15

Wenn Sie nur einfache Benachrichtigungen wünschen, unterstützen viele Netzbetreiber SMS per E-Mail. Siehe SMS per E-Mail

Steven A. Lowe
quelle
10

Die beste SMS-API, die ich in Java gesehen habe, ist JSMPP. Es ist leistungsstark, einfach zu bedienen und ich habe es selbst für eine Anwendung auf Unternehmensebene verwendet (täglich über 20.000 SMS-Nachrichten senden).

Diese API wurde erstellt, um die Ausführlichkeit der vorhandenen SMPP-API zu verringern. Es ist sehr einfach und benutzerfreundlich, da es die Komplexität der Protokollkommunikation auf niedriger Ebene verbirgt, z. B. die automatische Abfrage von Verbindungsanfragen und -antworten.

Ich habe einige andere APIs wie Ozeki ausprobiert, aber die meisten davon sind entweder kommerziell oder haben einen eingeschränkten Durchsatz (dh sie können beispielsweise nicht mehr als 3 SMS-Nachrichten pro Sekunde senden).

Eng.Fouad
quelle
10

Es gibt eine API namens SMSLib, es ist wirklich großartig. http://smslib.org/

Jetzt haben Sie viele Saas-Anbieter, die Ihnen diesen Service mithilfe ihrer APIs anbieten können

Beispiel: Mailchimp, Esendex, Twilio, ...

Marouane Gazanayi
quelle
9

Sie können dies mit einem GSM-Modem und einer Java-Kommunikations-API tun.

  1. Zuerst müssen Sie Java Comm Api einstellen

    In diesem Artikel wird ausführlich beschrieben, wie Sie die Kommunikations-API einrichten

  2. Als nächstes benötigen Sie ein GSM-Modem (vorzugsweise sim900-Modul)

  3. Java JDK neueste Version vorzuziehen

  4. AT Command Guide

    Code

    Paket Probe;

        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
quelle
7

Sie können Nexmo verwenden, um SMS zu senden und zu empfangen .

Das Senden von SMS mit der Nexmo Java Library ist ziemlich einfach. Nachdem Sie ein neues Konto erstellt , eine virtuelle Nummer gemietet und Ihren API-Schlüssel und Ihr Geheimnis erhalten haben, können Sie die Bibliothek verwenden, um SMS wie folgt zu senden:

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

Um SMS zu empfangen, müssen Sie einen Server einrichten, der einen Webhook verwendet. Das ist auch ziemlich einfach. Ich empfehle, unser Tutorial zum Empfangen von SMS mit Java zu lesen .

Offenlegung: Ich arbeite für Nexmo

ChrisG
quelle
2

Mit TextMarks können Sie auf den freigegebenen Shortcode zugreifen, um Textnachrichten von Ihrer App über deren API zu senden und zu empfangen. Nachrichten kommen von / bis 41411 (anstelle von z. B. einer zufälligen Telefonnummer und im Gegensatz zu E-Mail-Gateways stehen Ihnen die vollen 160 Zeichen zur Verfügung).

Sie können Personen auch anweisen, Text in Ihren Schlüsselwörtern an 41411 zu senden, um verschiedene Funktionen in Ihrer App aufzurufen. Es gibt einen JAVA API-Client zusammen mit mehreren anderen gängigen Sprachen sowie eine sehr umfassende Dokumentation und technischen Support.

Die 14-tägige kostenlose Testversion kann problemlos für Entwickler erweitert werden, die sie noch testen und ihre Apps erstellen.

Überprüfen Sie es hier: TextMarks API Info

Dkamins
quelle
2

Sie können die LOGICA SMPP Java API zum Senden und Empfangen von SMS in einer Java-Anwendung verwenden. LOGICA SMPP ist eine bewährte API für Telekommunikationsanwendungen. Die Logica-API bietet Ihnen auch Signalisierungsmöglichkeiten für TCP / IP-Verbindungen.

Sie können sich direkt in verschiedene Telekommunikationsbetreiber auf der ganzen Welt integrieren.

Alpesh Gediya
quelle
2

Es gibt zwei Möglichkeiten: Erstens: Verwenden Sie ein SMS-API-Gateway, für das Sie bezahlen müssen. Vielleicht finden Sie einige kostenlose Testversionen, aber es ist selten. Zweitens: Verwenden des AT-Befehls mit einem Modem-GSM, das an Ihren Laptop angeschlossen ist. das ist alles

Choulli ILyass
quelle
2

Es hängt davon ab, wie Sie arbeiten und wer Ihr Provider ist.

Wenn Sie mit einem SMS-Gateway-Unternehmen zusammenarbeiten, arbeiten Sie wahrscheinlich mit dem SMPP-Protokoll (3.4 ist immer noch das am häufigsten verwendete). Schauen Sie sich dann OpenSMPP und jSMPP an. Dies sind leistungsstarke Bibliotheken für die Arbeit mit SMPP.

Wenn Sie mit Ihrer eigenen Hardware (z. B. einem GSM-Modem) arbeiten möchten, können Sie Nachrichten am einfachsten über AT-Befehle senden. Diese unterscheiden sich je nach Modell. Sie sollten daher herausfinden, welche AT-Befehle von Ihrem Modem unterstützt werden . Wenn Ihr Modem eine IP-Adresse hat und für eine Verbindung offen ist, können Sie Befehle über den Java-Socket senden

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

Andernfalls arbeiten Sie über einen COM-Port, aber die Methode ist dieselbe (Senden von AT-Befehlen). Weitere Informationen zum Arbeiten mit seriellen Ports finden Sie hier .

DenisD
quelle
2

OMK.smpp. API. Es basiert auf SMPP und der Simulator ist ebenfalls kostenlos verfügbar

LOGICA SMPP API.

Eine weitere Option ist Kannel, ein kostenloses WAP- und SMS-Gateway.

Ravi Parekh
quelle
Wenn Sie Kannel konfigurieren, werden Sie ins Schwitzen geraten, wenn Sie es mit einem Modem konfigurieren können. Teilen Sie die Prozeduren mit.
Dun0523
2

Ich schlage eine Cloud-basierte Lösung wie Twilio vor. Cloud-basierte Lösungen sind kostengünstiger als eine interne Lösung, da keine laufende Wartung erforderlich ist. SMS per E-Mail ist keine elegante Lösung, da Sie die Carrier-Informationen vom Benutzer erhalten müssen und nie sicher sein können, dass Sie alle Handynummern per SMS senden können. Ich verwende Twilio Java API in meiner Webanwendung, um SMS vom Server zu senden. Innerhalb weniger Minuten können Sie sich in Ihre App integrieren.

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

Hier ist ein Beispiel für das Senden einer SMS-Nachricht aus den Dokumenten:

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
quelle
1
Bezahlt, aber es ist weniger als ein Cent pro SMS.
Karthik Sankar
1

smslib ist für diesen Zweck sehr nützlich. Sie können ein Modem mit Ihrem PC verbinden und diese Bibliothek zum Senden von SMS verwenden. Es funktioniert, ich habe es benutzt

Abdullah Al Noman
quelle
1

Wir lieben auch Java in Wavecell , aber diese Frage kann ohne sprachspezifische Details beantwortet werden, da wir eine REST-API haben, die die meisten Ihrer Anforderungen abdeckt:

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

Sehen Sie sich diese Fragen an, wenn Sie Probleme beim Senden von HTTP-Anforderungen in Java haben:

In bestimmten Fällen können Sie auch die Verwendung der SMPP-API in Betracht ziehen. Die bereits erwähnte JSMPP- Bibliothek hilft dabei.

Astef
quelle
0

Sie können Twilio dafür verwenden. Wenn Sie jedoch nach einer schwierigen Problemumgehung suchen, können Sie die unten erwähnte Problemumgehung befolgen.

Dies ist für den Empfang von SMS nicht möglich. Dies ist jedoch eine schwierige Methode, mit der Sie SMS an eine Anzahl von Clients senden können. Sie können die Twitter-API verwenden. Wir können den Twitter-Account von unserem Handy aus per SMS verfolgen. Wir müssen nur SMS an Twitter senden. Stellen Sie sich vor, wir erstellen ein Twitter-Konto mit dem Benutzernamen @username. Dann können wir wie unten gezeigt eine SMS an 40404 senden.

follow @username

Dann bekommen wir Tweets, die in diesem Account getwittert werden.

Nachdem wir ein Twitter-Konto erstellt haben, können wir die Twitter-API verwenden, um Tweets von diesem Konto zu veröffentlichen. Dann beginnen alle Kunden, die diesem Konto folgen, wie ich bereits erwähnt habe, Tweets zu erhalten.

Unter folgendem Link erfahren Sie, wie Sie Tweets mit der Twitter-API veröffentlichen.

Twitter API

Bevor Sie mit der Entwicklung beginnen, müssen Sie die Erlaubnis zur Verwendung der Twitter-API einholen. Sie können über den folgenden Link auf die Twitter-API zugreifen.

Twitter Developer Console

Dies ist nicht die beste Lösung für Ihr Problem. Aber hoffen Sie diese Hilfe.

Hackerbuddy
quelle
-3

Sie können AT & T-Befehle zum Senden von SMS mit einem GSM-Modem verwenden.

Musaddique
quelle