如何用Java发送短信


133

从Java应用程序发送和接收短信的可能方法是什么?

怎么样?

Answers:




10

我在Java中看到的最好的SMS API是JSMPP。它功能强大,易于使用,我自己将其用于企业级应用程序(每天发送超过20K条SMS消息)。

创建此API的目的是减少现有SMPP API的冗长性。它非常简单易用,因为它掩盖了低级协议通信的复杂性,例如自动查询链接请求-响应。

我尝试了其他一些API,例如Ozeki,但其中大多数都是商业性的或吞吐量受限制的(例如,每秒发送的SMS消息不能超过3条)。


10

有一个名为SMSLib的API,它真的很棒。 http://smslib.org/

现在您有很多Saas提供程序,可以使用他们的API为您提供此服务

例如:mailchimp,esendex,Twilio,...


9

您可以使用GSM调制解调器和Java Communications Api进行此操作(经过测试)

  1. 首先,您需要设置Java Comm Api

    本文详细介绍如何设置通讯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");
           }
         }
    
    
            }

7

您可以使用Nexmo 发送接收SMS

使用Nexmo Java库发送SMS 非常简单。之后创建一个新账户,租用一个虚拟的号码,让你的API密钥和秘密,你可以使用库发送短信像这样:

  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的服务器。那也很简单。我建议您查阅有关使用Java接收SMS的教程。

披露:我为Nexmo工作


2

TextMarks使您可以访问其共享的简码,以通过其API从您的应用发送和接收短信。消息来自/发送至41411(而不是例如随机的电话号码,并且与电子邮件网关不同,您可以使用全部160个字符)。

您还可以告诉人们在您的关键字中输入文本到41411,以调用应用程序中的各种功能。有一个JAVA API客户端以及其他几种流行语言以及非常全面的文档和技术支持。

对于仍在进行测试并构建其应用程序的开发人员,可以轻松延长14天免费试用期。

在此处查看: TextMarks API信息


2

您可以使用LOGICA SMPP Java API在Java应用程序中发送和接收SMS。LOGICA SMPP是电信应用中久经考验的api。Logica API还为您提供TCP / IP连接的信令能力。

您可以直接与世界各地的各种电信运营商集成。


2

有两种方法:第一:使用需要付费的SMS API网关,也许您会找到一些试用版,甚至是免费试用版,但是这种软件很稀缺。第二:在连接到笔记本电脑的GSM调制解调器上使用AT命令。就这样


2

这取决于您的工作方式以及您的提供者是谁。

如果您与sms-gateway公司合作,则可能会使用SMPP协议(3.4仍然是最常见的协议),然后看看OpenSMPP和jSMPP。这些是与SMPP一起使用的强大库。

如果要使用自己的硬件(例如gsm调制解调器),最简单的发送消息的方法是通过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命令),您可以在此处找到有关如何使用串行端口的更多信息。


2

OMK.smpp。API。它基于SMPP,还可以免费使用模拟器

LOGICA SMPP API。

另一种选择是Kannel免费的WAP和SMS网关。


如果您设法使用调制解调器配置它,请配置程序,请共享操作步骤。
Dun0523 '16

2

我建议像Twilio这样基于云的解决方案。与内部解决方案相比,基于云的解决方案比内部解决方案更具成本效益,因为无需进行持续的维护。通过电子邮件发送SMS并不是一个很好的解决方案,因为您必须从用户那里获得运营商的信息,而且您永远无法确保可以给所有手机号码发短信。我在Web应用程序中使用twilio java api从服务器端发送短信。在几分钟之内,您就可以与您的应用程序集成。

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

这是一个从文档发送短信的示例:

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

我们也喜欢Wavecell中的 Java ,但是由于我们有一个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!" }'

如果您在使用Java发送HTTP请求时遇到问题,请查看以下问题:

对于特定情况,您还可以考虑使用SMPP API,已经提到的JSMPP库将对此提供帮助。


0

您可以使用Twilio为此。但是,如果您正在寻找一些棘手的解决方法,则可以按照下面提到的解决方法进行操作。

这对于接收短信是不可能的。但这是一种棘手的方法,可用于将短信发送给多个客户端。您可以使用twitter API。我们可以在手机上通过短信追踪Twitter帐户。我们只需要发送短信到Twitter。想象一下,我们创建一个用户名为的Twitter帐户@username。然后,我们可以将短信发送到40404,如下所示。

follow @username

然后我们开始获取在该帐户中发布过的推文。

因此,在创建Twitter帐户之后,我们可以使用Twitter API从该帐户发布推文。然后,所有遵循我之前提到的帐户的客户开始接收推文。

您可以从以下链接中学习如何使用Twitter API发布推文。

Twitter API

在开始开发之前,您必须获得使用twitter api的许可。您可以通过以下链接访问twitter api。

Twitter开发人员控制台

这不是解决您问题的最佳方法。但希望能有所帮助。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.