วิธีส่ง SMS ใน Java


136

วิธีที่เป็นไปได้ในการส่งและรับ sms จากแอปพลิเคชัน Java คืออะไร?

อย่างไร?

คำตอบ:


19

(ข้อจำกัดความรับผิดชอบ: ฉันทำงานที่ Twilio)

Twilio เสนอ Java SDKสำหรับส่ง SMS ผ่าน Twilio REST API


จะเกิดอะไรขึ้นถ้าฉันต้องการรับมันบนเซิร์ฟเวอร์ของฉัน?
Jigar Joshi

คุณต้องสมัครบัญชี Twilio จากนั้นกำหนด URL ที่จะเข้าชมเมื่อได้รับข้อความขาเข้า: twilio.com/sms
John Sheehan

1
ขอบคุณสำหรับ Twilio :)
Chirag Savsani


11

มี API ที่เรียกว่า SMSLib มันยอดเยี่ยมมาก http://smslib.org/

ตอนนี้คุณมีผู้ให้บริการ Saas จำนวนมากที่สามารถให้บริการนี้แก่คุณโดยใช้ API ของพวกเขา

เช่น mailchimp, esendex, Twilio, ...


9

SMS API ที่ดีที่สุดที่ฉันเคยเห็นใน Java คือ JSMPP มันมีประสิทธิภาพใช้งานง่ายและฉันใช้มันเองสำหรับแอปพลิเคชันระดับองค์กร (ส่งข้อความ SMS มากกว่า 20K ทุกวัน)

API นี้สร้างขึ้นเพื่อลดความฟุ่มเฟือยของ SMPP API ที่มีอยู่ มันง่ายมากและใช้งานง่ายเพราะมันซ่อนความซับซ้อนของการสื่อสารโปรโตคอลระดับต่ำเช่นสอบถามการตอบสนองคำขอลิงค์โดยอัตโนมัติ

ฉันได้ลองใช้ API อื่น ๆ แล้วเช่น Ozeki แต่ส่วนใหญ่เป็นแบบเชิงพาณิชย์หรือมีข้อ จำกัด ในปริมาณงาน (เช่นไม่สามารถส่งข้อความ SMS ได้มากกว่า 3 ข้อความในหนึ่งวินาที)


9

คุณสามารถทำได้ด้วยโมเด็ม GSM และ Java Communications Api [พยายามและทดสอบแล้ว]

  1. ก่อนอื่นคุณต้องตั้งค่า Java Comm Api

    บทความนี้อธิบายรายละเอียดวิธีการตั้งค่า Communication Api

  2. ต่อไปคุณต้องมีโมเด็ม GSM (ควรเป็นโมดูล sim900)

  3. Java JDK เวอร์ชันล่าสุดควรเป็น

  4. คู่มือคำสั่ง AT

    รหัส

    ตัวอย่างแพ็คเกจ

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

8

คุณสามารถใช้ Nexmo การส่ง SMSรวมทั้งได้รับ SMS

การส่ง SMS ด้วยNexmo Java Libraryนั้นค่อนข้างตรงไปตรงมา หลังจากสร้างบัญชีใหม่เช่าหมายเลขเสมือนและรับคีย์ API และข้อมูลลับของคุณคุณสามารถใช้ไลบรารีเพื่อส่ง SMS ได้ดังนี้:

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

ในการรับ SMS คุณจะต้องตั้งค่าเซิร์ฟเวอร์ที่ใช้ webhook มันค่อนข้างง่ายเช่นกัน ผมขอแนะนำให้ตรวจสอบจากการกวดวิชาของเราในการรับ SMS กับ Java

การเปิดเผยข้อมูล: ฉันทำงานให้กับ Nexmo


2

TextMarks ช่วยให้คุณเข้าถึงรหัสย่อที่ใช้ร่วมกันเพื่อส่งและรับข้อความจากแอปของคุณผ่าน API ข้อความมาจาก / ถึง 41411 (แทนที่จะเป็นโทรศัพท์แบบสุ่ม # และไม่เหมือนกับเกตเวย์อีเมลที่คุณมีตัวอักษรทั้งหมด 160 ตัวที่จะใช้งานได้)

คุณยังสามารถบอกให้ผู้อื่นส่งข้อความในคีย์เวิร์ดของคุณไปที่ 41411 เพื่อเรียกใช้ฟังก์ชันต่างๆในแอปของคุณ มีไคลเอนต์ JAVA API พร้อมกับภาษายอดนิยมอื่น ๆ และเอกสารประกอบและการสนับสนุนทางเทคนิคที่ครอบคลุมมาก

การทดลองใช้ฟรี 14 วันสามารถขยายได้อย่างง่ายดายสำหรับนักพัฒนาที่ยังคงทดสอบและสร้างแอปของตน

ตรวจสอบได้ที่นี่: ข้อมูล TextMarks API


2

มีสองวิธี: ประการแรก: ใช้ SMS API Gateway ซึ่งคุณต้องจ่ายเงินบางทีคุณอาจพบว่ามีการทดลองใช้ฟรี แต่ก็หายาก ประการที่สอง: ในการใช้คำสั่ง AT กับโมเด็ม GSM ที่เชื่อมต่อกับแล็ปท็อปของคุณ นั่นคือทั้งหมด


2

OMK.smpp. API เป็นฐานของ SMPP และโปรแกรมจำลองยังให้บริการฟรี

LOGICA SMPP API

และอีกทางเลือกหนึ่งคือKannelเป็นเกตเวย์ WAP และ SMS ฟรี


การกำหนดค่า kannel ทำให้คุณเหงื่อตกหากคุณจัดการกำหนดค่าด้วยโมเด็มโปรดแบ่งปันขั้นตอน
Dun0523

2

ฉันขอแนะนำโซลูชันบนคลาวด์เช่น Twilio โซลูชันที่ใช้ระบบคลาวด์นั้นคุ้มค่ากว่าโซลูชันในตัวเนื่องจากไม่จำเป็นต้องมีการบำรุงรักษาอย่างต่อเนื่อง SMS ผ่านอีเมลไม่ใช่วิธีแก้ปัญหาที่หรูหราเนื่องจากคุณต้องได้รับข้อมูลผู้ให้บริการจากผู้ใช้และคุณจะไม่มีทางมั่นใจได้ว่าคุณสามารถส่งข้อความถึงหมายเลขโทรศัพท์มือถือทั้งหมดได้ ฉันใช้ twilio java api ในเว็บแอปพลิเคชันของฉันเพื่อส่ง sms จากเซิร์ฟเวอร์ ภายในไม่กี่นาทีคุณสามารถรวมเข้ากับแอปของคุณได้

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

นี่คือตัวอย่างการส่งข้อความ SMS จากเอกสาร:

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

1
จ่าย แต่น้อยกว่าหนึ่งเซ็นต์ต่อข้อความ
Karthik Sankar

1

คุณสามารถ LOGICA SMPP Java API สำหรับการส่งและรับ SMS ในแอปพลิเคชัน Java LOGICA SMPP เป็น API ที่ได้รับการพิสูจน์แล้วในแอปพลิเคชันโทรคมนาคม Logica API ยังให้ความสามารถในการส่งสัญญาณบนการเชื่อมต่อ TCP / IP

คุณสามารถผสานรวมโดยตรงกับผู้ให้บริการโทรคมนาคมต่างๆทั่วโลก


1

ขึ้นอยู่กับว่าคุณจะทำงานอย่างไรและผู้ให้บริการของคุณคือใคร

หากคุณทำงานกับ บริษัท sms-gateway คุณอาจทำงานผ่านโปรโตคอล SMPP (3.4 ยังคงเป็นวิธีที่พบบ่อยที่สุด) จากนั้นดู OpenSMPP และ jSMPP นี่คือ libs ที่มีประสิทธิภาพในการทำงานกับ SMPP

หากคุณกำลังจะทำงานกับฮาร์ดแวร์ของคุณเอง (fe a gsm-modem) วิธีที่ง่ายที่สุดในการส่งข้อความคือผ่านคำสั่ง AT ซึ่งจะแตกต่างกันไปขึ้นอยู่กับรุ่นดังนั้นคุณควรค้นหาคำสั่ง AT ที่โมเด็มของคุณรองรับ . ถัดไปหากโมเด็มของคุณมี IP และเปิดสำหรับการเชื่อมต่อคุณสามารถส่งคำสั่งผ่านซ็อกเก็ต 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();

มิฉะนั้นคุณจะทำงานผ่านพอร์ต COM แต่วิธีการที่จะเหมือนกัน (ส่งคำสั่ง AT) คุณสามารถค้นหาข้อมูลเพิ่มเติมเกี่ยวกับวิธีการทำงานกับพอร์ตอนุกรมที่นี่



1

คุณสามารถใช้Twilioสำหรับสิ่งนี้ แต่ถ้าคุณกำลังมองหาวิธีแก้ปัญหาที่ยุ่งยากคุณสามารถทำตามวิธีแก้ปัญหาที่ฉันได้กล่าวไว้ด้านล่าง

ไม่สามารถรับ sms ได้ แต่นี่เป็นวิธีที่ยุ่งยากที่คุณสามารถใช้เพื่อส่ง sms ไปยังลูกค้าจำนวนหนึ่ง คุณสามารถใช้ twitter API เราสามารถติดตามบัญชี twitter จากโทรศัพท์มือถือด้วย sms เราก็ต้องส่ง sms ไปที่ twitter ลองนึกภาพว่าเราสร้างบัญชี twitter ด้วยชื่อผู้ใช้ของ@username. จากนั้นให้เราส่ง sms ไปที่ 40404 ดังภาพด้านล่าง

follow @username

จากนั้นเราจะเริ่มรับทวีตที่ทวีตในบัญชีนั้น

ดังนั้นหลังจากที่เราสร้างบัญชี Twitter แล้วเราสามารถใช้ Twitter API เพื่อโพสต์ทวีตจากบัญชีนั้นได้ จากนั้นลูกค้าทุกคนที่ติดตามบัญชีนั้นตามที่ฉันพูดถึงก่อนที่จะเริ่มรับทวีต

คุณสามารถเรียนรู้วิธีการโพสต์ทวีตด้วย twitter API ได้จากลิงค์ต่อไปนี้

Twitter API

ก่อนที่คุณจะเริ่มพัฒนาคุณต้องได้รับอนุญาตให้ใช้ twitter api คุณสามารถเข้าถึง twitter api ได้จากลิงค์ต่อไปนี้

Twitter Developer Console

นี่ไม่ใช่ทางออกที่ดีที่สุดสำหรับปัญหาของคุณ แต่หวังว่านี่จะช่วยได้


0

เราชอบ Java ในWavecellเช่นกัน แต่คำถามนี้สามารถตอบได้โดยไม่มีรายละเอียดเฉพาะภาษาเนื่องจากเรามีREST APIซึ่งจะครอบคลุมความต้องการส่วนใหญ่ของคุณ:

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

ดูคำถามนี้หากคุณมีปัญหาในการส่งคำขอ HTTP ใน Java:

สำหรับกรณีเฉพาะคุณสามารถพิจารณาใช้SMPP APIและไลบรารีJSMPP ที่กล่าวถึงแล้วจะช่วยได้


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.