Ricevitore di SMS sul PC: Open Source IperSMS Gateway

IperSMS sms gateway open source

Il Gateway SMS diventa OpenSource! IperSMS è un progetto completo (sorgenti hardware e firmware disponibili) di un ricevitore SMS per PC, in pratica potrete ricevere gli SMS sul vostro computer tramite i programmi gratuiti che avete nel vostro sistema operativo. Disponibili: schema elettrico, lista parti, piano di montaggio, sorgenti circuito stampato, file gerber, firmware open source per MPLAB e file HEX per programmare direttamente il microcontrollore.

IperSMS è un Gateway SMS (o GSM Gateway), in grado di ricevere SMS in modo automatico, professionale ed economico. Basta semplicemente collegarlo al PC e tramite un programma di gestione comunicazione seriale, tipo Hyperterminal, potrete ricevere gli SMS sul Vostro PC per poi elaborarli e/o archiviarli nella Vostra applicazione preferita tramite i classici comandi copia/incolla.

Schema elettrico

Cliccare sull’immagine per la versione in alta risoluzione

In alto a sinistra dello schema elettrico potete vedere il microcontrollore utilizzato U1, un PIC18F2420 con accanto la predisposizione per il risuonatore ceramico Y1 esterno ma nel nostro progetto operativo con l’oscillatore interno. Poi i connettori J1, utilizzato come espansione I/O per scopi futuri e J3 per una eventuale implementazione di una porta USB tramite convertitore SPI-USB. (Se vi interessa questa soluzione possiamo approfondirla nei commenti)
In alto a destra invece è presente il modulo GSM Telit GM862 con relativa rappresentazione, sullo schema elettrico, del connettore Molex di collegamento J2. Si può notare il ponticello JP1 inserito per mantenere la compatibilità tra i vari moduli GM862, GMS e Quad.
La comunicazione tra modulo Telit e microcontroller avviene tramite la UART del micro ed i relativi segnali TXD1 e RXD1 che vengono opportunamente convertiti di livello tramite l’integrato 74HC125 ed il diodo DZ1. Ricordo che il PIC lavora a 5V mentre il modulo Telit a 3,8V ma sulla UART del modulo i valori di tensione sono di 2,8V. Proseguendo nella lettura dello schema si notano gli altri segnali convertiti da 2,8 a 5V (CTS-RING-PWCTL oltre al già citato TX) tramite il CD74HC125, poi i 2 segnali convertiti da 5V a 2.8V tramite gli zener (RTS1 ed il già citato RX) e poi i 2 controlli ON/OFF e RESET che vengono gestiti in open collector tramite i transistor Q1 e Q2.
In basso a destra dello schema elettrico sono visibili l’integrato HIN202 ed il connettore P1, relativamente driver e porta seriale DB9 per la connessione RS232. Infine, in basso a sinistra, la sezione alimentazione.
Il connettore J14 rende possibile il collegamento dell’alimentazione sia AC che DC senza preoccuparsi della polarità grazie all’utilizzo del ponte a diodi DB1. La tensione ottimale di funzionamento è di 9Vdc oppure di 6Vac ma questi valori possono subire delle tolleranze compatibilmente con la dissipazione termica dei regolatori di tensione utilizzati (U3 ed U5) ed il loro Vin minimo in base al dropout. Questi due integrati infatti si occupano di mantenere stabili le due tensioni principali della scheda rispettivamente per il microcontrollore e gli altri integrati e per il modulo Telit che invece necessita di 3V8. Quest’ultima tensione è generata nel classico esempio di funzionamento dell’LM317 ADJ, tramite partitore di tensione R12/R14.

L’illustrazione dello schema termina con il connettore ICSP (In Circuit Serial Programming) J5 per connettere il programmatore o il debugger. Il firmware del progetto IperSMS è stato sviluppato con MPLAB ICD2.

Layout

L’immagine sopra rappresenta una visione d’insieme della scheda con tutti i layer sovrapposti da cui facilmente identificare i collegamenti, i componenti, il piano di foratura e quindi tutto il layout.

Piano di montaggio

Di seguito invece è visibile l’immagine del piano di montaggio da cui sono evidenti, oltre ad i componenti, anche i 4 fori di ancoraggio ai 4 angoli, dimensionati in relazione al contenitore utilizzato (Pactec KEU-5LP). Da notare il piccolo scasso in basso a destra, realizzato, insieme al connettore a pettine sul pcb, per favorire una programmazione low-cost (senza connettore ICSP).

Lista Parti

Questa la lista parti completa. Compresi alcuni componenti non montati, ma predisposti per contrastare eventuali problematiche future o per implementazioni future. Ne fanno parte il risuonatore smd (è utilizzato l’oscillatore interno del microcontrollore) ed i connettori J1 e J3.
Inoltre i condensatori C8, C14 e C15 possono essere montati sia smd che tradizionali, grazie al doppio passo.

 

Firmware

Per una migliore lettura inserisco solo HEADER e MAIN, comunque il sorgente firmware potete trovarlo nella documentazione indicata alla fine dell’articolo.

/*
Name: IperSMS
Author: Emanuele Bonanni @EMCelettronica Srl
*/

//	LIST	P=18F2420		;directive to define processor
//	LIST	P=18F2520		;directive to define processor

#include <p18f2420.h>
#include <usart.h>
#include <stdio.h>
#include <adc.h>
#include <stdlib.h>
#include <timers.h>
#include <string.h>
#include <delays.h>
#include <sw_uart.h>

// vedi .inc in mpasm
#pragma config OSC = INTIO67
#pragma config PWRT = OFF	//disable power up
#pragma config BOREN = ON, BORV = 2		// 2v7
#pragma config WDT = OFF
#pragma config LVP = OFF


/* asm_timed_delay is found in an assembly file */
extern void asm_txrs (unsigned char);

/* asm_timed_delay is found in an assembly file */
extern void asm_rxrs (unsigned char);

void rx_handler (void);
 
#define POWER_ON	PORTAbits.RA4
#define GM_PWRCTL	PORTBbits.RB2

	char inputstr[242];	// stringa totale riservata da 10 char
					// databank name=gpr2 0x200-0x2F3 (linker)
	int lungh;
	
	rom char mystr2 [] = "\r\n+CMS ERROR";

	rom char mystr_rea [] = "\r\n+CMGR: \"REC READ";
	rom char mystr_unr [] = "\r\n+CMGR: \"REC UNRE";

	rom char mystr_ok [] = "\r\nOK\r\n";

	rom char mystr_sim [] = "\r\n+CPIN: READY";

	rom char mystr_net [] = "\r\n+CREG: 0,1";
	rom char mystr_roa [] = "\r\n+CREG: 0,5";
	rom char mystr_net1 [] = "\r\n+CREG: 1,1";
	rom char mystr_roa1 [] = "\r\n+CREG: 1,5";

	rom char m_error [] = "ERROR!";
	rom char m_ok [] = "OK!";

	rom char m_network [] = "NETWORK OK!";
	rom char m_roaming [] = "ROAMING OK!";
	rom char m_loss [] = "\n\rWARNING! Network LOSS!!";

	rom char welcome_str [] = "\n\r"
	"\t**************************************\n\r"
	"\t*        Welcome to IperSMS          *\n\r"
	"\t*                                    *\n\r"
	"\t*                            V1.00   *\n\r"
	"\t**************************************\n\r";

	rom char modulo_on [] = "\n\rChecking M2M Module ON.....";
	rom char m_sim [] = "\n\rVerify SIM presence.....";
	rom char m_net [] = "\n\rNetwork registration.....";
	rom char sms_wait [] = "\n\r\n\r\n\rWaiting SMS.....\n\r";

// attesa ricezione dato

#pragma code rx_interrupt = 0x8
void rx_int (void)
{
  _asm goto rx_handler _endasm
}
#pragma code

.............................................


//*****************************************************************************
void main (void)
{	
	char sms_index;			// Used for read SMS in sequence
	unsigned int atd_index;		// atd command (every 5 minute for gm862-alive

	POWER_ON = 0;

	ADCON1bits.PCFG0 = 1;
	ADCON1bits.PCFG1 = 1;
	ADCON1bits.PCFG2 = 1;
	ADCON1bits.PCFG3 = 1;

	TRISBbits.TRISB2 = 1;	// GM_PWMCTL = input
	TRISAbits.TRISA4 = 0;	// POWER_ON = output

	PORTAbits.RA0 = 1;		// TX>PC
	TRISAbits.TRISA0 = 0;	// TX>PC
	PORTAbits.RA0 = 1;		// TX>PC

	TRISCbits.TRISC0 = 0;	// GPLED

	TRISCbits.TRISC2 = 0;	// RESET

	OSCCONbits.IRCF2 = 1;	// 4MHz
	OSCCONbits.IRCF1 = 1;
	OSCCONbits.IRCF0 = 0;

	OSCCONbits.SCS1 = 1;	//internal oscillator

	Delay10KTCYx (100);	// wait 1 sec stabilize power supply

	PORTCbits.RC0 = 1;				// LED ON
	putsUARTema2r( welcome_str );	// WELCOME MESSAGE
	PORTCbits.RC0 = 0;				// LED OFF

	Delay10KTCYx (100);			// wait 1 sec stabilize power supply

// check power supply (7.5-11.5)V 
// reference HLVDTC = 47K/20K = 0.298
// 2.23-3.43
//	LVV=0000=2.17
//	LVV=0001=2.23
//
//	LVV=1000=3.39
//	LVV=1001=3.55


	gm_POWER_ON();	// accendi il modulo telit e verifica accensione, else ri-accendi

 	OpenUSART(USART_TX_INT_OFF &
			USART_RX_INT_ON &
           	USART_ASYNCH_MODE &
           	USART_EIGHT_BIT &
           	USART_CONT_RX &
           	USART_BRGH_HIGH, 25);	// decimale (9600baud)

/* Enable interrupt priority */
	RCONbits.IPEN = 1;

/* Make receive interrupt high priority */
	IPR1bits.RCIP = 1;

/* Enable all high priority interrupts */
	INTCONbits.GIEH = 1;

// autobaud
	lungh = 0;							
	putrsUSART ((const far rom char *)"AT\r");		
	Delay10KTCYx (50);							
// set_baud
	lungh = 0;								
	putrsUSART ((const far rom char *)"AT+IPR=9600\r");
// set_baude_rate 300,1200,2400,4800,9600,19200,38400,57600,115200
	Delay10KTCYx (50);						
// disable_echo
	lungh = 0;
	putrsUSART ((const far rom char *)"ATE=0\r");	// Disable echo command
	Delay10KTCYx (50);						

	check_module_on ();	// AT at 9600 without echo!

	lungh = 0;
	putrsUSART ((const far rom char *)"AT+CGMR\r");	// FW Version
	Delay10KTCYx (10);		

	lungh = 0;
	putrsUSART ((const far rom char *)"AT+CLIP=1\r");	// Set CALLER ID; 1=on
	Delay10KTCYx (10);							

	lungh = 0;
	putrsUSART ((const far rom char *)"AT+CMEE=1\r");	
// Enable extended error code ; 1 =numeric
	Delay10KTCYx (10);							

	check_sim ();

	lungh = 0;								
	putrsUSART ((const far rom char *)"AT+CMGF=1\r");	// SMS format type; 1=text	
	Delay10KTCYx (10);							

	lungh = 0;
	putrsUSART ((const far rom char *)"AT+CSCA?\r");	// Check SMS service
	Delay10KTCYx (20);							
// +CSCA:,OK ; international

	lungh = 0;		
//anche se inserisco unsolecit alarm for sms, non riceve i pending!
	putrsUSART ((const far rom char *)"AT+CNMI=0,0,0,0,0\r"); 	
// DISABLE New message unsolecited indication +CMTI:
	Delay10KTCYx (10);					

	lungh = 0;
	putrsUSART ((const far rom char *)"AT+CSMP=17,167,0,0\r");	
// Set TEXT mode parameters
	Delay10KTCYx (10);									

	lungh = 0;
	putrsUSART ((const far rom char *)"AT+CPBS=\"SM\"\r");		
// AT+CPBS="SM"	setta phonebook normal SIM
	Delay10KTCYx (50);							

	lungh = 0;
	putrsUSART ((const far rom char *)"AT+CPMS=\"SM\",\"SM\",\"SM\"\r");		
// AT+CPMS="SM","SM","SM"	setta sms storage = SIM
	Delay10KTCYx (50);	// +CPMS: 0,30.....

main_1:	
	if (check_network ())
	{
	_asm goto main_1 _endasm	// if no network, loop
	}

	PORTCbits.RC0 = 1;		// LED ON
	putsUARTema2r( sms_wait );	// waiting sms
	PORTCbits.RC0 = 0;		// LED OFF

// MENU
	memset( inputstr,0,242 );	
// Cancella STRINGA/RAM
	
// MAIN_Loop forever

	atd_index = 0;

	do
	{
		sms_index = '1';
		do
		{
		lungh = 0;						// read sms_index
		printf ((const far rom char *)"AT+CMGR=%c\r", sms_index);
// Read (sms_index) message
		Delay10KTCYx (50);					// response 500ms

		if	(strncmppgm2ram(inputstr, mystr_unr, 18 ) == 0) 
//Compare two strings, up to a specified number of characters.\r\n+CMGR: "REC UNRE
			{
				PORTCbits.RC0 = 1;			// LED ON
				putsUARTema2( inputstr );	// trasmetti stringa
				asm_txrs (0x07);			// \a bell
				memset( inputstr,0,242 );	// Cancella STRINGA/RAM
				PORTCbits.RC0 = 0;			// LED OFF

				lungh = 0;				// reset pointer
				printf ((const far rom char *)"AT+CMGD=%c\r", sms_index);
// Delete (sms_index) message
				Delay10KTCYx (100);		// wait 1sec					
			}

		if	(strncmppgm2ram(inputstr, mystr_rea, 18 ) == 0) 	
//Compare two strings, up to a specified number of characters.\r\n+CMGR: "REC READ
			{				// se READ allora cancella
				lungh = 0;		// reset pointer
				printf ((const far rom char *)"AT+CMGD=%c\r", sms_index);
// Delete (sms_index) message
				Delay10KTCYx (100);	// wait 1sec
				memset( inputstr,0,242 );	// Cancella STRINGA/RAM					
			}

		sms_index++;
		} while (sms_index < '9');

	if (check_net_loop ())				// if network loss...
		{
		_asm nop _endasm
		if (check_net_loop ())			// if network loss, print
			{
			_asm nop _endasm
			if (check_net_loop ())		// if network loss, print
				{
				_asm nop _endasm
				PORTCbits.RC0 = 1;		// LED ON
				putsUARTema2r( m_loss );// WARNING! Network LOSS
				PORTCbits.RC0 = 0;		// LED OFF
				_asm goto main_1 _endasm// if no network, loop
				}
			}
		}
		if (atd_index==20)	//200 about 20m
			{
//			lungh = 0;					// reset pointer
//			printf ((const far rom char *)"ATD+39335;\r");	
// Delete (sms_index) message
//			Delay10KTCYx (200);				// delay 2 sec
//			Delay10KTCYx (200);				// delay 2 sec
//			printf ((const far rom char *)"ATH\r");	// attacca!
//			atd_index = 0;						
// reset ATD index (about 20 minuti)

// OK funziona con AT+CLIR, fare routine che ogni volta che si riconnette al network
// fa anche at+clir? aspettando l'ok
// e comunque ogni mezzora un CLIR.

			lungh = 0;
			putrsUSART ((const far rom char *)"AT+CLIR?\r");// AT+CLIR
			Delay10KTCYx (200);						
			Delay10KTCYx (200);						
			Delay10KTCYx (200);						
			Delay10KTCYx (200);						
			Delay10KTCYx (200);						
			atd_index = 0;
			}
		atd_index++;
    }	while (1); //MAIN LOOP
}

// end

// +08 = GMT + 08* 15 minuti = 120 minuti = 2 ore = GMT +2


Il firmware completo lo trovate nella documentazione linkata a fine articolo.

Software di ricezione ed installazione

Guida all’installazione del Gateway SMS per utenti WINDOWS

* Procurarsi una SIM-CARD attiva.
* Eliminare la richiesta di codice identificativo personale (PIN) all’accensione, inserendo la SIM in un comune telefonino cellulare e, una volta inserito il PIN, disabilitarne la richiesta all’accensione.
* Inserire la SIM nella fessura posteriore del modulo GSM, posto nel retro di IperSMS, fino allo scatto del connettore a molla.

* Collegare il cavo seriale a 9 poli da una parte a IperSMS e dall’altra al PC in una porta seriale a 9 poli disponibile (es. COM1).

* Aprire, sul proprio PC, il programma Hyperterminal cliccando nel relativo link che potete trovare nel seguente percorso grafico :START/AVVIO->Tutti i programmi -> accessori -> comunicazioni -> Hyperterminal (Se nel vostro PC non è presente Hyperterminal dovete installarlo dal cd del Vostro sistema operativo Windows)

* Creare una nuova sessione chiamandola ad esempio IperSMS.

* Impostare la porta di comunicazione in base a dove si è connesso il cavo seriale (es. COM1) e poi configurare la porta impostata con i seguenti parametri: Bit per secondo: 9600; Bit di dati: 8; Parità: Nessuna; Bit di stop:1; Controllo di flusso: Nessuno;


* A questo punto si avvierà Hyperterminal. (Verificare la dicitura connesso e il timer in basso a sinistra)

* Alimentare IperSMS collegando l’adattatore di rete e verificare l’accensione del LED vicino al connettore di alimentazione.

* Verificare l’inizio della comunicazione tra IperSMS e Hyperterminal e la corretta installazione, verificando lo schermo del Vostro PC.

* Da questo momento potete ricevere automaticamente su Vostro PC gli SMS inviati al Vostro numero di SIM.

* Gli SMS verranno ricevuti in formato internazionale dal seguente significato:
+CMGR: “REC UNREAD” – Messaggio NON letto, finora)
“+39335XXXXXXX” – (Numero di telefono dal quale è stato inviato il messaggio, in formato internazionale +39 = Italia, quindi sappiamo anche da quale Paese)
“06/09/21,19:35:23+08″ – (ANNO/MESE/GIORNO,ORA:MINUTI:SECONDI+GMT+15MINUTI)
(L’orario è corretto solo se ci troviamo nello stesso fuso orario di invio dell’SMS, altrimenti dobbiamo effettuare l’adeguamento a GMT) (Il riferimento al Greenwich Main Time (GMT) è a passi di 15 minuti, nel caso dell’esempio quindi 08 x 15 = 120minuti = 2ore, infatti in Italia siamo un ora avanti rispetto a Londra e nel periodo dell’esempio siamo anche in ora legale)
OK – Fine del messaggio
Note generali:
Centro servizi
Alcuni operatori forniscono le SIM-CARD con il numero del Centro Servizi già memorizzato. In caso contrario inserire la SIM in un telefonino e programmare il numero del Centro Servizi (in caso di necessità rivolgersi al proprio operatore).
Copertura GSM
Il corretto funzionamento di IperSMS è subordinato alla qualità del segnale GSM presente nella zona di installazione.

Guida all’installazione del Gateway SMS per utenti Linux

* Inserire la SIM (dopo aver tolto il PIN) e collegare il cavetto seriale ad IperSMS, come meglio descritto in Installazione Windows.
* Installare (se non già presente sul Vs. PC) un programma di emulazione terminale, tipo Minicom. (Ad esempio, con Ubuntu, potete usare Synaptic).
* Una volta installato Minicom, aprite il Terminale di Ubuntu e digitate minicom -s per configurarlo
* Quindi configurate Minicom sulla COM1 (se avete collegato il cavetto seriale sul connettore PC della COM1) (COM1 equivale a /dev/ttyS0) e su 9600 8 N 1 come impostazioni, poi salvate con SAVE DFL ed uscite direttamente in Minicom.
In futuro, potrete connettervi semplicemente digitando minicom sul terminale di Ubuntu.
* Alimentare IperSMS collegando l’adattatore di rete e verificare l’accensione del LED vicino al connettore di alimentazione.
* Verificare l’inizio della comunicazione tra IperSMS e Minicom e la corretta installazione, verificando lo schermo del Vostro PC.
* Da questo momento potete ricevere automaticamente su Vostro PC gli SMS inviati al Vostro numero di SIM.
* Gli SMS verranno ricevuti in formato internazionale (vedi Installazione Windows per maggiorni informazioni)

 

Applicazioni GSM dove poter utilizzare IperSMS

* Radio private che hanno necessità di fare sondaggi con un budget limitato
Lanciare un sondaggio per radio e leggere gli sms in arrivo direttamente sul PC

* Televisioni locali che necessitano un riscontro da parte del pubblico in modo economico
Annunciare un quesito di gradimento e commentare in tempo reale gli sms arrivati sul PC

* TeleRadio-Vendite
Ricezione di ordinativi tramite sms

* Gestione economica di sms in entrata
I programmi di ricezione sono a costo zero

* Indici di gradimento tramite sms
Aziende che vogliono avere un riscontro da parte dei propri clienti

* Comunicazioni aziendali verso l’unità centrale
I collaboratorii esterni possono comunicare con la segreteria tramite sms

* Centralizzazione di sistemi remoti
Una centrale di controllo con operatore, puo gestire anche apparati remoti che segnalano allarmi

* Chiunque necessiti di ricevere sms in quantità
Centralizzazione di sms in economia

* Utilizzo si sistemi gratuiti per gestire gli sms arrivati
Sfruttando i vari sistemi di connessione remota specificati nell’IperSMS

Documentazione completa Open Source

Il progetto è stato sviluppato per ricevere gli SMS sul PC, ma con facili modifiche può essere utilizzato anche per inviare gli SMS da PC e può anche essere utilizzato per le applicazioni indicate sopra.

La documentazione completa è disponibile, in esclusiva per gli abbonati, a questo link: IperSMS.zip


Schema elettrico PDF e sorgente Orcad
Lista parti
Layout PDF e sorgente Orcad
File Gerber
Firmware sorgente C
File HEX

 

Quello che hai appena letto è un Articolo Premium reso disponibile affinché potessi valutare la qualità dei nostri contenuti!

 

Gli Articoli Tecnici Premium sono infatti riservati agli abbonati e vengono raccolti mensilmente nella nostra rivista digitale EOS-Book in PDF, ePub e mobi.
volantino eos-book1
Vorresti accedere a tutti gli altri Articoli Premium e fare il download degli EOS-Book? Allora valuta la possibilità di sottoscrivere un abbonamento a partire da € 2,95!
Scopri di più

18 Comments

  1. AntonioBlescia AntonioBlescia 13 giugno 2013
  2. Emanuele Emanuele 13 giugno 2013
  3. Petit_Fleur 13 giugno 2013
  4. Petit_Fleur 13 giugno 2013
  5. Piero Boccadoro Piero Boccadoro 14 giugno 2013
  6. alex272 alex272 14 giugno 2013
  7. Piero Boccadoro Piero Boccadoro 14 giugno 2013
  8. Petit_Fleur 14 giugno 2013
  9. IvanScordato Ivan Scordato 14 giugno 2013
  10. IvanScordato Ivan Scordato 14 giugno 2013
  11. Petit_Fleur 14 giugno 2013
  12. Piero Boccadoro Piero Boccadoro 14 giugno 2013
  13. Dadoo 14 giugno 2013
  14. Piero Boccadoro Piero Boccadoro 15 giugno 2013
  15. Emanuele Emanuele 22 giugno 2013
  16. zioenzo 26 giugno 2013
  17. Petit_Fleur 28 giugno 2013

Leave a Reply