从Java应用程序发送和接收短信的可能方法是什么?
怎么样?
从Java应用程序发送和接收短信的可能方法是什么?
怎么样?
Answers:
(免责声明:我在Twilio工作)
Twilio提供了一个Java SDK,用于通过Twilio REST API发送SMS。
我在Java中看到的最好的SMS API是JSMPP。它功能强大,易于使用,我自己将其用于企业级应用程序(每天发送超过20K条SMS消息)。
创建此API的目的是减少现有SMPP API的冗长性。它非常简单易用,因为它掩盖了低级协议通信的复杂性,例如自动查询链接请求-响应。
我尝试了其他一些API,例如Ozeki,但其中大多数都是商业性的或吞吐量受限制的(例如,每秒发送的SMS消息不能超过3条)。
有一个名为SMSLib的API,它真的很棒。 http://smslib.org/
现在您有很多Saas提供程序,可以使用他们的API为您提供此服务
例如:mailchimp,esendex,Twilio,...
首先,您需要设置Java Comm Api
接下来,您需要GSM调制解调器(最好是sim900模块)
Java JDK最新版本优先
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");
}
}
}
使用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工作
TextMarks使您可以访问其共享的简码,以通过其API从您的应用发送和接收短信。消息来自/发送至41411(而不是例如随机的电话号码,并且与电子邮件网关不同,您可以使用全部160个字符)。
您还可以告诉人们在您的关键字中输入文本到41411,以调用应用程序中的各种功能。有一个JAVA API客户端以及其他几种流行语言以及非常全面的文档和技术支持。
对于仍在进行测试并构建其应用程序的开发人员,可以轻松延长14天免费试用期。
在此处查看: TextMarks API信息
您可以使用LOGICA SMPP Java API在Java应用程序中发送和接收SMS。LOGICA SMPP是电信应用中久经考验的api。Logica API还为您提供TCP / IP连接的信令能力。
您可以直接与世界各地的各种电信运营商集成。
有两种方法:第一:使用需要付费的SMS API网关,也许您会找到一些试用版,甚至是免费试用版,但是这种软件很稀缺。第二:在连接到笔记本电脑的GSM调制解调器上使用AT命令。就这样
这取决于您的工作方式以及您的提供者是谁。
如果您与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命令),您可以在此处找到有关如何使用串行端口的更多信息。
我建议像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());
}
}
smslib为此非常有用,您可以将调制解调器与您的PC连接,并使用此lib发送短信。我已经用过了
我们也喜欢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请求时遇到问题,请查看以下问题:
您可以使用Twilio为此。但是,如果您正在寻找一些棘手的解决方法,则可以按照下面提到的解决方法进行操作。
这对于接收短信是不可能的。但这是一种棘手的方法,可用于将短信发送给多个客户端。您可以使用twitter API。我们可以在手机上通过短信追踪Twitter帐户。我们只需要发送短信到Twitter。想象一下,我们创建一个用户名为的Twitter帐户@username
。然后,我们可以将短信发送到40404,如下所示。
follow @username
然后我们开始获取在该帐户中发布过的推文。
因此,在创建Twitter帐户之后,我们可以使用Twitter API从该帐户发布推文。然后,所有遵循我之前提到的帐户的客户开始接收推文。
您可以从以下链接中学习如何使用Twitter API发布推文。
在开始开发之前,您必须获得使用twitter api的许可。您可以通过以下链接访问twitter api。
这不是解决您问题的最佳方法。但希望能有所帮助。
您可以使用AT&T命令通过GSM调制解调器发送短信。