|
Inviare sms da una macchina linux è una cosa facile ma allo stesso tempo difficile se si ha un modem gsm che non supporta la modalità PDU. Perché? Perché i maggiori software gateway sms (smstools kannel) lavorano solamente in modalità PDU per una completa gestione delle periferiche. Ho un modem che ha solo la Text Mode, come faccio? Il "Segreto" sta nell'inviare in sequenza dei comandi AT al modem gsm. Wikipedia sui comandi AT |
I comandi da inviare al modem per inviare un sms sono i seguenti:
Inizializzo il modem
ATZ
Imposto la modalità text modeAT+CMGF=1
Imposto numero centro messaggi dell'operatoreAT+CSCA="+39NUMEROCENTROMESSAGGIOPERATORE"
Imposto numero del destinatarioAT+CMGW="NUMERODESTINATARIO"
Inviato il comando precedente verrà chiesto di inserire il testo.Una volta inserito il testo bisogna premere "CTRL Z" e il modem risponderà così +CMGW: NUMEROMEMORIASMS
Invio il messaggioAT+CMSS=NUMEROMEMORIASMS
Elimino il messaggio dalla memoriaAT+CMGD=NUMEROMEMORIASMS
Potete provare ad inviare i comandi tramite "cu" (su ubuntu: sudo apt-get install cu).cu -s 9600 -l /dev/ttyACM0
/dev/ttyACM0 è nel mio caso l'indirizzo del modem (uso ubuntu), nella maggior parte delle distro debian based è così, per verificare il vostro, comunque, basta digitare in un terminale "dmesg" subito dopo aver collegato il modem e controllare l'output.
Questo è tutto...facile no?
Ma, come posso adattare tutta questa manualità ad un sistema automatico?
è si...ovvio...bisogna creare uno script facile da richiamare che invia tutti questi comandi AT!
Io, ho usato Python.
Lo script sottostante usa la seguente libreria esterna: http://sites.google.com/site/ibarona/uspp
Una volta salvato lo script in un file .py (o come vi pare) e reso eseguibile con "chmod +x sendsms.py"
é possibile inviare un sms in questa maniera:
./sendsms.py 'Modem' '+39Centro Servizi' 'Destinatario' 'TXT' 'verbose | noverbose'
./sendsms.py '/dev/ttyACM0' '+393359609600' '339XXXXXXX' 'Hello World!' 'verbose'
Lo script funziona alla perfezione con il modem Telit MG10.
#!/usr/bin/python
# coding: utf-8
import sys
import time
import re
from uspp import *
if len(sys.argv) != 6 :
print "\nERROR: Too few argument to main!\n\n usage example:\n ./sendsms.py 'Modem address' 'Service center address' 'Recipient number' 'Message text' 'verbose | noverbose'\n\n"
else :
print "Start...\n"
modem_address=sys.argv[1]
servc_address=sys.argv[2]
recip_address=sys.argv[3]
textm_address=sys.argv[4]
param_verbose=sys.argv[5]
try:
modem = SerialPort(modem_address, 1000, 9600)
except :
print "ERROR! Unable to open modem.\n"
sys.exit()
modem.write('ATZ\r\n') #Reset Modem
time.sleep(1)
answ_sent = modem.read(modem.inWaiting())
for i in range(1,10):
if re.search("OK", answ_sent):
break
else :
time.sleep(1)
answ_sent = modem.read(modem.inWaiting())
if re.search("OK", answ_sent):
if param_verbose == "verbose" : print answ_sent
else :
print 'ERROR! action = Reset Modem error= modem doesn\'t answer or answer "error".'
sys.exit()
modem.write('AT\r\n') #Check Modem
time.sleep(1)
answ_sent = modem.read(modem.inWaiting())
for i in range(1,10):
if re.search("OK", answ_sent):
break
else :
time.sleep(1)
answ_sent = modem.read(modem.inWaiting())
if re.search("OK", answ_sent):
if param_verbose == "verbose" : print answ_sent
else :
print 'ERROR! action = Check Modem error= modem doesn\'t answer or answer "error".'
sys.exit()
modem.write('AT+CMGF=1\r\n') #Set Text Mode
time.sleep(1)
answ_sent = modem.read(modem.inWaiting())
for i in range(1,10):
if re.search("OK", answ_sent):
break
else :
time.sleep(1)
answ_sent = modem.read(modem.inWaiting())
if re.search("OK", answ_sent):
if param_verbose == "verbose" : print answ_sent
else :
print 'ERROR! action = Set Text Mode error= modem doesn\'t answer or answer "error".'
sys.exit()
modem.write('AT+CSCA="'+servc_address+'"\r\n') #Set Service center address
time.sleep(1)
answ_sent = modem.read(modem.inWaiting())
for i in range(1,10):
if re.search("OK", answ_sent):
break
else :
time.sleep(1)
answ_sent = modem.read(modem.inWaiting())
if re.search("OK", answ_sent):
if param_verbose == "verbose" : print answ_sent
else :
print 'ERROR! action = Set Service center address error= modem doesn\'t answer or answer "error".'
sys.exit()
modem.write('AT+CMGW="'+recip_address+'"\r\n') #Set SMS Recipient address
modem.write(''+textm_address+'\x1A') #Set Text Recipient message
time.sleep(1)
answ_sent=modem.read(modem.inWaiting())
for i in range(1,10):
if re.search("CMGW", answ_sent):
break
else :
time.sleep(1)
answ_sent = modem.read(modem.inWaiting())
if re.search("CMGW", answ_sent):
if param_verbose == "verbose" : print answ_sent
else :
print 'ERROR! action = Set Service center address error= modem doesn\'t answer or answer "error".'
sys.exit()
memory_number= re.search('(?<=CMGW: )\w\w\w\w', answ_sent)
memory_number= memory_number.group(0)
if param_verbose == "verbose" : print memory_number
if memory_number != "" :
modem.write('AT+CMSS='+memory_number+'\r\n') #Send message
time.sleep(1)
answ_sent = modem.read(modem.inWaiting())
for i in range(1,10):
if re.search("OK", answ_sent):
break
else :
time.sleep(1)
answ_sent = modem.read(modem.inWaiting())
if re.search("OK", answ_sent):
print 'OK! Message successfully sent to '+recip_address+'. Bye!'
else :
print 'ERROR! Unable to sent message to '+recip_address+' , check: Sim card credit | Gsm signal | Service center address\n'
modem.write('AT+CMGD='+memory_number+'\r\n') #Delete inmemory message
time.sleep(1)
answ_sent = modem.read(modem.inWaiting())
for i in range(1,10):
if re.search("OK", answ_sent):
break
else :
time.sleep(1)
answ_sent = modem.read(modem.inWaiting())
if re.search("OK", answ_sent):
if param_verbose == "verbose" : print answ_sent
else :
print 'Warning! Unable to delete message from sim memory.'
sys.exit()
else :
print 'ERROR! Unable to sent message to '+recip_address+' '