如何用 Java 发送短信

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

怎么做到的?

303538 次浏览

如果你想要的只是简单的通知,许多运营商支持短信通过电子邮件; 见 通过电子邮件发送短信

(免责声明: 我在 Twilio 工作)

Twilio 提供了一个 Java SDK ,用于通过 Twilio REST API 发送 SMS。

有一个叫做 SMSLib 的 API,它真的很棒。 Http://smslib.org/

现在有许多 Saas 提供商可以使用它们的 API 为您提供此服务

例句: 邮猩猩,埃森德克斯,特威利奥,..。

它是基于 SMPP 的 模拟器也是免费的

SMPP API.

另一个选择是 Kannel一个免费的 WAP 和短信网关。

TextMarks 允许你访问它的共享短代码,通过它们的 API 从你的应用程序发送和接收文本消息。消息来自/to 41411(而不是随机的电话 # 和不同于电子邮件网关,你有完整的160个字符来处理)。

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

14天的免费试用期可以很容易地延长到那些仍在测试和开发应用程序的开发人员。

看这里: TextMarks API 信息

您可以在 Java 应用程序中使用 LOGICAPJavaAPI 来发送和接收 SMS。 LOGICA SMPP 在电信应用程序中得到了很好的验证,LOGICA API 还为您提供了 TCP/IP 连接上的信令能力。

你可以直接和世界各地的电讯公司联系起来。

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

创建这个 API 是为了减少现有 SMPPAPI 的冗长性。 它非常简单易用,因为它隐藏了 自动查询等底层协议通信 链接请求-响应。

我已经尝试了一些其他的 API,比如 Ozeki,但是它们中的大多数要么是商业的,要么在吞吐量上有限制(例如,不能在一秒钟内发送超过3条 SMS 消息)。

有两种方式: 首先: 使用一个短信 API 网关,你需要为它付费,也许你会发现一些试用,甚至免费的,但它的稀缺性。 第二: 使用 AT 命令和连接到您的笔记本电脑的调制解调器 GSM。 仅此而已

这取决于你将如何工作以及你的供应商是谁。

如果你在一家 SMS 网关公司工作,你可能会使用 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 命令) ,您可以找到更多的信息如何使用串行端口 给你

我建议使用像 Twilio 这样的基于云的解决方案。基于云的解决方案比内部解决方案更具成本效益,因为不需要持续的维护。通过电子邮件发送短信并不是一个优雅的解决方案,因为你必须从用户那里获得运营商信息,而且你永远不能确定你可以发送所有的手机号码。 我在我的 web 应用程序中使用了 twiliojavaapi,用于从服务器端发送短信。几分钟内,你就可以整合你的应用程序。

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

你可以通过 GSM 调制解调器和 Java 通信 API 来实现

  1. 首先你需要设置 JavaCommApi

    本文详细介绍如何设置通信 API

  2. 接下来你需要一个 GSM 调制解调器(最好是 sim900模块)

  3. 最好是 Java JDK 的最新版本

  4. 指挥指南

    密码

    包装样品;

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

您可以使用 AT & T 命令使用 GSM 调制解调器发送短信。

我们也喜欢在 波电池中使用 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 请求时遇到问题,请考虑以下问题:

对于特定的情况,您还可以考虑使用 空气污染指数,并且已经提到的 JMPP库将对此有所帮助。

您可以使用 Nexmo 到 发短信以及 接收短讯

Nexmo Java 库发送短信是相当简单的。在 创建一个新账户之后,租用一个虚拟数字,并获得你的 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);
}
}
}

要接收短信,你需要建立一个服务器,使用一个 webhook。这也很简单。我建议你看看我们的 用 Java 接收短信教程。

披露: 我为 Nexmo 工作

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

这是不可能的接收短信。但是,这是一个棘手的方法,您可以使用发送短信的客户端数量。你可以使用 twitter API。我们可以通过手机短信关注 Twitter 账户。我们只需要发条短信到推特上。假设我们创建了一个用户名为 @username的 Twitter 帐户。然后我们可以发送短信到40404,如下所示。

follow @username

然后我们开始得到在该帐户中发布的 tweet。

所以在我们创建了一个 Twitter 帐户之后,我们可以使用 Twitter API 来发布来自该帐户的 tweet。然后所有关注这个账户的客户都开始收到 tweet。

您可以通过以下链接了解如何使用 twitter API 发布 tweet。

Twitter API

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

Twitter 开发者控制台

这不是解决你问题的最好办法,但希望这能有所帮助。

欧甘库。发送短信的代码很容易写(它自动处理字符编码和信息分割)。真正的短信可以使用 SMPP 协议(标准 SMS 协议)或通过提供者发送。 您甚至可以使用 SMPP 服务器在本地测试您的代码,以便在支付真正的 SMS 发送之前检查您的 SMS 结果。

package fr.sii.ogham.sample.standard.sms;


import java.util.Properties;


import fr.sii.ogham.core.builder.MessagingBuilder;
import fr.sii.ogham.core.exception.MessagingException;
import fr.sii.ogham.core.service.MessagingService;
import fr.sii.ogham.sms.message.Sms;


public class BasicSample {
public static void main(String[] args) throws MessagingException {
// [PREPARATION] Just do it once at startup of your application
        

// configure properties (could be stored in a properties file or defined
// in System properties)
Properties properties = new Properties();
properties.setProperty("ogham.sms.smpp.host", "<your server host>");                                 // <1>
properties.setProperty("ogham.sms.smpp.port", "<your server port>");                                 // <2>
properties.setProperty("ogham.sms.smpp.system-id", "<your server system ID>");                       // <3>
properties.setProperty("ogham.sms.smpp.password", "<your server password>");                         // <4>
properties.setProperty("ogham.sms.from.default-value", "<phone number to display for the sender>");  // <5>
// Instantiate the messaging service using default behavior and
// provided properties
MessagingService service = MessagingBuilder.standard()                                               // <6>
.environment()
.properties(properties)                                                                  // <7>
.and()
.build();                                                                                    // <8>
// [/PREPARATION]
        

// [SEND A SMS]
// send the sms using fluent API
service.send(new Sms()                                                                               // <9>
.message().string("sms content")
.to("+33752962193"));
// [/SEND A SMS]
}
}

还有许多其他的 特征样本/弹簧样本