« Précédent Suivant »

Interface GSM sur carte Fox et envoi de SMS

Le 08/05/2009 à 10:42

Carte Fox

J'ai été amené à travailler dans le cadre de mes études sur un petit projet de développement d'une Interface GSM sur un système Linux embarqué. Ayant découvert la puissance du système, j'ai pensé vous faire part de mes découvertes sur l'utilisation de cette carte. Dans mon cas le principe était de créer un système autonome d'envoi de SMS aux étudiants de mon école. L'idée étant de pouvoir envoyer les résultats des examens directement par SMS aux étudiants, ce qui est ma foi fort sympatique :)

Le Matériel

Alors, tout d'abord : Carte FOX Késako !? Il s'agit d'un système embarqué à bas coût utilisant le système d'exploitation Linux. La carte est dotée d'un processeur AXIS à 100MHz et de 32 MB de RAM, de connectiques USB, Ethernet, d'un port série console ainsi que 40 pins pouvant être reliées à plusieurs BUS de données. Elle permet de développer en bon nombre de langages : C, C++, PHP, PYTHON, Shell, ... et permet des connections HTTP, FTP, SSH et TELNET. De petite taille et faible consommation électrique (1 W) est idéale pour mettre en place rapidement des projets de type embarqué.

Modem GSM

Modem GSM

Le modem GSM utilisé ici est un modem de la marque Telit. Il est relié à la carte FOX par l'intermédiaire d'une carte d'extension. La carte FOX peut communiquer avec le modem par l'intermédiaire du port série /dev/ttyS2. Une simple utilisation de carte SIM classique permet de se connecter au réseau GSM. Il est possible de trouver cette carte seule sur le site d'ACME SYSTEMS à 176 € frais de port tout compris. Si l'on ajoute le kit GPRS cela monte jusqu'à 626 €, ce qui commence déjà à faire beaucoup. Je pense qu'une solution plus abordable serait de relier la carte basique à un téléphone portable pour communiquer en série étant donné que dans notre cas nous n'avons pas besoin de tous les éléments de la carte d'extension. Les modems GSM utilisent un protocole de commandes appelées "commandes AT". Chaque constructeur fait un peu ce qu'il veut avec ses normes, ce qui fait que chaque modem est plus ou moins différent et qu'il faut se référer à la doc du constructeur. Ces commandes AT sont donc envoyées via le port série pour soumettre différentes commandes au modem. On peut notamment dans notre cas manipuler et envoyer des SMS par l'intermédiaire de celles-ci.

Environnement de développement

La compilation d'un programme en C sur la carte fox nécessite un compilateur croisé permettant de compiler le code C pour les processeurs AXIS. La compilation directe sur la carte n'étant pas possible, il faut par conséquent utiliser un SDK pour compiler le programme. J'ai travaillé avec le SDK Axis fourni pour la carte fox.

Avant toute chose il faut se rendre dans le dossier du SDK (\~/devboard-R2_01 pour ma part) et y taper la commande suivante afin d'initialiser l'environnement de développement.

. init_env

Ensuite, il faut choisir le compilateur AXIS

make cris-axis-linux-gnu

On doit alors créer un Makefile pour notre programme. Voici celui que j'ai créé :

AXIS_USABLE_LIBS=UCLIBC GLIBC
include $(AXIS_TOP_DIR)/tools/build/Rules.axis
PROGS = sms
INSTDIR= $(prefix)/mnt/flash
INSTMODE= 0755
INSTOWNER= root
INSTGROUP= root
OBJS = main.o atcommand.o modem.o
all: $(PROGS)
$(PROGS): $(OBJS)
$(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@
scp sms root@fox01:/mnt/flash/tx
clean:
rm -f *.o
rm -f sms

Il n'y a alors plus qu'à faire un make pour compiler le programme et à l'envoyer sur la carte en FTP ou SCP. Ayant dû compiler à de très nombreuses reprises mon programme, j'ai rajouté l'envoi du fichier dans le makefile via la commande scp. Les fichiers utilisateurs sont déposés sur la carte Flash dans le répertoire /mnt/flash. Attention toutefois, car la mémoire flash EPROM est limitée en nombre d'écritures. Il vaut mieux tant que possible éviter d'écrire dans cette mémoire régulièrement. Privilégier la RAM (dossier /var par exemple) plutôt que sur la carte flash. Seul soucis, la carte se réinitialise à chaque redémarrage, par conséquent les tests peuvent être faits en RAM et une fois que l'application compilée est stable il est préférable de la déposer sur la carte flash afin de ne pas perdre le programme à chaque reboot.

La connexion à la carte fox se fait en telnet (ou ssh) simplement à l'aide de la commande suivante grâce à un simple telnet

telnet adresse_ip_de_la_fox

Développement du programme

Utilisation des commandes AT

Le modem se commande directement grâce aux commandes AT. Ces commandes AT suivent une certaine syntaxe et nécessitent une mise en forme particulière pour leur envoi sur le modem. Ce dernier reconnaît plusieurs caractères de contrôle :

<CR> : Caractère de retour chariot : Sa valeur ASCII en décimal est fixée à 13 par défaut. (et peut être changée grâce au paramètre AT S3) Sa valeur hexadécimale quant à elle est 0x0D.

<LF> : Caractère d'interligne : Sa valeur ASCII en décimal est fixée à 10 par défaut

<CTRL+Z> : Combinaison des touches CTRL et Z. Sa valeur hexa est 0x1A

Ces caractères sont demandés et utilisés par le modem pour identifier les commandes AT. Chacune d'entre-elles utilise ces caractères de contrôle plus ou moins différemment. Voici un aperçu des différentes commandes que j'ai utilisées avec leurs caractères de contrôle.

ATE0<CR> : Cette commande permet de désactiver la commande écho (ATE1 la réactive). Cela demande donc au modem de ne pas répéter systématiquement les commandes qui lui sont envoyées.

AT+CMGF=1<CR> : Cette commande permet de régler le format de message pour l'envoi de SMS. Par défaut, le modem est en mode PDU (AT+CMGF=0). C'est-à-dire que l'envoi de message se fait en hexadécimal. AT+CMGF=1 permet de passer en mode texte, ce qui simplifie les manipulations de SMS.

AT+CMGS="06XXXXXXXX"<CR> : Cette commande permet de commencer la rédaction d'un SMS. On précise en argument le numéro de téléphone choisi. En retour on obtient le caractère d'invite de commande « > » qui nous invite à rentrer le texte du SMS.

Texte du SMS<CTRL+Z><CR> : Cette fin de commande permet alors de préciser le texte et de valider l'envoi du SMS par un CTRL+Z et un retour chariot.

Il est important de noter que l'envoi de la commande AT d'envoi de SMS se fait en 2 parties et pas en un coup. (j'ai testé pendant plusieurs semaines... ça ne marche pas ^^)

Le modem répond à ces commandes par des messages de retour. Ces derniers indiquent si celles-ci ont été exécutées avec succès ou non. La plupart de ces réponses sont entourées des caractères <CR><LF> Il y a toutefois des exceptions, notamment pour AT+CMGS qui renvoie +CMGS: <mr> ou +CMS ERROR: <err> Mais dans la plupart des cas les retours sont rapportés de la manière suivante :

<CR><LF>OK<CR><LF>
<CR><LF>ERROR<CR><LF>
<CR><LF>...<CR><LF>

Ces commandes AT doivent être transmises au modem par le port série /dev/ttyS2. Il existe plusieurs façons de communiquer sur le port série :

Termnetd (http://foxlx.acmesystems.it/?id=69)

Il s'agit d'un processus permettant de relier un port TCP/IP à un port série de manière transparente. Une fois que le deamon est lancé sur la carte fox, il est possible de se connecter depuis l'extérieur grâce à la commande telnet adress_ip_fox 7000. Le port 7000 (choisi dans la config de termnetd) redirige directement sur le port série et il est alors possible de rentrer manuellement des commandes AT et de voir leur comportement direct sur le modem. Ce programme est utile pour comprendre le fonctionnement des commandes AT.

Script Chat (http://linux.about.com/od/commands/l/blcmdl8_chat.htm) Il est possible d'utiliser la commande UNIX chat permettant de dialoguer de manière automatisée avec le modem.

/usr/sbin/chat -V -s -f  > /dev/ttyS2 < /dev/ttyS2 2>

La réponse du modem est alors enregistrée dans le fichier de résultat choisi.

Programme en C Il est également possible de dialoguer avec le modem via un programme C. Le dialogue se fait alors en écrivant et en lisant sur /dev/ttyS2. La prise en main est beaucoup plus complexe que les 2 précédentes méthodes, mais permet une totale maitrise du modem.

Développement en C

Le code pour envoyer un SMS n'est pas bien compliqué, mon but n'est pas là de copier/coller intégralement mon code, mais plutôt d'expliquer les grandes lignes son fonctionnement et de vous donner envie de bidouiller une carte fox \^\^

L'idée est donc d'initialiser tout d'abord la connexion série à l'aide de Termios. La documentation sur le site du constructeur regorge d'informations et propose du code tout fait pour gérer la connexion série. Une fois la configuration réalisée (c'est très rapide à réaliser), il n'y a plus qu'à faire un write sur /dev/ttyS2

char command1[50];
char command2[50];
sprintf(command1, "AT+CMGS="%s"x0D", number);
sprintf(command2, "%sx1Ax0D", text);
write (tty_fd, command1, strlen(command1));
sleep(1); // attend la réponse du modem afin d'envoyer la seconde partie
write(tty_fd,command2,strlen(command2));

Et le SMS est envoyé ! Après libre à vous de rajouter à la suite une lecture de la réponse du modem (gentil petit read). Dès lors il est possible de se faire une petite fonction d'envoi de SMS à partir d'arguments tels que le numéro de téléphone et le texte du message. J'en ai profité pour me rajouter un système de logs et de manipulation du modem (redémarrage, arrêt). Je me suis créé une interface web en bash (scripts cgi) et par simples appels de notre programme C il est alors possible de se construire une application métier complexe. On a plus qu'à brancher notre carte fox sur le réseau et celle-ci peut envoyer des SMS à distance de manière assistée grâce à des formulaires web !

Préparation de la carte FOX

Dernier point de précision: au démarrage, le modem n'est pas allumé ni configuré. Il faut par conséquent créer un script de démarrage à déposer dans /etc/init.d/boottime . Voici le script que j'ai utilisé:

#!/bin/sh
# démarrage du modem
setbits -p b -b 7 -s 1
# Lancement de termnetd (pour les tests)
/mnt/flash/termnetd
# Initialisation série du modem (mon petit programme d'initialisation de la connexion série)
/mnt/flash/tx/sms -init
sleep 20
# Initialisation AT du modem
/usr/sbin/chat -V -s -f /mnt/flash/tx/scripts/scriptAT.chat >
/dev/ttyS2 < /dev/ttyS2 2> /mnt/flash/tx/scripts/scriptAT_result.txt
# Ecriture des logs (pour le fun ^^)
echo “`date` : MODEM start” >> /mnt/flash/tx/log/fox.log

On commence par allumer le modem, on initialise la connexion série avec le programme en C puis attend 20 secondes que le modem soit identifié sur le réseau. Le temps choisi est totalement arbitraire. Cela semble fonctionner correctement avec cette période, mais idéalement il serait intéressant d'interroger le modem pour déterminer s'il est bien connecté au réseau. Ensuite on exécute un script chat que voici :

ABORT BUSY
ABORT 'NO CARRIER'
ABORT ERROR
'' AT
OK ATZ
OK 'ATE0'
OK 'AT+CMGF=1'
OK ''

Ce dernier permet de désactiver l'écho afin de ne pas recevoir mes commandes en double, et permet d'activer le mode texte pour l'envoi de SMS. Par défaut l'envoi de SMS se fait en mode PDU (sous forme hexadécimale), ce qui est bien plus compliqué à utiliser. Une fois ce script exécuté, le modem est prêt à être utilisé. On peut rajouter un log à la fin pour identifier le démarrage du modem.

La carte fox est une carte embarqué assez simple à prendre en main, les utilisations sont assez illimités. Le rêve de tout bidouilleur ! Je songe à m'en commander une très bientôt, je ne peux pas résister à tant de potentiel de bidouille.

A suivre : Comment connecter la carte fox au réseau GPRS pour pouvoir aller sur le net et envoyer des mail :)

« Précédent Suivant »
Commentaires
blog comments powered by Disqus