Java 응용 프로그램에서 SMS를 보내고받을 수있는 방법은 무엇입니까?
어떻게?
Java 응용 프로그램에서 SMS를 보내고받을 수있는 방법은 무엇입니까?
어떻게?
답변:
간단한 알림 만 원하는 경우 많은 이동 통신사가 이메일을 통해 SMS를 지원합니다. 이메일을 통한 SMS 참조
Java에서 본 최고의 SMS API는 JSMPP입니다. 강력하고 사용하기 쉬우 며 엔터프라이즈 수준의 응용 프로그램에 매일 사용했습니다 (매일 20K 이상의 SMS 메시지 전송).
이 API는 기존 SMPP API의 세부 정보를 줄이기 위해 작성되었습니다. 링크 요청-응답 자동 조회와 같은 저수준 프로토콜 통신의 복잡성을 숨기므로 매우 간단하고 사용하기 쉽습니다.
Ozeki와 같은 다른 API를 사용해 보았지만 대부분 상용이거나 처리량이 제한적입니다 (예 : 1 초에 3 개 이상의 SMS 메시지를 보낼 수 없음).
SMSLib라는 API가 있는데 정말 훌륭합니다. http://smslib.org/
이제 API를 사용하여이 서비스를 제공 할 수있는 많은 Saas 제공자가 있습니다.
예 : 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를 사용하여 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에서 일합니다
TextMarks를 사용하면 공유 단축 코드에 액세스하여 API를 통해 앱에서 문자 메시지를주고받을 수 있습니다. 메시지는 임의의 전화 번호 대신 41411에서 시작합니다. 이메일 게이트웨이와 달리 전체 160 개의 문자를 사용할 수 있습니다.
앱에서 다양한 기능을 호출하기 위해 사람들에게 키워드 텍스트 41411 ~ 41411을 지시 할 수도 있습니다. JAVA API 클라이언트는 몇 가지 다른 인기있는 언어와 매우 포괄적 인 문서 및 기술 지원과 함께 있습니다.
14 일 무료 평가판은 아직 테스트하고 앱을 빌드하는 개발자를 위해 쉽게 확장 할 수 있습니다.
여기에서 확인하십시오 : TextMarks API 정보
두 가지 방법이 있습니다. 첫째 : 비용을 지불해야하는 SMS API 게이트웨이를 사용하십시오. 평가판은 무료로 제공되지만 부족한 경우도 있습니다. 둘째 : 랩탑에 연결된 모뎀 GSM과 함께 AT 명령을 사용합니다. 그게 다야
그것은 어떻게 일을하는지와 공급자가 누구인지에 달려 있습니다.
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 명령 전송) . 직렬 포트 작업 방법에 대한 자세한 내용은 여기를 참조하십시오 .
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());
}
}
우리는 또한 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 라이브러리가 도움이 될 것입니다.
이를 위해 Twilio 를 사용할 수 있습니다 . 그러나 까다로운 해결 방법을 찾고 있다면 아래에서 언급 한 해결 방법을 따를 수 있습니다.
SMS 수신에는 불가능합니다. 그러나 이것은 많은 클라이언트에게 SMS를 보내는 데 사용할 수있는 까다로운 방법입니다. 트위터 API를 사용할 수 있습니다. 휴대 전화에서 트위터 계정을 SMS로 팔로우 할 수 있습니다. 트위터에 SMS를 보내면됩니다. 사용자 이름이 Twitter 계정 인 경우를 상상해보십시오 @username
. 그런 다음 아래와 같이 SMS를 40404로 보낼 수 있습니다.
follow @username
그런 다음 해당 계정에 트윗 된 트윗을 받기 시작합니다.
트위터 계정을 만든 후 트위터 API를 사용하여 해당 계정에서 트윗을 게시 할 수 있습니다. 그런 다음 앞서 언급 한대로 해당 계정을 따르는 모든 고객이 트윗을 받기 시작합니다.
다음 링크에서 Twitter API로 트윗을 게시하는 방법을 배울 수 있습니다.
개발을 시작하기 전에 트위터 API를 사용할 수있는 권한을 얻어야합니다. 다음 링크에서 Twitter API에 액세스 할 수 있습니다.
이것이 귀하의 문제에 가장 적합한 솔루션은 아니지만이 도움이되기를 바랍니다.