-
-
Save mrf345/13781a4103f3da356597d11e73db8f1f to your computer and use it in GitHub Desktop.
Sending a SMS with Python and pyserial via an USB 3G Modem on pfSense/FreeBSD
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python2.7 | |
# -*- coding: utf-8 -*- | |
# | |
# Sending a SMS with Python and pyserial via an USB 3G Modem on pfSense/FreeBSD | |
# tested with: Huawei Technologies Co., Ltd. E620 USB Modem | |
# and a Telekom SIM card | |
import serial | |
from curses import ascii | |
import time | |
import sys | |
import getopt | |
baudrate = 9600 | |
device = "/dev/cuaU0.0" | |
simpin = 1234 | |
def getline(ser): | |
buf = "" | |
while True: | |
ch = ser.read(1) | |
if ch == '\r': | |
break | |
buf += ch | |
return buf | |
def send_sms(message, phonenumber): | |
# Initialize serial connection to 3G USB Modem | |
modem = serial.Serial(device, baudrate, timeout=5) | |
print "Connected to " + modem.name | |
# Check modem status | |
modem.write(b'AT\r') | |
sent_cmd = getline(modem) | |
response = modem.read(4) | |
if "OK" in response: | |
print "Modem Status: OK" | |
# check pin and enter it if needed | |
modem.write(b'AT+CPIN?\r') | |
sent_cmd = getline(modem) | |
line2 = getline(modem) # empty | |
line3 = getline(modem) # empty | |
response = getline(modem) # get OK | |
if "SIM PIN" in response: | |
print "Sending PIN to modem ... " | |
modem.write(b'AT+CPIN="%s"' % simpin) | |
sent_cmd = getline(modem) | |
response = getline(modem) | |
print response | |
elif "READY" in response: | |
print "PIN already entered." | |
# set modem to text mode | |
modem.write(b'AT+CMGF=1\r') | |
sent_cmd = getline(modem) | |
response = getline(modem) | |
if "OK" in response: | |
print "Modem set to text mode!" | |
# send sms | |
print "Sending sms ..." | |
modem.write(b'AT+CMGS="%s"\r' % phonenumber) | |
time.sleep(0.5) | |
modem.write(b'%s\r' % message) | |
time.sleep(0.5) | |
modem.write(ascii.ctrl('z')) | |
time.sleep(0.5) | |
response = modem.readlines() | |
if "+CMGS" in response[-3]: | |
print "Sucess: SMS sent!" | |
else: | |
print "Error: SMS not sent!" | |
else: | |
print "Error: Setting modem to text mode failed!" | |
elif "NO CARRIER" in response: | |
print "Error: No 3G connection!" | |
else: | |
print "Error: Something else failed!" | |
def main(argv): | |
message = '' | |
phonenumber = '' | |
usage = 'usage: send_sms.py -p +123467890 -m "your message"' | |
try: | |
opts, args = getopt.getopt(argv, "hp:m:", ["phonenumber=", "message="]) | |
except getopt.GetoptError: | |
print usage | |
sys.exit(2) | |
for opt, arg in opts: | |
if opt == '-h': | |
print usage | |
sys.exit() | |
elif opt in ("-p", "--phonenumer"): | |
phonenumber = arg | |
elif opt in ("-m", "--message"): | |
message = arg | |
send_sms(message=message, phonenumber=phonenumber) | |
if __name__ == '__main__': | |
main(sys.argv[1:]) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment