사용자 도구

사이트 도구


develop:python:tip:sendsms

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 이다. 해당 사이트에서 트라이얼 버전을 다운로드하여 설치하면 일정기간 동안 사용할 수 있다.

위의 프로그램을 이용하여 어떤 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

참고

아래 사이트도 참고해보면 좋을 듯 하다.

develop/python/tip/sendsms.txt · 마지막으로 수정됨: 2007/02/08 09:42 저자 mattabu