Java로 SMS를 보내는 방법


133

Java 응용 프로그램에서 SMS를 보내고받을 수있는 방법은 무엇입니까?

어떻게?

답변:




10

Java에서 본 최고의 SMS API는 JSMPP입니다. 강력하고 사용하기 쉬우 며 엔터프라이즈 수준의 응용 프로그램에 매일 사용했습니다 (매일 20K 이상의 SMS 메시지 전송).

이 API는 기존 SMPP API의 세부 정보를 줄이기 위해 작성되었습니다. 링크 요청-응답 자동 조회와 같은 저수준 프로토콜 통신의 복잡성을 숨기므로 매우 간단하고 사용하기 쉽습니다.

Ozeki와 같은 다른 API를 사용해 보았지만 대부분 상용이거나 처리량이 제한적입니다 (예 : 1 초에 3 개 이상의 SMS 메시지를 보낼 수 없음).


10

SMSLib라는 API가 있는데 정말 훌륭합니다. http://smslib.org/

이제 API를 사용하여이 서비스를 제공 할 수있는 많은 Saas 제공자가 있습니다.

예 : mailchimp, esendex, Twilio, ...


9

GSM 모뎀과 Java Communications API를 사용하여이 작업을 수행 할 수 있습니다.

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

7

Nexmo를 사용하여 SMS보내고 SMS받을 수 있습니다.

Nexmo Java Library 로 SMS를 보내는 것은 매우 간단합니다. 후 새로운 계정을 만드는 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를 받으려면 웹 후크를 사용하는 서버를 설정해야합니다. 꽤 간단합니다. Java로 SMS 수신에 대한 자습서를 확인하는 것이 좋습니다 .

공개 : 저는 Nexmo에서 일합니다


2

TextMarks를 사용하면 공유 단축 코드에 액세스하여 API를 통해 앱에서 문자 메시지를주고받을 수 있습니다. 메시지는 임의의 전화 번호 대신 41411에서 시작합니다. 이메일 게이트웨이와 달리 전체 160 개의 문자를 사용할 수 있습니다.

앱에서 다양한 기능을 호출하기 위해 사람들에게 키워드 텍스트 41411 ~ 41411을 지시 할 수도 있습니다. JAVA API 클라이언트는 몇 가지 다른 인기있는 언어와 매우 포괄적 인 문서 및 기술 지원과 함께 있습니다.

14 일 무료 평가판은 아직 테스트하고 앱을 빌드하는 개발자를 위해 쉽게 확장 할 수 있습니다.

여기에서 확인하십시오 : TextMarks API 정보


2

Java 응용 프로그램에서 SMS를 보내고받는 LOGICA SMPP Java API를 사용할 수 있습니다. LOGICA SMPP는 통신 애플리케이션에서 잘 입증 된 API입니다. Logica API는 TCP / IP 연결에서 신호 용량을 제공합니다.

전세계의 다양한 통신 사업자와 직접 통합 할 수 있습니다.


2

두 가지 방법이 있습니다. 첫째 : 비용을 지불해야하는 SMS API 게이트웨이를 사용하십시오. 평가판은 무료로 제공되지만 부족한 경우도 있습니다. 둘째 : 랩탑에 연결된 모뎀 GSM과 함께 AT 명령을 사용합니다. 그게 다야


2

그것은 어떻게 일을하는지와 공급자가 누구인지에 달려 있습니다.

sms-gateway 회사와 함께 작업하는 경우 SMPP 프로토콜 (3.4가 여전히 가장 일반적 임)을 통해 작업 할 수 있으며 OpenSMPP 및 jSMPP를 살펴보십시오. 이들은 SMPP와 함께 작동하는 강력한 라이브러리입니다.

메시지를 보내는 가장 쉬운 방법은 AT 하드웨어를 사용하여 자신의 하드웨어로 작업하려는 경우 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 명령 전송) . 직렬 포트 작업 방법에 대한 자세한 내용은 여기를 참조하십시오 .


2

OMK.smpp. API. SMPP 기반이며 시뮬레이터도 무료로 제공됩니다

LOGICA SMPP API.

또 다른 옵션은 Kannel 무료 WAP 및 SMS 게이트웨이입니다.


kannel을 구성하면 모뎀으로 구성 할 때 땀을 흘리게되며 절차를 친절하게 공유하십시오.
Dun0523

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

1
유료이지만 문자 메시지 당 1 센트 미만입니다.
Karthik Sankar

1

smslib 는이 목적에 매우 유용합니다. u 모뎀과 PC를 연결하고이 lib를 사용하여 SMS를 보낼 수 있습니다. 내가 사용한 작품


1

우리는 또한 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 요청을 보내는 데 문제가있는 경우이 질문을보십시오.

특정 경우 SMPP API 사용을 고려할 수 있으며 이미 언급 한 JSMPP 라이브러리가 도움이 될 것입니다.


0

이를 위해 Twilio 를 사용할 수 있습니다 . 그러나 까다로운 해결 방법을 찾고 있다면 아래에서 언급 한 해결 방법을 따를 수 있습니다.

SMS 수신에는 불가능합니다. 그러나 이것은 많은 클라이언트에게 SMS를 보내는 데 사용할 수있는 까다로운 방법입니다. 트위터 API를 사용할 수 있습니다. 휴대 전화에서 트위터 계정을 SMS로 팔로우 할 수 있습니다. 트위터에 SMS를 보내면됩니다. 사용자 이름이 Twitter 계정 인 경우를 상상해보십시오 @username. 그런 다음 아래와 같이 SMS를 40404로 보낼 수 있습니다.

follow @username

그런 다음 해당 계정에 트윗 된 트윗을 받기 시작합니다.

트위터 계정을 만든 후 트위터 API를 사용하여 해당 계정에서 트윗을 게시 할 수 있습니다. 그런 다음 앞서 언급 한대로 해당 계정을 따르는 모든 고객이 트윗을 받기 시작합니다.

다음 링크에서 Twitter API로 트윗을 게시하는 방법을 배울 수 있습니다.

트위터 API

개발을 시작하기 전에 트위터 API를 사용할 수있는 권한을 얻어야합니다. 다음 링크에서 Twitter API에 액세스 할 수 있습니다.

트위터 개발자 콘솔

이것이 귀하의 문제에 가장 적합한 솔루션은 아니지만이 도움이되기를 바랍니다.


-3

AT & T 명령을 사용하여 GSM 모뎀을 사용하여 SMS를 보낼 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.