Які можливі способи надсилання та отримання sms з програми Java?
Як?
Які можливі способи надсилання та отримання sms з програми Java?
Як?
Відповіді:
(Відмова: я працюю в Twilio)
Twilio пропонує Java SDK для надсилання SMS через API Twilio REST.
якщо ви хочете лише прості сповіщення, багато операторів підтримують SMS електронною поштою; перегляньте SMS через електронну пошту
Найкращий SMS API, який я бачив у Java, - JSMPP. Це потужний, простий у використанні, і я сам його використовував для додатків на рівні підприємства (щодня надсилаючи понад 20 тис. SMS-повідомлень).
Цей API створений для зменшення багатослівності існуючого API SMPP. Це дуже простий і простий у використанні, оскільки приховує складність протокольного зв'язку низького рівня, наприклад автоматичного запиту на запит-відповідь посилання.
Я спробував деякі інші API, такі як Ozeki, але більшість з них або комерційні, або мають обмеження в пропускній здатності (наприклад, не можуть надсилати більше 3 SMS-повідомлень за секунду, наприклад).
Є API під назвою SMSLib, він справді приголомшливий. http://smslib.org/
Зараз у вас є багато постачальників Saas, які можуть надати вам цю послугу за допомогою своїх API
Наприклад: mailchimp, esendex, Twilio, ...
Спочатку вам потрібно встановити Java Comm Api
Ця стаття докладно описує, як налаштувати комунікаційний 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 досить просто. Після створення нового облікового запису , оренди віртуального номера та отримання ключа та секрету 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 вам потрібно налаштувати сервер, який споживає веб-камери. Це теж просто. Рекомендую переглянути наш підручник щодо отримання SMS-повідомлень з Java .
Розкриття інформації: Я працюю в Nexmo
TextMarks надає вам доступ до спільного короткого коду для надсилання та отримання текстових повідомлень із вашого додатку через їх API. Повідомлення надходять від / до 41411 (замість, наприклад, випадкового номера телефону # та на відміну від шлюзів електронної пошти, ви маєте повну 160 символів для роботи).
Ви також можете сказати людям, щоб вони надсилали текст ваших ключових слів до 41411, щоб викликати різні функції у вашій програмі. Є клієнт API JAVA разом з кількома іншими популярними мовами та дуже вичерпною документацією та технічною підтримкою.
14-денну безкоштовну пробну версію можна легко продовжити розробникам, які все ще тестують її та створюють свої додатки.
Перевірте це тут: Інформація про API TextMarks
Ви можете LOGICA SMPP Java API для надсилання та отримання SMS в додатку Java. LOGICA SMPP добре зарекомендувала себе в застосуванні телекомунікацій. API Logica також надає вам можливість сигналізації на TCP / IP-з'єднанні.
Ви можете безпосередньо інтегруватися з різними операторами зв'язку по всьому світу.
Є два способи: По-перше, використовуйте шлюз API API, який потрібно заплатити за нього, можливо, ви знайдете пробну версію навіть безкоштовних, але це мало. Друге: Використовувати команду AT з модемом GSM, підключеним до ноутбука. це все
Це залежить від того, як ви збираєтеся працювати і хто ваш провайдер.
Якщо ви працюєте з компанією sms-шлюзу, ви, ймовірно, працюєте за протоколом SMPP (3.4 все ще є найпоширенішим), то подивіться на OpenSMPP та jSMPP. Це потужні ліфти для роботи з SMPP.
Якщо ви збираєтеся працювати зі своїм власним обладнанням (fe gsm-модем), найпростіший спосіб надсилання повідомлень - це команди AT, вони відрізняються залежно від моделі, тому вам слід дізнатися, які команди AT підтримує ваш модем . Далі, якщо ваш модем має IP-адресу та відкритий для з'єднання, ви можете надсилати команди через java socket
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-повідомлення через електронну пошту не є елегантним рішенням, оскільки ви повинні отримати інформацію про оператора від користувача, і ви ніколи не можете бути впевнені, що можете надіслати всі мобільні номери. Я використовую twilio java api у своєму веб-додатку, щоб надсилати смс із сервера. за кілька хвилин ви можете інтегруватися зі своїм додатком.
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());
}
}
smslib дуже корисний для цієї мети. Ви можете підключити модем до ПК та використовувати цю ліб для надсилання sms. Працює, я його використав
Ми також любимо Java у Wavecell , але на це питання можна відповісти без конкретних мов, оскільки у нас є API REST, який покриє більшість ваших потреб:
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:
Для конкретних випадків ви також можете скористатися API SMPP і вже згадана бібліотека JSMPP допоможе в цьому.
Ви можете використовувати Twilio для цього. Але якщо ви шукаєте якийсь хитрий спосіб вирішення, ви можете дотримуватися рішення, про яке я вже згадував нижче.
Це не можливо для отримання sms. Але це складний метод, який ви можете використовувати для надсилання sms на кількість клієнтів. Ви можете використовувати API twitter. Ми можемо відслідковувати твіттер з нашого мобільного телефону за допомогою sms. Нам залишається лише надсилати смс на щебет. Уявіть, що ми створюємо акаунт щебетання з ім'ям користувача @username
. Тоді ми можемо надіслати sms на 40404, як показано нижче.
follow @username
Потім ми починаємо отримувати твіти, які твітують у цьому акаунті.
Тож після того, як ми створимо акаунт щебетання, ми можемо використовувати API Twitter, щоб публікувати твіти з цього акаунта. Тоді всі клієнти, які стежать за цим рахунком, як я вже згадував, почали отримувати твіти.
Ви можете дізнатися, як розміщувати твіти за допомогою API twitter за наступним посиланням.
Перш ніж почати розробку, ви повинні отримати дозвіл на використання Twitter api. Ви можете отримати доступ до Twitter api за наступним посиланням.
Це не найкраще рішення вашої проблеми. Але сподіваюся, що це допоможе.