Cách gửi SMS bằng Java


133

Các cách có thể để gửi và nhận sms từ ứng dụng Java là gì?

Làm sao?

Câu trả lời:




10

API SMS tốt nhất tôi từng thấy trong Java là JSMPP. Nó rất mạnh mẽ, dễ sử dụng và tôi đã sử dụng nó cho một ứng dụng cấp doanh nghiệp (gửi hơn 20 nghìn tin nhắn SMS mỗi ngày).

API này được tạo để giảm mức độ chi tiết của API SMPP hiện có. Nó rất đơn giản và dễ sử dụng vì nó che giấu sự phức tạp của giao tiếp giao thức cấp thấp như tự động yêu cầu phản hồi yêu cầu liên kết.

Tôi đã thử một số API khác như Ozeki, nhưng hầu hết trong số chúng là thương mại hoặc có giới hạn về thông lượng của nó (ví dụ: không thể gửi nhiều hơn 3 tin nhắn SMS trong một giây).


10

Có một API tên là SMSLib, nó thực sự tuyệt vời. http://smslib.org/

Bây giờ bạn có rất nhiều nhà cung cấp Saas có thể cung cấp cho bạn dịch vụ này bằng API của họ

Ví dụ: mailchimp, esendex, Twilio, ...


9

Bạn có thể làm điều này với Modem GSM và Api Truyền thông Java [Đã thử và đã kiểm tra]

  1. Trước tiên, bạn cần thiết lập Java Comm Api

    Bài viết này mô tả chi tiết Cách thiết lập Api giao tiếp

  2. Tiếp theo Bạn cần Modem GSM (tốt nhất là Mô-đun sim900)

  3. Java JDK phiên bản mới nhất thích hợp hơn

  4. Hướng dẫn chỉ huy AT

    mẫu gói;

        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

Bạn có thể sử dụng Nexmo để gửi SMS cũng như nhận SMS .

Gửi SMS với Thư viện Java Nexmo khá đơn giản. Sau khi tạo tài khoản mới , thuê một số ảo và nhận khóa & bí mật API của bạn, bạn có thể sử dụng thư viện để gửi SMS như vậy:

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

Để nhận SMS, bạn cần thiết lập một máy chủ tiêu thụ webhook. Điều đó cũng khá đơn giản. Tôi khuyên bạn nên xem hướng dẫn của chúng tôi về việc nhận SMS bằng Java .

Tiết lộ: Tôi làm việc cho Nexmo


2

TextMarks cung cấp cho bạn quyền truy cập vào mã ngắn được chia sẻ để gửi và nhận tin nhắn văn bản từ ứng dụng của bạn thông qua API của họ. Tin nhắn đến từ / đến 41411 (thay vì ví dụ như số điện thoại ngẫu nhiên # và không giống như cổng e-mail bạn có 160 ký tự đầy đủ để làm việc).

Bạn cũng có thể yêu cầu mọi người nhắn tin trong (các) từ khóa của bạn đến 41411 để gọi các chức năng khác nhau trong ứng dụng của bạn. Có một ứng dụng khách JAVA API cùng với một số ngôn ngữ phổ biến khác và hỗ trợ kỹ thuật và tài liệu rất toàn diện.

Bản dùng thử miễn phí 14 ngày có thể dễ dàng được mở rộng cho các nhà phát triển vẫn đang thử nghiệm và xây dựng ứng dụng của họ.

Kiểm tra nó ở đây: Thông tin API TextMarks


2

Bạn có thể ĐĂNG NHẬP API Java SMPP để gửi và nhận SMS trong ứng dụng Java. LOGICA SMPP là api đã được chứng minh tốt trong ứng dụng viễn thông. Logica API cũng cung cấp cho bạn khả năng báo hiệu trên kết nối TCP / IP.

Bạn có thể tích hợp trực tiếp với các nhà khai thác viễn thông khác nhau trên toàn thế giới.


2

Có hai cách: Thứ nhất: Sử dụng Cổng API SMS mà bạn cần trả tiền cho nó, có thể bạn tìm thấy một số bản dùng thử thậm chí là miễn phí nhưng nó khan hiếm. Thứ hai: Để sử dụng lệnh AT với modem GSM được kết nối với máy tính xách tay của bạn. đó là tất cả


2

Nó phụ thuộc vào cách bạn sẽ làm việc và nhà cung cấp của bạn là ai.

Nếu bạn làm việc với một công ty sms-gateway, bạn có thể sẽ làm việc thông qua giao thức SMPP (3,4 vẫn là phổ biến nhất), sau đó hãy xem OpenSMPP và jSMPP. Đây là những lib mạnh mẽ để làm việc với SMPP.

Nếu bạn sẽ làm việc với phần cứng của riêng mình (modem modem), cách dễ nhất để gửi tin nhắn là thông qua các lệnh AT, chúng khác nhau tùy thuộc vào kiểu máy, vì vậy, bạn nên tìm hiểu các lệnh AT nào được modem hỗ trợ . Tiếp theo, nếu modem của bạn có IP và mở để kết nối, bạn có thể gửi lệnh qua ổ cắm 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();

Nếu không, bạn sẽ làm việc thông qua cổng COM, nhưng phương thức là như nhau (gửi lệnh AT), bạn có thể tìm thêm thông tin về cách làm việc với các cổng nối tiếp tại đây .


2

OMK.smpp. API. nó dựa trên SMPP và trình giả lập cũng có sẵn miễn phí

ĐĂNG NHẬP API SMPP.

Và một tùy chọn khác là Kannel một cổng SMS và SMS miễn phí.


Cấu hình kannel khiến bạn rơi mồ hôi nếu bạn quản lý để định cấu hình nó với modem, vui lòng chia sẻ quy trình.
Dun0523

2

Tôi đề xuất một giải pháp dựa trên đám mây như Twilio. Các giải pháp dựa trên đám mây có hiệu quả về chi phí, hơn là một giải pháp nội bộ vì không cần bảo trì liên tục. SMS qua email không phải là một giải pháp tao nhã, vì bạn phải lấy thông tin nhà cung cấp từ người dùng và bạn không bao giờ có thể chắc chắn rằng mình có thể nhắn tin cho tất cả các số điện thoại di động. Tôi đang sử dụng twilio java api trong ứng dụng web của mình, để gửi sms từ máy chủ. trong vòng vài phút, bạn có thể tích hợp với ứng dụng của bạn.

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

Dưới đây là một ví dụ gửi tin nhắn SMS từ các tài liệu:

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
Được trả tiền nhưng ít hơn một xu cho mỗi tin nhắn văn bản.
Karthik Sankar

1

smslib rất hữu ích cho mục đích này u bạn có thể kết nối modem với máy tính của bạn và sử dụng lib này để gửi sms. Nó hoạt động tôi đã sử dụng nó


1

Chúng tôi cũng thích Java trong Wavecell , nhưng câu hỏi này có thể được trả lời mà không có chi tiết cụ thể về ngôn ngữ vì chúng tôi có API REST sẽ đáp ứng hầu hết các nhu cầu của bạn:

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

Xem xét câu hỏi này nếu bạn gặp vấn đề với việc gửi yêu cầu HTTP trong Java:

Đối với các trường hợp cụ thể, bạn cũng có thể xem xét sử dụng API SMPP và thư viện JSMPP đã đề cập sẽ giúp ích cho điều đó.


0

Bạn có thể sử dụng Twilio cho việc này. Nhưng nếu bạn đang tìm kiếm một cách giải quyết khó khăn, bạn có thể làm theo cách giải quyết mà tôi đã đề cập dưới đây.

Điều này là không thể để nhận sms. Nhưng đây là một phương pháp phức tạp mà bạn có thể sử dụng để gửi sms đến số lượng khách hàng. Bạn có thể sử dụng API twitter. Chúng tôi có thể theo dõi tài khoản twitter từ điện thoại di động của chúng tôi bằng một tin nhắn. Chúng tôi chỉ cần gửi sms đến twitter. Hãy tưởng tượng chúng ta tạo một tài khoản twitter với tên người dùng @username. Sau đó, chúng tôi có thể gửi sms đến 40404 như hình dưới đây.

follow @username

Sau đó, chúng tôi bắt đầu nhận được các tweet được tweet trong tài khoản đó.

Vì vậy, sau khi chúng tôi tạo một tài khoản twitter thì chúng tôi có thể sử dụng API Twitter để đăng tweet từ tài khoản đó. Sau đó, tất cả các khách hàng đã theo dõi tài khoản đó như tôi đã đề cập trước khi bắt đầu nhận tweet.

Bạn có thể tìm hiểu cách đăng tweet bằng API twitter từ liên kết sau.

API Twitter

Trước khi bạn bắt đầu phát triển, bạn phải được phép sử dụng twitter api. Bạn có thể truy cập twitter api từ liên kết sau.

Bảng điều khiển dành cho nhà phát triển Twitter

Đây không phải là giải pháp tốt nhất cho vấn đề của bạn. Nhưng hy vọng sự giúp đỡ này.


-3

Bạn có thể sử dụng các lệnh AT & T để gửi sms bằng modem GSM.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.