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