본문 바로가기

혼자서꿍시렁

내 PC 에서 문자메시지(SMS) 보내는 여러 방법


PC 에서 문자메시지를 보내는 방법 몇가지를 소개 해 드립니다. 있는 유틸리티를 쓰셔도 되고, 프로그래밍을 하셔도 되며, 하드웨어 적으로 관련 장비를 구입해 보내실 수도 있습니다. 혹은 자신의 휴대폰을 통해 보내실 수도 있습니다.

1. 있는 것 사용 하기

- 당연, SMS 서비스를 제공하는 메신저나 사이트를 방문해 사용하는 방법입니다. 가장 많이 아시는 방법이지요. 수많은 메신저와 서비스를 제공하는 사이트가 만들어져 있으며, 대부분 월 10개 이상의 문자 메시지를 사용 할 수 있습니다. 각종 검색엔진에서 "sms 제공"등의 단어를 검색해 만만한 것 하나 쓰시면 되겠지요. 아래는 아래 출처에서 퍼온 리스트입니다.

2. 유틸리티 사용하기

위의 사이트들 처럼 SMS 서비스를 제공하는 사이트와 (비공식적으로?)연동하는 유틸리티를 개인적으로 만드신 분도 계십니다. 즉, 해당 사이트를 찾아가지 않고서도 유틸리티 내에서 SMS 를 보낼 수 있도록 제작된 유틸리티를 쓰는 것입니다.


3. SMS 제공 사이트와 연동하는 프로그램 만들기

네, 위의 2번 예처럼 웹사이트의 SMS를 이용하는 유틸리티를 만드는 방법입니다. 가령, 웹브라우저상에서 로그인하고, SMS 정보를 입력 한 후 전송 버튼을 누르듯, 그 모든 과정을 대신하는 프로그램을 만드는 것이죠. 어떤 사이트는 그러한 프로그램을 쉽게 만들수 있도록 서비스를 유료로 제공하기도 합니다. 해당 사이트와의 연동은 HTTP 프로토콜로 이루어지기 때문에 TCP/IP 소켓 프로그래밍을 하실 수만 있다면 손쉽게 프로그램 하실 수 있습니다. 아래는 그 한 예입니다.


출처는 제 홈페이지(http://airpage.org/xe/language_data/6943) 입니다.

  1. // sms.h  
  2.  
  3. class CSms : public CAsyncSocket  
  4. {  
  5. // Attributes  
  6. :  
  7. :  
  8. };  
  9.  
  10. :  
  11. :  
  12.  
  13. //sms.cpp  
  14. //  
  15. BOOL CSms::SendSMSNow(BOOL isGET)  
  16. {  
  17.     char sendBuffer[4096];  
  18.     char recvBuffer[4096];  
  19.     int ret;  
  20.          //자신의 소켓을 Create 한다  
  21.     if(Create() == FALSE) return FALSE;  
  22.          //서비스 제공사이트의 IP 주소를 80(보통HTTP)포트로 접속한다.  
  23.     Connect(m_ServerIP, 80);  
  24.  
  25.     //    
  26.     if(isGET == TRUE)  
  27.     {     
  28.                   //해당사이트에서 요구하는 CGI 쿼리 포멧으로 자신의 보내는 내용/번호, 받는 번호를 설정하고 해당사이트에서 전송시 요구하는 아이디와 패스워드를 담는다.  
  29. //즉, 이와 같이 한번의 쿼리에 아이디와 패스워드가 맞고 쿼리가 바를 경우 SMS를 날릴 수 있도록 서비스를 제공해주는 사이트에 미리 가입이 되어 있어야 한다.  
  30. //아래는 nicesms.co.kr 이라는 사이트의 서비스를 예로 들었다.  
  31.         sprintf(sendBuffer,"GET %s?%s=%s&%s=%s&%s=%s&%s=%s&%s=%s&%s HTTP/1.0\r\n\r\n",   
  32.         m_CGIAddr, m_Param_ID, m_ID, m_Param_PW, m_PW, m_Param_MSG, m_strMessage,  
  33.         m_Param_RecvNum, m_strRecvNum, m_Param_SendNum, m_strSendNum,  
  34.         m_Param_etc);  
  35.     }  
  36.     else 
  37.     {  
  38.         CString strPacket, strContentLength;  
  39.         CString strParam;  
  40.  
  41.         strParam.Format("%s=%s&%s=%s&%s=%s&%s=%s&%s=%s&%s",   
  42.             m_Param_ID, m_ID, m_Param_PW, m_PW, m_Param_MSG, m_strMessage,  
  43.             m_Param_RecvNum, m_strRecvNum, m_Param_SendNum, m_strSendNum,  
  44.             m_Param_etc);  
  45.  
  46.         strContentLength.Format("%d",strParam.GetLength());  
  47.           
  48.  
  49.         strPacket = "POST ";  
  50.         strPacket += m_CGIAddr;  
  51.         strPacket += " HTTP/1.1\r\n";  
  52.         strPacket += "Accept: */*\r\n";  
  53.         //strPacket += "Referer: http://" + m_ServerIP + m_CGIAddr + "\r\n";  
  54.         strPacket += "Accept-Language: ko\r\n";  
  55.         strPacket += "Content-type: application/x-www-form-urlencoded\r\n";  
  56.         strPacket += "Accept-Encoding: gzip, deflate\r\n";  
  57.         strPacket += "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)\r\n";  
  58.         strPacket = strPacket + "Host: " + m_ServerIP + "\r\n";  
  59.         strPacket = strPacket + "Content-Length: " +  strContentLength + "\r\n";  
  60.         strPacket += "Cache-Control: no-cache\r\n";  
  61.         strPacket += "Connection: Keep-Alive\r\n";  
  62.         strPacket += "\n";  
  63.         strPacket += strParam;  
  64.         strPacket += "\r\n\r\n";  
  65.  
  66.         sprintf(sendBuffer, strPacket);  
  67.         //AfxMessageBox(sendBuffer);  
  68.     }  
  69.        
  70.  
  71.     //AfxMessageBox(sendBuffer);  
  72.       
  73.     Sleep(1500);  
  74.          //쿼리를 날린다.  
  75.     if(Send(sendBuffer,strlen(sendBuffer),0) <= 0)  
  76.         return FALSE;  
  77.  
  78.          //잠시 대기후...  
  79.     Sleep(1000);  
  80.  
  81.     memset(recvBuffer,0,sizeof(recvBuffer));  
  82.  
  83.          // 응답 데이터를 수신한다.  
  84.     do{  
  85.         ret = Receive(recvBuffer,4096,0);  
  86.     }while(ret > 0);  
  87.  
  88.          // 수신된 데이터를 파싱하여 송신의 성공 유무를 확인하는 코드를 작성할 수 있을 것이다.  
  89.     //recvBuffer[ret] = NULL;  
  90.     //AfxMessageBox(recvBuffer);  
  91.  
  92.     
  93.          // 소켓을 닫는다.  
  94.     Close();  
  95.  
  96.     return TRUE;  
  97. }  


4. 내 휴대폰을 제어해서 보내기

가지고 있는 휴대폰을 제어해서 보내는 방법 입니다. 휴대폰 데이터 통신 케이블을 가지고 계시다면 한번쯤 자신의 휴대폰에 벨소리나 음악, 여타의 데이터를 넣고, 받기 위해 휴대폰 연동 프로그램을 사용해 보신적이 있으실 겁니다. 그처럼 휴대폰과 직접 연동하는 프로그램을 만들거나 연동하는 방법이 있습니다. 무슨 말이냐 하면, 휴대폰이 데이터 통신 케이블과 연결되면 마치 시리얼 통신을 하듯 COM포트 하나를 열수 있게 제공됩니다. 개발자는 그 COM포트를 열어 데이터를 주고 받을 수 있습니다. 먼 옛날 모뎀으로 채팅할 때 많이 사용했던 "이야기", "잠들지 않는 시간" 등의 프로그램을 통해 썼던 방법으로 자신의 휴대폰을 사용하실 수 있다는 말입니다.

아래는 간단히 윈도우에서 기본으로 제공하는 "하이퍼 터미널"을 이용해 제 휴대폰에서 SMS를 날리는 모습입니다.
단, 아래의 방법은 AT 커맨드를 사용하는 것이며, 제가 알아낸 AT 커맨드는 삼성의 SPH-E3200 단말기에서만 동작했습니다. 그외의 단말기에서는 동작되는 것을 확인하지 못했으며, 이는 모든 사업자, 단말기마다 다르기에 일치하는 커맨드를 찾으시지 못할 경우 유용한 방법이 아닙니다.

A. 먼저 자신의 휴대폰을 위한 드라이버를 설치하셔야 합니다. 해당 방법은 자신의 휴대폰 업체 사이트에 있습니다.

B. 휴대폰에 통신 케이블을 꽂고 PC에도 연결합니다.

C. 내 컴퓨터 -> 속성 -> "하드웨어" 텝 -> "장치 관리자" 버튼을 누릅니다.

D. 리스트 된 항목들 중 아래 그림처럼 "모뎀" -> "SAMSUNG Mobile Modem #2" 를 선택해 마우스의 오른쪽 버튼을 누르면 나오는 컨텍스트 메뉴에서 "속성" 을 클릭합니다. (타사 제품의 경우 다른이름으로 나타나겠죠?)

사용자 삽입 이미지


E. 아래 처럼 나타난 등록정보 다이얼로그에서 "모뎀" 탭을 클릭하면 상단에 "포트"정보가 나타납니다. 이 때 나타는 포트 이름을 기억하세요. 아래는 "COM4" 이군요.

사용자 삽입 이미지


F. Windows 의 "시작" 버튼 -> "보조프로그램" -> "통신" -> "하이퍼 터미널" 을 실행합니다.

G. 아래 그림처럼 묻는 화면에서 지역번호와 외부회선 번호 등을 아무렇게나 넣고 "확인"버튼을 누릅니다.

사용자 삽입 이미지


H. 다음 화면에서도 그냥 "확인" 버튼을 누릅니다.

I. 또 귀찮게 나타나는 다음 화면에서는 아무이름이나 입력하시고 "확인" 버튼을 누릅니다.

사용자 삽입 이미지


J. 그리고 아래와 같은 화면이 나오면 조금전 기억하셨던 COM 포트 이름을 선택합니다.

사용자 삽입 이미지


K. 아래과 같이 등록정보 화면이 나타나면 아래와 같이 설정합니다. "비트/초" 항목과 "흐름제어" 항목만 바꾸시면 될겁니다.

사용자 삽입 이미지


L. 자, 이제 내 휴대폰을 제어할 준비가 끝났습니다. 그 옛날 전화선을 이용해 채팅하던 때를 떠올리시며 "AT"를 입력해 보세요. 그러면 아래와 같이 "OK"가 나올 경우 정상 연결이 된 것입니다.

사용자 삽입 이미지


M. 여기서 문제가 하나 있습니다. 전화를 걸고, 받고, SMS 를 날리는 방법이 사업자마다, 폰마다 방식이 다릅니다. >.< 저역시 겨우 인터넷에서 찾아 나오는 수많은 AT 캐맨드 중에서 삼성폰 - SPH-E3200 에서 통하는 방법을 찾았습니다. 즉,

AT+CDV 전화번호  => 전화걸기
AT+CHV => 전화끊기

이며,

AT#PMODE=1 => 단말기를 PC Link 모드로 변환
AT#PSTRM=보내는번호,받는번호,3,"보내는메시지내용",0,0,0, 4098 => SMS 보내기
AT#PMODE=0 => PC Link 모드에서 빠져나옴

위의 커맨드만 알 뿐입니다. (죄송...^^;)

이 방법을 (RS232C) 시리얼 통신 프로그램을 하신다면 위의 AT 커맨드 문장 뒤에 (CR Carriage Return)만 붙여 COM 포트에 쓰시고, 수신되는 값(OK) 만 확인하도록 한다면 휴대폰으로 SMS 를 보내는 프로그램을 하실 수 있습니다.


5. 하드웨어 구입하기

CDMA 모뎀과 같은 장비를 구입하는 방법이 있습니다. 즉, 위의 4에서 나온 방법으로 SMS를 보낼 수 있도록 만들어진 장비입니다. 시리얼포트등으로 해당 장비에 연결해 장비에서 제공해주는 커맨드를 이용해서 SMS를 보내는 것이죠. 물론, 이는 휴대폰과 비슷하게 가입을 하시고, 요금을 지불하는 것으로 알고 있습니다. 게다가, 프로그램이 쉽도록 각종 라이브러리를 제공해 주는 것으로 알고 있습니다.