wake-up-neo.com

Wie senden SMS in Java

Wie können SMS von einer Java-Anwendung gesendet und empfangen werden?

Wie?

121
Jigar Joshi

(Haftungsausschluss: Ich arbeite bei Twilio)

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

17
John Sheehan

wenn Sie nur einfache Benachrichtigungen wünschen, unterstützen viele Netzbetreiber SMS per E-Mail. siehe SMS über E-Mail

14
Steven A. Lowe

Es gibt eine API mit dem Namen SMSLib, die wirklich unglaublich ist . http://smslib.org/

BEARBEITEN:

Nun gibt es viele Saas-Anbieter, die Ihnen diesen Service mit Hilfe von APIs anbieten können

ZB: mailchimp, esendex, Twilio, ...

9

Die beste SMS - API, die ich in Java gesehen habe, ist JSMPP. Es ist leistungsstark, einfach zu verwenden und ich habe es selbst für eine Unternehmensanwendung verwendet (täglich über 20K SMS Nachrichten senden).

Diese API wurde erstellt, um die Ausführlichkeit der vorhandenen SMPP-API zu reduzieren. Es ist sehr einfach und benutzerfreundlich, da es die Komplexität von .__ verbirgt. die Low-Level-Protokollkommunikation, wie z. B. eine automatische Anfrage Link-Anfrage-Antwort.

Ich habe einige andere APIs wie Ozeki ausprobiert, aber die meisten von ihnen sind entweder kommerziell oder haben in ihrem Durchsatz Einschränkungen (d. H. Können nicht mehr als 3 SMS -Nachrichten pro Sekunde).

8
Eng.Fouad

Sie können dies mit einem GSM-Modem und Java-Kommunikations-API tun [getestet und getestet]

  1. Zuerst müssen Sie Java Comm Api einstellen

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

  2. Weiter benötigen Sie ein GSM-Modem (vorzugsweise Sim900-Modul)

  3. Java JDK neueste Version vorzuziehen 

  4. AT Befehlshandbuch 

    Code

    paketbeispiel; 

        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

Sie können Nexmo für send SMS sowie für receive SMS verwenden.

Senden SMS mit der Nexmo Java Library ist ziemlich unkompliziert. Nach Erstellen eines neuen Kontos , Mieten einer virtuellen Nummer und Abrufen des API-Schlüssels und des Geheimnisses können Sie die Bibliothek zum Senden SMS wie folgt verwenden:

  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 zu empfangen SMS müssen Sie einen Server einrichten, der einen Webhook belegt. Das ist auch ziemlich einfach. Ich empfehle, unser Tutorial zu Empfangen SMS mit Java auszuprobieren.

Disclosure: Ich arbeite für Nexmo

6
ChrisG

Mit TextMarks können Sie auf den gemeinsamen Kurzcode zugreifen, um Textnachrichten von Ihrer App über ihre API zu senden und zu empfangen. Nachrichten kommen von/an 41411 (anstelle von beispielsweise einer zufälligen Telefonnummer und im Gegensatz zu E-Mail-Gateways haben Sie die vollen 160 Zeichen, um damit zu arbeiten).

Sie können den Benutzern auch mitteilen, dass Sie in Ihren Keywords eine Nachricht an 41411 senden möchten, um verschiedene Funktionen in Ihrer App aufzurufen. Es gibt einen Java-API-Client zusammen mit mehreren anderen gängigen Sprachen und einem sehr umfangreichen Dokumentations- 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

2
dkamins

Sie können die Java API von LOGICA SMPP zum Senden und Empfangen von SMS in einer Java-Anwendung verwenden Mit der Logica-API können Sie auch TCP/IP-Verbindungen signalisieren.

Sie können direkt mit verschiedenen Telekommunikationsbetreibern auf der ganzen Welt integrieren. 

2
Alpesh Gediya

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

2
Choulli ILyass

Ich empfehle eine Cloud-basierte Lösung wie Twilio. Cloud-basierte Lösungen sind kostengünstiger als eine Inhouse-Lösung, da keine laufenden Wartungsarbeiten erforderlich sind. SMS per E-Mail ist keine elegante Lösung, da Sie die Informationen des Betreibers vom Benutzer erhalten müssen und Sie nie sicher sein können, dass Sie alle Handynummern per SMS senden können Anwendung, um SMS von Server-Seite zu senden. Innerhalb weniger Minuten können Sie Ihre App integrieren.

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

Hier ein Beispiel, in dem Sie eine SMS -Meldung aus den Dokumenten senden:

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

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

Wenn Sie mit einem SMS-Gateway-Unternehmen zusammenarbeiten, arbeiten Sie wahrscheinlich mit dem SMPP-Protokoll (3.4 ist immer noch das häufigste). Dann schauen Sie sich OpenSMPP und jSMPP an. Dies sind leistungsfähige Bibliotheken für die Arbeit mit SMPP.

Wenn Sie mit Ihrer eigenen Hardware (z. B. einem GSM-Modem) arbeiten, ist der einfachste Weg, Nachrichten zu senden, die Befehle AT. Diese unterscheiden sich je nach Modell. Daher sollten Sie herausfinden, was AT Befehle werden von Ihrem Modem unterstützt. Wenn Ihr Modem eine IP-Adresse hat und für die Verbindung geöffnet 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();

Ansonsten 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 .

2
DenisD

OMK.smpp. API. Es basiert auf SMPP Der Simulator ist ebenfalls kostenlos erhältlich

LOGICA SMPP API.

Und eine weitere Option ist Kannel ein kostenloses WAP- und SMS - Gateway.

2
Ravi Parekh

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

1

Wir lieben Java auch 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, und die bereits erwähnte JSMPP library hilft dabei.

0
astef