====== Send SMS ======
===== 개요 =====
핸드폰과 컴퓨터를 시리얼로 연결하여 AT Command 를 이용하여 문자메시지를 보낼 수 있다. Python 에는 Serial 모듈이 있으며 이를 통해서 시리얼 통신을 할 수 있다.
===== serial 모듈 설치 =====
Python 에서 시리얼 통신을 하려면 serial 모듈이 있어야 하며, Debian Linux 에서는 아래와 같이 설치한다.
# apt-get install python-serial
다른 OS에서는 http://pyserial.sourceforge.net 에서 직접 다운로드 받아 설치한다.
===== 문자보내기 (예제) =====
import serial
ser = serial.Serial('/dev/ttyS0', 115200, timeout=1) # 시리얼포트 연결
ser.write("AT*ESMS=1\r") # 문자보내기 기능을 활성화 한다.
serial_result = ser.readlines()
ser.write("ATE0\r")
serial_result = ser.readlines()
ser.write("ATV1\r")
serial_result = ser.readlines()
ser.write("AT+CHV\r") # 호연결 끊기
serial_result = ser.readlines()
ser.write("AT+CSQ?\r") # 장비 테스트
serial_result = ser.readlines()
ser.write("AT+CDV *0661\r") # 호에 연결
serial_result = ser.readlines()
serial_result = ser.readlines()
ser.write("AT*MOREQ 0,0113872176,0162348765,4098,첫번째문자보내기\r") # 첫번째문자 보내기
serial_result = ser.readlines()
ser.write("AT*MOREQ 1,0113872176,0162348765,4098,두번째문자보내기\r") # 두번째문자 보내기
serial_result = ser.readlines()
ser.write("AT+CHV\r") # 호연결 끊기
serial_result = ser.readlines()
ser.close() # 시리얼포트 끊기
위의 예제는 Mailshot 이라는 문자메시지 단말기를 통해서 문자를 보내는 코드이다. Mailshot 은 윈도우용 모듈만 제공하여 필자가 리눅스(기타 OS)에서도 돌아갈 수 있도록 작성한 것이다. 단말기, 통신사에 따라서 명령어가 틀리기 때문에 실제 문자를 보낼때 시리얼포트를 캡쳐하여 알아보아야 한다.
===== 시리얼포트 캡쳐하기 =====
문자메시지를 보낼때 사용하는 명령어를 알기 위해서는 통신사에서 제공하는 프로그램을 설치하고, 핸드폰을 연결한 후에 문자메시지를 보낼 때 주고받는 내용을 시리얼포트에서 캡쳐해내야 한다.
필자가 이용한 캡쳐 프로그램은 Agg Software 의 Advanced Serial Port Monitor 이다. 해당 사이트에서 트라이얼 버전을 다운로드하여 설치하면 일정기간 동안 사용할 수 있다.
* http://www.aggsoft.com/serial-port-monitor/
위의 프로그램을 이용하여 어떤 AT명령어를 사용하는지 알 수 있다. 또한 변수의 모든 값을 보려면 at&v 를 사용한다. 원래 통신사 프로그램을 이용해서 보내는 경우와 새로운 장비에 연결했을때의 변수 값을 비교하여 차이점을 알아낼수 있을 것이다. 예를 들어 필자의 경우는 아래와 같았다.
[Windows] - 이동사에서 지원되는 프로그램을 사용하는 장비
at&v
&C: 1; &D: 2; &F: 0; E: 0; L: 0; M: 0; Q: 0; V: 1; X: 4; Z: 0; S0: 0
S10: 14; S11: 95; S3: 13; S4: 10; S5: 8; S6: 2; S7: 50; S8: 2; S9: 6
+FCLASS: 0; +CFG: ""; +FCC: 0,1,0,0,0,0,0,0; +FIS: 0,1,0,0,0,0,0,0
+FIS: 0,1,0,0,0,0,0,0; +CDR: 0; +CDS: 0,1,2048,6; +CFC: 0; +CQD: 10
+CRC: 0; +CRM: 1; *READMT: 0; *READTI: 0; *ESMS: 1; *DELMT: 0; +CTA: 0
+CXT: 0; +DR: 0; +DS: 3,0,2048,6; +EB: 1,0,30; +EFCS: 1; +ER: 0
+ES: 3,0,2; +ESR: 1; +ETBM: 1,1,20; +FAA: 0; +FAP: 0,0,0; +FBO: 0
+FBU: 0; +FCQ: 1,0; +FCR: 0; +FCT: 1E; +FEA: 0; +FFC: 0,0,0,0; +FHS: 0
+FIE: 0; +FIP: 0; +FLI: ""; +FLO: 1; +FLP: 0; +FMS: 0; +FNR: 0,0,0,0
+FNS: ""; +FPA: ""; +FPI: ""; +FPP: 0; +FPR: 8; +FPS: 1; +FPW: ""
+FRQ: 0,0; +FRY: 0; +FSA: ""; +FSP: 0; +ICF: 3,3; +IFC: 2,2; +ILRR: 0
+IPR: 115200; +MA: ; +MR: 0; +MS: ; +MV18R: 0; +MV18S: 0,0,0; +CMUX: C,2
[Linux] - 필자의 장비
at&v
&C: 1; &D: 2; &F: 0; E: 1; L: 0; M: 0; Q: 0; V: 0; X: 4; Z: 0; S0: 0
S10: 14; S11: 95; S3: 13; S4: 10; S5: 8; S6: 2; S7: 50; S8: 2; S9: 6
+FCLASS: 0; +CFG: ""; +FCC: 0,1,0,0,0,0,0,0; +FIS: 0,1,0,0,0,0,0,0
+FIS: 0,1,0,0,0,0,0,0; +CDR: 0; +CDS: 0,1,2048,6; +CFC: 0; +CQD: 10
+CRC: 0; +CRM: 1; *READMT: 0; *READTI: 0; *ESMS: 0; *DELMT: 0; +CTA: 0
+CXT: 0; +DR: 0; +DS: 3,0,2048,6; +EB: 1,0,30; +EFCS: 1; +ER: 0
+ES: 3,0,2; +ESR: 1; +ETBM: 1,1,20; +FAA: 0; +FAP: 0,0,0; +FBO: 0
+FBU: 0; +FCQ: 1,0; +FCR: 0; +FCT: 1E; +FEA: 0; +FFC: 0,0,0,0; +FHS: 0
+FIE: 0; +FIP: 0; +FLI: ""; +FLO: 1; +FLP: 0; +FMS: 0; +FNR: 0,0,0,0
+FNS: ""; +FPA: ""; +FPI: ""; +FPP: 0; +FPR: 8; +FPS: 1; +FPW: ""
+FRQ: 0,0; +FRY: 0; +FSA: ""; +FSP: 0; +ICF: 3,3; +IFC: 2,2; +ILRR: 0
+IPR: 115200; +MA: ; +MR: 0; +MS: ; +MV18R: 0; +MV18S: 0,0,0; +CMUX: C,2
위에서 *ESMS, E, V의 값이 차이나는 것을 알 수 있고, 이 변수들을 AT 명령어로 설정해주어야 한다.
===== AT Command =====
핸드폰으로 문자메시지를 보내려면 모뎀명령어인 AT 명령어를 사용해야 하며, 관련 사이트는 다음과 같다.
* http://www.zoomtel.com/techsupport/dial_up/1048pr3a.html#RTFToC47
* http://www.data-com-experts.com/AT_Basic_Commands.htm
* http://en.wikibooks.org/wiki/Serial_Programming:Modems_and_AT_Commands/%26_Commands#.26Q:_Communications_Mode_Options
* http://www.modemhelp.net/atcommands/ampersand.shtml#Q
===== 참고 =====
아래 사이트도 참고해보면 좋을 듯 하다.
* http://www.wordhord.co.uk/pysms.html