In questo articolo approfondiremo le tematiche relative alla comunicazione con un modem GSM e vedremo come sia possibile utilizzando dei comandi AT inviare e ricevere dei messaggi. 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 (Packet 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 periodo 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

È 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).

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

Invio del messaggio

Una volta compreso 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 messaggio è 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