#!/usr/bin/env python3 import time import serial import argparse import sys parser = argparse.ArgumentParser(description="Utility for dealing with texts over GSM via serial connection") subparsers = parser.add_subparsers(help='send or read messages', dest='command') ### Sender subparser parser_send = subparsers.add_parser('send', help='send text messages') parser_send.add_argument('-i', '--interface', help='serial interface', metavar='TTY', required=True) parser_send.add_argument('-r', '--recipient', help='phone number to send to', metavar='NUM', required=True) parser_send.add_argument('-m', '--message', help='message contents', metavar='MES') ### Reader subparser parser_read = subparsers.add_parser('read', help='read text messages') parser_read.add_argument('-i', '--interface', help='serial interface', metavar='TTY', required=True) parser_read.add_argument('-n', '--number', help='sms inbox number', metavar='SMS') parser_one = subparsers.add_parser('one', help='read first sms inbox messages') parser_one.add_argument('-i', '--interface', help='serial interface', metavar='TTY', required=True) parser_del = subparsers.add_parser('del', help='del first sms inbox messages') parser_del.add_argument('-i', '--interface', help='serial interface', metavar='TTY', required=True) args = parser.parse_args() def sendText(phone, recipient, message): try: time.sleep(0.5) phone.write(b'ATZ\r') time.sleep(0.5) phone.write(b'AT+CMGF=1\r') time.sleep(0.5) phone.write(b'AT+CMGS="' + recipient.encode() + b'"\r') time.sleep(0.5) phone.write(message.encode() + b"\r") time.sleep(0.5) phone.write(bytes([26])) time.sleep(0.5) finally: phone.close() def readMessage(phone): try: time.sleep(0.5) phone.write(b'AT+CMGL="ALL"\r') read = phone.readlines() badChars = ['OK', 'AT'] for msg in read: if not any(x in str(msg) for x in badChars): print(str(msg.decode("utf-8"))) time.sleep(0.5) finally: phone.close() def readOne(phone): try: time.sleep(0.5) phone.write(b'AT+CMGL=1\r') read = phone.readlines() badChars = ['OK', 'AT'] for msg in read: if not any(x in str(msg) for x in badChars): print(str(msg.decode("utf-8"))) time.sleep(0.5) finally: phone.close() def delOne(phone): try: time.sleep(0.5) phone.write(b'AT+CMGD=1\r') read = phone.readlines() badChars = ['OK', 'AT'] for msg in read: if not any(x in str(msg) for x in badChars): print(str(msg.decode("utf-8"))) time.sleep(0.5) finally: phone.close() def main(): phone = serial.Serial(args.interface, 115200, timeout=5) if sys.argv[1] == 'send': sendText(phone, args.recipient, args.message) elif sys.argv[1] == 'read': readMessage(phone) elif sys.argv[1] == 'one': readOne(phone) elif sys.argv[1] == 'del': delOne(phone) else: parser.print_help() if __name__ == '__main__': main()