|
#!/usr/bin/env python |
|
|
|
from __future__ import print_function |
|
from datetime import datetime |
|
from gsmmodem.modem import GsmModem, Sms |
|
from gsmmodem.pdu import Concatenation |
|
|
|
import logging |
|
import Pyro4.core |
|
import threading |
|
|
|
PORT = '/dev/ttyUSB0' |
|
BAUDRATE = 115200 |
|
PIN = None # SIM card PIN (if any) |
|
|
|
concat_sms = {} |
|
|
|
@Pyro4.expose |
|
class RemoteSMSHandler(object): |
|
def __init__(self, m): |
|
self.modem = m |
|
def sendSMS(self, to, message): |
|
try: |
|
self.modem.sendSms(to, message) |
|
return "Message sent to {0}.\n".format(to) |
|
except Exception, e: |
|
return "Failed to send SMS: " + str(e) |
|
|
|
def handleSms(sms): |
|
concat = None |
|
message = None |
|
for i in sms.udh: |
|
if isinstance(i, Concatenation): |
|
concat = i |
|
break |
|
if concat: |
|
if concat_sms.has_key(concat.reference) == False: |
|
concat_sms[concat.reference] = {} #numpy.empty(concat.parts, dtype=string) |
|
concat_sms[concat.reference][concat.number] = sms.text |
|
print(u'== Partial message received ==\n[{0}/{1}] reference{2}\n'.format(len(concat_sms[concat.reference]), concat.parts, concat.reference)) |
|
if len(concat_sms[concat.reference]) == concat.parts: |
|
sortedParts = sorted(concat_sms[concat.reference].iteritems()) |
|
message = "".join([x[1] for x in sortedParts]) |
|
del concat_sms[concat.reference] |
|
else: |
|
message = sms.text |
|
|
|
if message: |
|
print(u'== SMS message received ==\nFrom: {0}\nTime: {1}\nMessage:\n{2}\n'.format(sms.number, sms.time, message)) |
|
date = datetime.today().strftime('%Y%m%d%H%M%S%f') |
|
# Uncomment to save the SMS in a file |
|
#with open('/path/to/messages/' + date + '.txt', 'w') as the_file: |
|
# the_file.write('{0}:{1}'.format(sms.number, sms.text)) |
|
|
|
def checkStoredSms(modem): |
|
# print('Processing stored SMS...') |
|
modem.processStoredSms(False) |
|
threading.Timer(10.0, checkStoredSms, [modem]).start() |
|
|
|
def main(): |
|
print('Initializing modem...') |
|
# Uncomment the following line to see what the modem is doing: |
|
#logging.basicConfig(format='%(levelname)s: %(message)s', level=logging.DEBUG) |
|
modem = GsmModem(PORT, BAUDRATE, smsReceivedCallbackFunc=handleSms) |
|
modem.smsTextMode = False |
|
modem.connect(PIN) |
|
threading.Timer(10.0, checkStoredSms, [modem]).start() |
|
print('Waiting for new SMS message...') |
|
|
|
myRemoteSMSHandler = RemoteSMSHandler(modem) |
|
|
|
daemon = Pyro4.Daemon.serveSimple({ |
|
myRemoteSMSHandler: 'RemoteSMSHandler', |
|
}, host="127.0.0.1", port=9091, ns=False, verbose=False) |
|
|
|
|
|
daemon.requestLoop() |
|
|
|
if __name__ == '__main__': |
|
main() |
Hi Steve,
Thanks for this script! I'm stuck trying to use gammu on a E3531 but I get all sort of random error messages.. So I ended up here :)
I'm trying to run your script in a raspberry pi 4 but I'm getting the following error:
pi@raspberrypi:~ $ python2.7 python-gsmmodem-advanced-read.py
Initializing modem...
INFO: Connecting to modem on port /dev/ttyUSB0 at 115200bps
DEBUG: write: ATZ
DEBUG: response: ['OK']
DEBUG: write: ATE0
DEBUG: response: ['OK']
DEBUG: write: AT+CFUN?
DEBUG: response: ['+CFUN: 1', 'OK']
DEBUG: write: AT+CMEE=1
DEBUG: response: ['OK']
DEBUG: write: AT+CPIN?
DEBUG: response: ['+CPIN: READY', 'OK']
DEBUG: write: AT+CLAC
Traceback (most recent call last):
File "python-gsmmodem-advanced-read.py", line 81, in
main()
File "python-gsmmodem-advanced-read.py", line 67, in main
modem.connect(PIN)
File "/usr/local/lib/python2.7/dist-packages/gsmmodem/modem.py", line 201, in connect
commands = self.supportedCommands
File "/usr/local/lib/python2.7/dist-packages/gsmmodem/modem.py", line 490, in supportedCommands
response = self.write('AT+CLAC')
File "/usr/local/lib/python2.7/dist-packages/gsmmodem/modem.py", line 398, in write
responseLines = SerialComms.write(self, data + writeTerm, waitForResponse=waitForResponse, timeout=timeout, expectedResponseTermSeq=expectedResponseTermSeq)
File "/usr/local/lib/python2.7/dist-packages/gsmmodem/serial_comms.py", line 135, in write
raise TimeoutException()
gsmmodem.exceptions.TimeoutException
On lsusb I get:
Bus 001 Device 022: ID 12d1:1001 Huawei Technologies Co., Ltd. E161/E169/E620/E800 HSDPA Modem
And gammu identify:
Device : /dev/ttyUSB0
Manufacturer : Huawei
Model : E3531 (E3531)
Anything else basic I might be missing ? Thanks!