วิธีที่เป็นไปได้ในการส่งและรับ sms จากแอปพลิเคชัน Java คืออะไร?
อย่างไร?
วิธีที่เป็นไปได้ในการส่งและรับ sms จากแอปพลิเคชัน Java คืออะไร?
อย่างไร?
คำตอบ:
(ข้อจำกัดความรับผิดชอบ: ฉันทำงานที่ Twilio)
Twilio เสนอ Java SDKสำหรับส่ง SMS ผ่าน Twilio REST API
หากสิ่งที่คุณต้องการคือการแจ้งเตือนธรรมดาผู้ให้บริการหลายรายรองรับ SMS ทางอีเมล ดูSMS ผ่าน E-Mail
มี API ที่เรียกว่า SMSLib มันยอดเยี่ยมมาก http://smslib.org/
ตอนนี้คุณมีผู้ให้บริการ Saas จำนวนมากที่สามารถให้บริการนี้แก่คุณโดยใช้ API ของพวกเขา
เช่น mailchimp, esendex, Twilio, ...
SMS API ที่ดีที่สุดที่ฉันเคยเห็นใน Java คือ JSMPP มันมีประสิทธิภาพใช้งานง่ายและฉันใช้มันเองสำหรับแอปพลิเคชันระดับองค์กร (ส่งข้อความ SMS มากกว่า 20K ทุกวัน)
API นี้สร้างขึ้นเพื่อลดความฟุ่มเฟือยของ SMPP API ที่มีอยู่ มันง่ายมากและใช้งานง่ายเพราะมันซ่อนความซับซ้อนของการสื่อสารโปรโตคอลระดับต่ำเช่นสอบถามการตอบสนองคำขอลิงค์โดยอัตโนมัติ
ฉันได้ลองใช้ API อื่น ๆ แล้วเช่น Ozeki แต่ส่วนใหญ่เป็นแบบเชิงพาณิชย์หรือมีข้อ จำกัด ในปริมาณงาน (เช่นไม่สามารถส่งข้อความ SMS ได้มากกว่า 3 ข้อความในหนึ่งวินาที)
ก่อนอื่นคุณต้องตั้งค่า 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 การส่ง 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
TextMarks ช่วยให้คุณเข้าถึงรหัสย่อที่ใช้ร่วมกันเพื่อส่งและรับข้อความจากแอปของคุณผ่าน API ข้อความมาจาก / ถึง 41411 (แทนที่จะเป็นโทรศัพท์แบบสุ่ม # และไม่เหมือนกับเกตเวย์อีเมลที่คุณมีตัวอักษรทั้งหมด 160 ตัวที่จะใช้งานได้)
คุณยังสามารถบอกให้ผู้อื่นส่งข้อความในคีย์เวิร์ดของคุณไปที่ 41411 เพื่อเรียกใช้ฟังก์ชันต่างๆในแอปของคุณ มีไคลเอนต์ JAVA API พร้อมกับภาษายอดนิยมอื่น ๆ และเอกสารประกอบและการสนับสนุนทางเทคนิคที่ครอบคลุมมาก
การทดลองใช้ฟรี 14 วันสามารถขยายได้อย่างง่ายดายสำหรับนักพัฒนาที่ยังคงทดสอบและสร้างแอปของตน
ตรวจสอบได้ที่นี่: ข้อมูล TextMarks API
มีสองวิธี: ประการแรก: ใช้ SMS API Gateway ซึ่งคุณต้องจ่ายเงินบางทีคุณอาจพบว่ามีการทดลองใช้ฟรี แต่ก็หายาก ประการที่สอง: ในการใช้คำสั่ง AT กับโมเด็ม GSM ที่เชื่อมต่อกับแล็ปท็อปของคุณ นั่นคือทั้งหมด
ฉันขอแนะนำโซลูชันบนคลาวด์เช่น 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());
}
}
คุณสามารถ LOGICA SMPP Java API สำหรับการส่งและรับ SMS ในแอปพลิเคชัน Java LOGICA SMPP เป็น API ที่ได้รับการพิสูจน์แล้วในแอปพลิเคชันโทรคมนาคม Logica API ยังให้ความสามารถในการส่งสัญญาณบนการเชื่อมต่อ TCP / IP
คุณสามารถผสานรวมโดยตรงกับผู้ให้บริการโทรคมนาคมต่างๆทั่วโลก
ขึ้นอยู่กับว่าคุณจะทำงานอย่างไรและผู้ให้บริการของคุณคือใคร
หากคุณทำงานกับ บริษัท 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) คุณสามารถค้นหาข้อมูลเพิ่มเติมเกี่ยวกับวิธีการทำงานกับพอร์ตอนุกรมที่นี่
smslibมีประโยชน์มากสำหรับจุดประสงค์นี้คุณสามารถเชื่อมต่อโมเด็มกับพีซีของคุณและใช้ lib นี้เพื่อส่ง sms ได้ผลฉันได้ใช้มัน
คุณสามารถใช้Twilioสำหรับสิ่งนี้ แต่ถ้าคุณกำลังมองหาวิธีแก้ปัญหาที่ยุ่งยากคุณสามารถทำตามวิธีแก้ปัญหาที่ฉันได้กล่าวไว้ด้านล่าง
ไม่สามารถรับ sms ได้ แต่นี่เป็นวิธีที่ยุ่งยากที่คุณสามารถใช้เพื่อส่ง sms ไปยังลูกค้าจำนวนหนึ่ง คุณสามารถใช้ twitter API เราสามารถติดตามบัญชี twitter จากโทรศัพท์มือถือด้วย sms เราก็ต้องส่ง sms ไปที่ twitter ลองนึกภาพว่าเราสร้างบัญชี twitter ด้วยชื่อผู้ใช้ของ@username
. จากนั้นให้เราส่ง sms ไปที่ 40404 ดังภาพด้านล่าง
follow @username
จากนั้นเราจะเริ่มรับทวีตที่ทวีตในบัญชีนั้น
ดังนั้นหลังจากที่เราสร้างบัญชี Twitter แล้วเราสามารถใช้ Twitter API เพื่อโพสต์ทวีตจากบัญชีนั้นได้ จากนั้นลูกค้าทุกคนที่ติดตามบัญชีนั้นตามที่ฉันพูดถึงก่อนที่จะเริ่มรับทวีต
คุณสามารถเรียนรู้วิธีการโพสต์ทวีตด้วย twitter API ได้จากลิงค์ต่อไปนี้
ก่อนที่คุณจะเริ่มพัฒนาคุณต้องได้รับอนุญาตให้ใช้ twitter api คุณสามารถเข้าถึง twitter api ได้จากลิงค์ต่อไปนี้
นี่ไม่ใช่ทางออกที่ดีที่สุดสำหรับปัญหาของคุณ แต่หวังว่านี่จะช่วยได้
เราชอบ 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 ที่กล่าวถึงแล้วจะช่วยได้
คุณสามารถใช้คำสั่ง AT & T ในการส่ง sms โดยใช้โมเด็ม GSM