Transformer un Raspberry Pi en serveur SMS

Récemment, j’ai enfin terminé un projet qui peut être pratique : un serveur SMS à base de Raspberry Pi. L’intérêt ? M’envoyer des alertes à base de SMS en cas de soucis avec mon NAS.

Le projet

L’idée de base consiste à installer un serveur capable d’envoyer des SMS depuis mon NAS Synology quand il détecte des mouvements depuis mes caméras de surveillance. Donc, en simplifiant, un Raspberry Pi avec un modem cellulaire, un abonnement pas trop cher, et un logiciel compatible le NAS. Cette partie là ne pose pas de soucis dans l’absolu (même si ça demande un peu de manipulations). Ce qui est plus gênant pour le moment, c’est que mon installation manque très clairement de fiabilité en cas de soucis. Premier point, je capte mal chez moi. J’espérais qu’un modem dédié donne un meilleur résultat qu’un téléphone, mais ce n’est pas tellement le cas. Pour mes autres appareils, j’utilise un femtocell, mais la contrainte suivante rend son usage caduque. Mon second problème vient de la résistance aux coupures de courant. Actuellement, mon NAS n’est pas sur un onduleur pour une raison simple : son bruit me gêne et l’onduleur est dans mon bureau. Du coup, le NAS se trouve dans une autre pièce. A l’origine, je comptais mettre le Raspberry Pi sur batterie (l’onduleur du pauvre) mais sur un Raspberry Pi 3, ça ne fonctionne pas comme prévu : quand je place ma batterie entre le secteur et le Raspberry, couper le courant redémarre la carte, visiblement la batterie a un délai au moment de passer de son alimentation à la batterie. Et le problème du femtocell intervient : sans énergie, le modem capte mal étant donné que le femtocell ne fonctionne plus. Enfin, même en réglant ce souci, le NAS et le Raspberry Pi doivent pouvoir communiquer sans énergie, ce qui implique une connexion directe (par exemple sur la seconde interface du NAS) mais rend la gestion du Raspberry Pi beaucoup plus compliquée. Pour le moment, j’ai donc une solution fonctionnelle dans l’absolu, mais qui résiste mal à un truc idiot comme une coupure de courant. Dans l’idéal, il faudrait protéger la connexion à Internet, le Raspberry Pi, les caméras, le NAS et le femtocell, ce qui est irréalisable dans mon cas. Enfin, un dernier souci intervient : le choix du forfait. Beaucoup ne permettent tout simplement pas ce type de choses – il ne s’agit d’un usage en bon père de familles – et les désactivations de forfaits ne sont pas rares pour ceux qui abusent.

Vu qu’on me l’a indiqué plusieurs fois, je sais parfaitement que Free propose un service compatible avec les NAS. Il suffit d’avoir un forfait (même à 0 €) et il est possible de configurer une adresse précise pour le NAS. Mais le problème reste le même : en cas de coupure de la connexion à Internet, le service ne fonctionne pas (et il faut évidemment être abonné chez Free).

Le problème du modem

A la base, je comptais juste utiliser un vieux téléphone avec un adaptateur série pour envoyer les SMS, ce qui est parfaitement suffisant. Mais j’ai abandonné : mes vieux téléphones amènent trop de contraintes. La principale vient du fait qu’il est compliqué de connecter certains modèles et de les charger en même temps, sans même prendre en compte l’obligation de disposer de deux prises. Je me suis donc tourné avec un modem 3G, un ZTE MF190. De la taille d’une clé USB il fait aussi office de lecteur de cartes microSD (aucun intérêt) et a l’avantage d’être reconnu nativement sous Linux. Mais il n’est pas simple à installer, pour une raison idiote : par défaut, il s’authetifie comme un lecteur de CD-ROM virtuel contenant les pilotes. Il existe différentes méthodes pour le forcer en mode modem par défaut, j’ai décidé de le faire directement dans le modem lui-même.

Mon modem 3G sur un Raspberry Pi 3

Première étape, brancher le modem et vérifier comment il s’identifie avec la commande lsusb. Dans mon cas, avec l’ID suivant : 19d2:0083. Une fois la valeur notée, je l’ai éjecté logiciellement pour forcer le mode modem. Sur un PC, la commande est peut-être eject /dev/sr1.

sudo apt-get install eject
eject /dev/sr0

Normalement, après quelques secondes, il va s’identifier comme un modem, avec un autre ID (19d2:0124). Sans le débrancher, il faut ensuite se connecter dessus avec minicom et taper deux commandes AT pour forcer le mode modem en permanence. Attention, du coup, le modem n’affichera plus ses pilotes sur une machine Windows/Mac OS X. Le modem montre plusieurs interfaces série, mais seule la dernière (/dev/ttyUSB4) fonctionne.

sudo apt-get install minicom
sudo minicom -D /dev/ttyUSB4

Une fois dans minicom, pressez ctrl + A pour les menus, et E pour afficher le retour. Ensuite, entrez les commandes suivantes (normalement suivies d’une réponse du modem).

AT+ZOPRT=5
AT+ZCDRUN=8

Pour quitter, il faut faire ctrl + A puis X. Normalement, le modem passera ensuite directement en mode modem, testez en le branchant et le rebranchant puis en vérifiant l’ID avec lsusb.

Dernière étape avant de tester l’envoi de SMS, pensez à désactiver le code PIN sur un téléphone, ça simplifie grandement les choses.

L’envoi de SMS

J’ai utilisé le tutorial de ce site, suffisant pour mon usage. Il suffit d’installer un programme qui s’appelle Gammu, qui permet de gérer les SMS.

apt-get install gammu
apt-get install gammu-smsd

Une fois installé, il faut juste effectuer quelques réglages.

sudo nano /etc/gammu-smsdrc

Dans le fichier, il faut définir le port et la vitesse, dans mon cas avec les paramètres suivants.

port = /dev/ttyUSB4
connection = at19200

Ensuite, il faut lancer le service (service gammu-smsd start) et vérifier que les SMS partent. TEXT indique le type de message, suivi du numéro (je préfère la notation complète) et du texte. Attention, ne dépassez pas 160 caractères.

sudo gammu-smsd-inject TEXT 0033612345678 -text "Hello World"

Normalement, ça va fonctionner. La commande peut indiquer un message sur l’absence de code PIN dans la configuration, mais ce n’est pas important si vous avez désactivé le code avant.

Le serveur Web

Ca reste assez sale et basique, mais ça fonctionne. Une simple page PHP qui appelle le script.

sudo apt-get install lighttpd
sudo apt-get install php5-common php5-cgi php5
sudo lighty-enable-mod fastcgi-php
sudo service lighttpd force-reload

cd /var/www/html
sudo nano sendsms.php

Le contenu appelle juste le script avec deux paramètres.

<?php
$numero = $_GET['numero'];
$texte = $_GET['texte'];
echo `sudo gammu-smsd-inject TEXT '$numero' -text '$texte'`;
?>

Une fois le code sauvé, une petite modification s’impose pour permettre au script de se lancer.

sudo nano /etc/sudoers

Il faut ajouter cette ligne à la fin du fichier.

www-data ALL=(ALL) NOPASSWD: /usr/bin/gammu-smsd-inject

Pour des questions pratiques, je vous conseilles de fixer l’IP du Raspberry Pi (ou de mettre un DNS maison pour ça). Ensuite, l’URL à utiliser ressemble à ça.

http://IP_DU_PI/sendsms.php?numero=0033612345678&texte=hello+word

Je vous conseille de redémarrer et de vérifier que ça fonctionne avant de passer à la dernière étape.

Sur le NAS

Sur le NAS, il faut se rendre dans le Panneau de configuration, dans les Notifications. Un onglet permet de gérer les alertes par SMS. Il faut l’activer, et ensuite Ajouter un fournisseur de services SMS. Choisissez un nom, ensuite une URL. L’URL doit contenir le message « Hello World », un numéro de téléphone ainsi qu’un utilisateur et un mot de passe. J’ai triché, en mettant n’importe quoi.

http://192.168.1.23/sendsms.php?numero=0033612345678&texte=hello+world&login=moi&pass=toto

L’ajout de serveurs SMS

La page suivante détecte les paramètres et demande de les vérifier.

L’adresse (avec une erreur dans la capture)


Les paramètres

Enfin, il suffit de mettre les bons paramètres (login et mot de passe, ce que vous voulez) et un numéro (n’oubliez pas le +), avant de tester.

Le résultat

C’est terminé, les notifications peuvent être utilisées (par exemple dans Surveillance Station). Bon, il existe pas mal d’améliorations possibles, comme la réception de messages, la sauvegarde des messages, l’authentification réelle, l’usage de SMS flash, etc. Mais je vous laisse chercher si le sujet vous intéresse.

Les messages arrivent