Как отправить смс на Java

133

Каковы возможные способы отправки и получения смс из приложения Java?

Как?

Джигар Джоши
источник

Ответы:

19

(Отказ от ответственности: я работаю в Twilio)

Twilio предлагает Java SDK для отправки SMS через Twilio REST API.

Джон Шихан - Runscope
источник
что, если я хочу получить его на свой сервер?
Джигар Джоши,
Вы должны зарегистрировать учетную запись Twilio, а затем назначить URL-адрес, который будет использоваться при получении входящего сообщения: twilio.com/sms
John Sheehan
1
Спасибо за Twilio. :)
Чираг Савсани
15

если вам нужны простые уведомления, многие операторы связи поддерживают SMS по электронной почте; смотреть SMS через E-Mail

Стивен А. Лоу
источник
10

Лучший SMS API, который я видел в Java, - это JSMPP. Он мощный, простой в использовании, и я сам использовал его для приложения корпоративного уровня (отправка более 20 000 SMS-сообщений в день).

Этот API создан для уменьшения многословности существующего SMPP API. Он очень прост и удобен в использовании, поскольку скрывает сложность низкоуровневой связи по протоколу, такой как автоматический запрос ссылки на запрос-ответ.

Я пробовал некоторые другие API, такие как Ozeki, но большинство из них либо являются коммерческими, либо имеют ограничение в пропускной способности (например, не могут отправлять более 3 SMS-сообщений в секунду).

оборота англ. Fouad
источник
10

Есть API под названием SMSLib, это действительно здорово. http://smslib.org/

Теперь у вас есть много поставщиков Saas, которые могут предоставить вам эту услугу, используя свои API.

Пример: mailchimp, esendex, Twilio, ...

Маруан Газанайи
источник
9

Вы можете сделать это с помощью модема GSM и API связи Java [испытано и протестировано]

  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");
           }
         }
    
    
            }
codefreaK
источник
7

Вы можете использовать Nexmo как для отправки SMS, так и для получения SMS .

Отправка SMS с помощью библиотеки Java Nexmo довольно проста. После создания новой учетной записи , аренды виртуального номера и получения ключа и секрета 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

ChrisG
источник
2

TextMarks дает вам доступ к общему шорткоду для отправки и получения текстовых сообщений из вашего приложения через их API. Сообщения приходят с / на 41411 (вместо, например, случайного номера телефона и, в отличие от шлюзов электронной почты, у вас есть полные 160 символов для работы).

Вы также можете попросить людей ввести текст в ваших ключевых словах на номер 41411, чтобы задействовать различные функции в вашем приложении. Существует клиент JAVA API вместе с несколькими другими популярными языками и очень исчерпывающей документацией и технической поддержкой.

14-дневную бесплатную пробную версию можно легко продлить для разработчиков, которые все еще тестируют ее и создают свои приложения.

Проверьте это здесь: Информация об API TextMarks

dkamins
источник
2

Вы можете использовать LOGICA SMPP Java API для отправки и получения SMS в приложении Java. LOGICA SMPP - это хорошо зарекомендовавший себя API в телекоммуникационных приложениях. Logica API также предоставляет вам возможности сигнализации для TCP / IP-соединения.

Вы можете напрямую интегрироваться с различными операторами связи по всему миру.

Альпеш Гедия
источник
2

Есть два способа: Первый: использовать SMS API Gateway, за который вам нужно заплатить; возможно, вы найдете пробные версии, даже бесплатные, но их мало. Во-вторых: использовать AT-команду с модемом GSM, подключенным к вашему ноутбуку. вот и все

Чулли Ильясс
источник
2

Это зависит от того, как вы собираетесь работать и кто ваш поставщик.

Если вы работаете с компанией, занимающейся 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-команд), вы можете найти больше информации о том, как работать с последовательными портами здесь .

DenisD
источник
2

OMK.smpp. API. он основан на SMPP, и симулятор также доступен бесплатно

LOGICA SMPP API.

И еще один вариант - Kannel - бесплатный шлюз WAP и SMS.

Рави Парех
источник
Настройка kannel заставит вас вспотеть, если вам удастся настроить его с помощью модема, пожалуйста, поделитесь процедурой.
Dun0523 06
2

Я предлагаю облачное решение, такое как 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());
  }
}
rickyrobinett
источник
1
Платный, но это меньше цента за текстовое сообщение.
Картик Санкар
1

smslib очень полезен для этой цели. Вы можете подключить модем к вашему компьютеру и использовать эту библиотеку для отправки sms. Это работает я использовал это

Абдулла Аль Номан
источник
1

Мы также любим 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 поможет в этом.

astef
источник
0

Вы можете использовать для этого Twilio . Но если вы ищете какой-то хитрый обходной путь, вы можете следовать обходному пути, который я упомянул ниже.

Это невозможно для получения смс. Но это хитрый метод, который вы можете использовать для отправки sms определенному количеству клиентов. Вы можете использовать twitter API. Мы можем следить за аккаунтом Twitter с мобильного телефона с помощью sms. Нам просто нужно отправить смс в твиттер. Представьте, что мы создаем учетную запись twitter с именем пользователя @username. Затем мы можем отправить sms на номер 40404, как показано ниже.

follow @username

Затем мы начинаем получать твиты, которые публикуются в этой учетной записи.

Итак, после того, как мы создадим учетную запись Twitter, мы сможем использовать Twitter API для публикации твитов из этой учетной записи. Затем все клиенты, которые подписались на эту учетную запись, как я уже упоминал, начинают получать твиты.

Вы можете узнать, как публиковать твиты с помощью twitter API, по следующей ссылке.

API Twitter

Перед тем, как начать разработку, вы должны получить разрешение на использование twitter api. Вы можете получить доступ к twitter api по следующей ссылке.

Консоль разработчика Twitter

Это не лучшее решение вашей проблемы, но надеюсь, что это поможет.

hackerbuddy
источник
-3

Вы можете использовать команды AT&T для отправки смс с помощью GSM-модема.

Musaddique
источник