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 mode
AT+CMGF=1
Imposto numero centro messaggi dell'operatore
AT+CSCA="+39NUMEROCENTROMESSAGGIOPERATORE"
Imposto numero del destinatario
AT+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 messaggio
AT+CMSS=NUMEROMEMORIASMS
Elimino il messaggio dalla memoria
AT+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+' '