Java e SMS

III parte: Comandi AT per il modemdi

In questo articolo approfondiremo le tematiche relative alla comunicazione con un modem GSM e vedremo come sia possibile inviare e ricevere dei messaggi utilizzando dei comandi AT. Analizzeremo in particolare i principali comandi AT che normalmente vengono utilizzati per scambiare informazioni con un modem GSM.

Aspetti generali

Nello scorso articolo abbiamo analizzato gli aspetti più importanti del protocollo UCP, che viene utilizzato per inviare e ricevere i messaggi da un centro servizi.
Nel primo articolo di questa serie, invece, abbiamo evidenziato come esista anche la possibilità  di inviare e ricevere short message tramite un modem GSM. In questo caso non si utilizza più il protocollo UCP ma si utilizzano i comandi AT che servono per inviare dei "comandi" al modem.
Come già  avevamo visto per il protocollo UCP, anche per i comandi AT la comunicazione con il modem è di tipo sincrono nel senso che viene inviato un comando  e poi si attende la risposta che ci informa sull‘esito del comando inviato.
Prima di addentrarci nell‘analisi dei principali comandi è opportuno avere a disposizione un modem GSM e che questo sia connesso al nostro PC. A tal fine possiamo utilizzare un qualsiasi telefonino GSM/GPRS che abbia anche un modem integrato. Per scambiare dati con il modem utilizzeremo l‘Hyper Terminal offerto da Windows.

Connessione

Il primo passo è quello di connettere il nostro modem ad una delle porte disponibili sul nostro PC, normalmente viene utilizzata una porta COM anche se è possibile utilizzare una connessione ad infrarossi o Bluetooth; in questo caso, però, è necessario creare una COM virtuale.
Nel resto di questo articolo si supporrà  che il modem sia connesso tramite una porta COM che sarà  la COM1, è semplice traslare quanto verrà  detto nel caso in cui la porta sia diversa.
Per prima cosa verifichiamo che il modem stia funzionando correttamente ed inviamo il comando:

AT

Il modem, se tutto funziona bene, dovrebbe rispondere con

OK

Struttura di un PDU per l‘invio di un SMS

Una volta che ci siamo assicurati che il modem funziona correttamente possiamo passare ad analizzare la procedura da utilizzare per inviare un SMS.
Lo scambio dei dati con un modem avviene tramite PDU (Pocket Data Unit) che contiene le informazioni relative al messaggio che intendiamo inviare. Come abbiamo già  visto per il protocollo UCP nello scorso articolo, ci sono dei campi che sono obbligatori e campi opzionali.
La struttura di un PDU per l‘invio di un messaggio è la seguente:

  • First Octect
  • SMS-Submit Message
  • Message Reference
  • Lunghezza del numero
  • Tipo di numero
  • Numero telefonico PID DCS (codifica del messaggio)
  • Periodo di validità 
  • User Data Length (lunghezza del corpo del messaggio)
  • User Data (corpo del messaggio)

Questi sono i parametri che compongono un PDU e che vengono utilizzati per l‘invio di un SMS. Per analizzare il significato di questi parametri utilizziamo un esempio.
Supponiamo di voler inviare un SMS ad un numero telefonico 00 e che il testo del nostro messaggio sia ciao.

In questo caso la stringa PDU è del tipo:

11 00 02 91 00 00 00 A7 04 E374F80D

Analizzando la stringa PDU notiamo che questa è composta da ottetti cioè caratteri da 8bit ciascuno, scendiamo ora più in dettaglio e capiamo il significato dei singoli ottetti.

 11: "First Octect SMS-Submit Message" e normalmente vengono impostati a questo valore
 00: Message Reference
 02: rappresenta la lunghezza  del numero telefonico successivo, in questo caso abbiamo supposto che il numero sia 00 quindi la lunghezza è 2
 91: rappresenta il formato del numero telefonico e sta ad indicare che il formato è internazionale
 00: è il nostro numero telefonico
 00: PID su cui non ci soffermeremo perchè il suo utilizzo va al di là  degli scopi di questo articolo
 00: è il DCS (Data Coding Schema) che è impostato a questo valore per indicare che l‘alfabeto utilizzato è il default alphabet (normalmente utilizzato per i messaggi di testo)
 A7: è il periodi di validità  del messaggio su cui non ci soffermeremo
 04: rappresenta la lunghezza del body (User Data) del messaggio che vogliamo inviare
 E374F80D: è il body del messaggio

E‘ da tener presente che alla stringa PDU va aggiunto all‘inizio la sequenza 00.

Codifica del testo

Un aspetto importante che non abbiamo ancora analizzato è come abbiamo ottenuto la codifica del messaggio ciao.
Utilizzando la tabella di codifica per il Default Alphabet otteniamo che


 c = 99    1100011
 i = 105   1101001
 a = 97   1100001
 o = 111   1101111

L‘obiettivo è di trasformare la rappresentazione in 7bit ad una ad 8bit cosଠche sia possibile inviarla tramite PDU.
La procedura è abbastanza semplice:

Passo 1

Il carattere c ha un valore in binario di 1100011 quindi sono 7bit, per arrivare ad 8bit abbiamo bisogno di un bit aggiuntivo che lo prendiamo dal bit meno significativo (cioè quello più a destra) della codifica del carattere successivo, cioè 1. A questo punto il bit prelevato diventa il bit più significativo cioè quello più a sinistra. Alla fine otteniamo che la nuova codifica a 8bit è 11100011 che in esadecimale è E3.


Passo 2

A questo punto passiamo al carattere successivo i la cui codifica binaria è 1101001 a cui però abbiamo tolto  1 cioè il bit meno significativo, quindi per arrivare a 8 bit ne aggiungiamo altri due dal carattere successivo (a) e li mettiamo all‘inizio. Quindi abbiamo 110100 a cui aggiungiamo 01 ed otteniamo 01  110100 Alla fine otteniamo 0x74. Procedendo in questo modo si ottiene la codifica voluta (E374F80D). In figura 1 è riportata una tabella che esemplifica quanto detto:

Figura 1 - Trasformazione di rappresentazione a 7 bit in rappresentazione a 8 bit


Invio del messaggio

Una volta compresa la struttura del PDU tramite i comandi AT inviamo il messaggio utilizzando ancora una volta l‘Hyper Terminal e digitiamo in sequenza le seguenti righe

 AT+CMGF=0 (informa il modem che il messagio è in formato PDU.)

 AT+CMGS=13 (dove 13 è la lunghezza del messaggio totale che vogliamo inviare)

il modem risponde con:

 >

e noi inviamo la stringa:

 0011000291000000A704E374F80D

Se tutto ha funzionato correttamente il messaggio verrà  inviato.

Ricezione di un messaggio

Supponiamo ora di ricevere il messaggio da un numero telefonico e vediamo le parti che lo compongono. Per prima cosa accediamo alla lista dei messaggi arrivati sul nostro telefonino tramite il comando:

AT+CMGL=4

il modem dovrebbe rispondere in questo modo:

+CMGL: x,0,yy 

dove x è un progressivo e yy indica la lunghezza del messaggio successivo

e poi la stringa PDU che contiene il messaggio vero e proprio:

07 91 933385285200 04 0C 91 93337308xxxx 00 00 60119290116140 04 E374F80D

Analizziamo ora le singole parti:

 07: rappresenta la lunghezza del numero del centro servizi (cioè 7 ottetti)

 91: rappresenta il formato del numero telefonico

 93338528825200: è il numero del centro servizi a cui vanno invertite le cifre per ottenere il numero reale che è 39 335 882282500

 04: rappresenta il first-octet

 0C: rappresenta la lunghezza del numero successivo

 91: è il formato del numero telefonico

 93337308xxxx: è il numero telefonico

 00: TP-PID

 00: TP-DCS

 60119290116140: TP-SCTS (semi-octets) a cui vanno invertite le cifre per ottenere la data esatta: 06/11/29 09:11:16 04

 04: è la lunghezza del body (UD) del messaggio

 E374F80D: è la codifica del messaggio

 
Conclusioni

In questo articolo abbiamo analizzato le basi dei comandi AT ed abbiamo visto come sia possibile inviare e ricevere SMS utilizzando dei semplici comandi. E‘ opportuno fare attenzione che alcuni produttori talvolta non si attengono completamente agli standard ed alcuni comandi possono cambiare leggermente anche se la logica di come inviare e ricevere messaggi rimane la stessa. Il modem utilizzato in questo articolo è il Siemens MC35i.

Riferimenti

[1] http://www.dreamfabric.com/sms/default_alphabet.html

Condividi

Pubblicato nel numero
113 dicembre 2006
Francesco Azzola, laureato in Ingegneria Elettronica, lavora da diversi anni nel campo dell‘IT. Dal 1998 si occupa dello sviluppo di applicazioni basate su tecnologie J2EE nel campo delle telecomunicazioni e in particolare nella progettazione di gateway SMS e di applicazioni per SIM Card.
Articoli nella stessa serie
Ti potrebbe interessare anche