Envoyer, gérer et recevoir des SMS avec la Raspberry Pi

Pourquoi avoir créé RaspiSMS ?

Chez Raspbian France nous avions besoin de pouvoir envoyer des SMS avec la Raspberry Pi, et quand nous avons cherché à le faire, nous n’avons pas trouvé un système qui nous convienne vraiment. Par conséquent, nous l’avons fabriqué, et nous vous le présentons aujourd’hui !

Nous voulions un système qui nous permette de créer facilement un SMS depuis n’importe quel PC, au travers d’une interface claire, mais aussi à travers une API. Nous voulions pouvoir choisir à quelle heure envoyer les SMS, et à qui, notamment via la création de contacts et de groupes de contacts.

Par conséquent, face à l’absence d’outil répondant à ces besoins, nous avons décidé de créer une application web sur mesure. Plutôt que de créer rapidement un système répondant seulement à nos besoins, nous avons décidé de créer un système complet, qui puisse se déployer sur toutes les Raspberry Pi, et de le distribuer en libre au plus grand nombre, sous licence GNU/GPL.

RaspiSMS c’est quoi ?

RaspiSMS, c’est un site web destiné à être installé sur une Raspberry Pi. Il vous permettra depuis n’importe quel ordinateur d’accéder à une interface d’administration propre. Depuis cette dernière, vous pourrez envoyer et recevoir des SMS.

RaspiSMS dispose également d’une API, qui vous permettra d’envoyer facilement un SMS depuis n’importe quel script, par exemple pour envoyer un code de confirmation à un utilisateur, prévenir une équipe lors de l’ajout d’un nouveau push git, ou encore pour vous prévenir par SMS lors de la détection d’un mouvement chez vous.

RaspiSMS permet également de lier des commandes à un script à faire exécuter par le serveur lors de la réception d’un SMS au format « [nom commande:arguments supplémentaires][email:email compte RaspiSMS à utiliser][password:mot de passe compte] ».
Vous pouvez trouver plus d’informations sur RaspiSMS sur sa documentation.

Installation de RaspiSMS.

Que faut-il pour envoyer un SMS ?

Au delà de RaspiSMS et de ses dépendances logicielles, pour envoyer un SMS avec vôtre Raspberry Pi il est important de préciser qu’il vous faudra, au niveau matériel, une carte SIM, et un dongle 3G/GSM.
Pour la carte SIM, nous utilisons une carte de chez Free, avec le forfait par 2€/mois. Vous pouvez même l’avoir pour 0€/mois si vous êtes chez Free. Cela marchera tout aussi bien avec une carte de n’importe quel autre opérateur. Il est à noter que certaines cartes demandent à être activées sur internet avant de pouvoir être utilisées. C’est par exemple le cas des cartes Free. Pensez-y.

Vous aurez bien entendu besoin d’une Raspberry Pi et de sa carte SD. Pour le module 3G/GSM, là c’est un peu plus complexe. Il faut que vous soyez sûr qu’il permet l’envoi de SMS, et qu’il soit géré par le logiciel Gammu.
Pour développer RaspiSMS, nous avons utilisé ce dongle 3G/GSM compatible avec la Raspberry PiIl ne nous a jamais posé de problème, et nous sommes sûrs qu’il fonctionne. Nous vous le recommandons donc.

Dernier point, les dongles 3G/GSM consommant un petit peu, assurez-vous d’avoir une bonne alimentation pour vôtre Raspberry Pi (au besoin, allez voir ici).

Installer RaspiSMS

Il existe deux façons d’installer RaspiSMS sur un système. Soit en utilisant le paquet Debian. Soit en utilisant l’archive « .tar.gz ».
Dans le cadre d’une installation sur une Raspberry Pi utilisant Raspbian, ou tout autre système utilisant une distribution dérivée de Debian, nous vous conseillons d’employer le paquet Debian. Cependant, pour une distribution de type RedHat par exemple, vous devriez plutôt employer l’archive.

Installation avec le paquet Debian

L’installation via le paquet Debian est très simple. Il suffit de deux commandes pour installer et configurer RaspiSMS.
Pour installer le paquet Debian, nous allons commencer par le télécharger. Pour cela, nous allons simplement utiliser la commande « wget ».

 wget -O raspisms.deb http://raspisms.raspbian-france.fr/download/raspisms-2.0.deb

Une fois le téléchargement terminé, on va mettre à jour la Raspberry Pi.

apt-get update
apt-get upgrade -y

Nous allons maintenant installer RaspiSMS. Cette première installation devrait lever une erreur (que nous corrigerons après), les dépendances n’étant pas installées.
À noter, avant d’installer RaspiSMS, vous avez intérêt à connecter votre dongle 3G/GMS, afin que Gammu et Gammu-smsd soient automatiquement réglés pour l’utiliser (sinon vous devrez vous reporter à la partie correspondante dans l’installation pour l’archive .tar.gz.).

dpkg -i raspisms.deb

Nous allons maintenant corriger les erreurs précédemment levées. Pour cela, nous allons utiliser la commande suivante :

aptitude install raspisms

Voilà, RaspiSMS est installé et configuré, et vous pouvez y accéder à l’adresse URL « http://<VOTRE_URL>/RaspiSMS/ ».

Cependant, je vous recommande vivement de le faire à la main en manuel car vous aurez plus de facilité à implanter votre interface sur vos machines existante ou sur une infra mutualisée.

Installation avec l’archive .tar.gz

L’installation via l’archive .tar.gz est plus complexe que celle par paquet Debian.
En effet, lors de l’installation par paquet Debian, une fois l’installation terminée, le système lance un script qui permet de configurer l’ensemble du système. Lors de l’installation via l’archive .tar.gz nous allons donc devoir effectuer l’ensemble de cette configuration nous même.
Dans un premier temps, nous allons mettre à jour la Raspberry Pi.

apt update
apt upgrade -y

La Raspberry Pi étant à jour, nous allons maintenant installer les dépendances de RaspiSMS.

apt install apache2 php php-mysql php-mbstring gammu gammu-smsd mysql-server

Maintenant que les dépendances de RaspiSMS sont installées, nous allons pouvoir les configurer.
Dans un premier temps, nous allons configurer Apache, pour activer le module de ré-écriture d’URL.
Pour cela, il suffit d’utiliser la commande suivante :

a2enmod rewrite
service apache2 restart

Il faut également activer les fichiers « .htaccess ».
Configurons maintenant Gammu et Gammu-smsd. Pour cela, vous devez au préalable avoir connecté votre dongle 3G/GSM.

Nous allons commencer par fixer l’UDEV de votre périphérique afin de ne pas avoir de soucis entre les reboots :

lsusb

On va maintenant créer une règle afin que notre périphérique porte toujours le même nom et donc plus facile pour la configuration gammu.

nano /etc/udev/rules.d/98-usb-serial.rules
SUBSYSTEM=="tty", ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1001", SYMLINK+="ModemUSB-3G"

Reporter les information ID comme ci-dessus et sauvegarder votre fichier.

Un reboot s’impose afin que notre règle soit prise en compte.

reboot

Nous allons dans un premier temps générer la configuration de Gammu et l’ajouter aux fichiers de configuration de Gammu et Gammu-smsd.

Créer ou compléter votre fichier gammurc

[gammu]
device = "votre device"
name = Téléphone sur le port USB 
connection = at

Créer ou compléter votre fichier gammu-smsdrc

# Configuration file for Gammu SMS Daemon


# Gammu library configuration, see gammurc(5)
[gammu]
device = "votre device"
name = Téléphone sur le port USB
connection = at

# Debugging
#logformat = textall

# SMSD configuration, see gammu-smsdrc(5)
[smsd]
service = files
logfile = syslog

# Increase for debugging information
debuglevel = 0

RunOnReceive = /home/raspisms/html/parseSMS.sh # a faire pointer vers votre installation

# Paths where messages are stored
inboxpath = /var/spool/gammu/inbox/
outboxpath = /var/spool/gammu/outbox/
sentsmspath = /var/spool/gammu/sent/
errorsmspath = /var/spool/gammu/error/

Si votre carte SIM utilise un code PIN, ajoutez également la ligne suivante au fichier « /etc/gammu-smsdrc »

 pin = VOTRE_CODE_PIN  # non obligatoire si vous avez supprimer le code pin de votre sim

On re-démarre le service gammu

/etc/init.d/gammu-smsd restart

Si vous avez des erreurs n’allez pas plus loin et trouvez d’où vient l’erreur

L’ensemble des dépendances de RaspiSMS maintenant installées, nous allons télécharger la dernière version de RaspiSMS sous forme d’archive.

wget https://raspisms.raspbian-france.fr/download/raspisms-2.0.1.tar.gz

Le téléchargement terminé, nous allons décompresser l’archive.

tar xzvf raspisms.tar.gz

Maintenant que l’archive est décompressée, nous allons déplacer l’ensemble de ces fichiers dans le dossier contenant les sites web.

Nous allons maintenant créer la base de données de RaspiSMS. Pour cela, nous allons utiliser le fichier « createDatabase.sql » de RaspiSMS, qui contient l’ensemble des requêtes permettant la création des bases. Il vous suffit donc de lancer la commande suivante et de rentrer le mot de passe root de MySQL.

mysql -u root -p < /dossier-RaspiSMS/createDatabase.sql

Ceci fait, nous allons également devoir créer un premier compte administrateur pour RaspiSMS, afin que nous puissions nous connecter. Pour cela, nous allons lancer la commande suivante :

mysql -u root -p -e "use raspisms;INSERT INTO users(email, password, admin) VALUES('<email_de_lutilisateur>', SHA1('<mot_de_passe_de_lutilisateur>'), 1)"

Nous allons maintenant configurer le fichier permettant à RaspiSMS de se connecter à la base de données. Il s’agit du fichier « /votrerépertoireracine/mvc/constants.php ».

Modifier les chemins afin qu’il corresponde avec votre installation

Modifier les identifiants de base de données

Nous avons donc maintenant un système RaspiSMS avec sa base de données configurée, les dépendances installées, il ne nous reste plus qu’à mettre en place les droits adaptés sur les fichiers.
Nous allons donc donner l’ensemble du dossier « /votrerépertoireracine/RaspiSMS » à l’utilisateur faisant tourner le serveur web (par défaut « www-data »), en donnant à tous le droit de lire et d’exécuter le contenu du dossier.

chown -R www-data:www-data /var/www/RaspiSMS
chmod -R 755 /var/www/RaspiSMS

Nous allons également donner le dossier « /votrerépertoireracine/RaspiSMS/receiveds » à l’utilisateur faisant tourner « gammu-smsd », à savoir « gammu ».

chown -R gammu:gammu /var/www/RaspiSMS/receiveds

Dernier point, nous devons dire au système de vérifier régulièrement s’il faut envoyer un SMS, ou enregistrer un SMS reçu. Pour cela, nous allons utiliser le démon « cron », qui permet de lancer de façon régulière une commande.

Nous allons donc ajouter deux lignes à la crontab. Cependant, il y a un point important, c’est que le programme doit-être appelé en tant que « root », et c’est donc la crontab de « root » que nous devons modifier.
Pour cela, vous devez donc exécuter la commande suivante pour ouvrir la crontab en édition

crontab -e

Puis y ajouter les deux lignes suivantes. (modifier les chemins en fonction de votre installation

 * * * * * cd /var/www/RaspiSMS && /var/www/RaspiSMS/console.php -c parseReceivedSMS
 * * * * * cd /var/www/RaspiSMS && /var/www/RaspiSMS/console.php -c sendScheduleds

Allez encore un dernière modification, changer le chemin de la dernière ligne dans ce fichier : /votrerépertoireracine/parseSMS.sh en fonction de votre installation:

#!/bin/sh
date=$(date +%Y%m%d%H%M%S%N)
first_time=1
for i in `seq $SMS_MESSAGES` ; do
        eval "sms_number=\"\${SMS_${i}_NUMBER}\""
        eval "sms_text=\"\${SMS_${i}_TEXT}\""
        if [ $first_time -eq 1 ]
        then
                sms="$sms_number:"
                first_time=0
        fi
        sms="$sms$sms_text"
done
echo "$sms" >> /votrechemindinstallation/receiveds/"$date".txt

Allez, on va vérifier le nom de votre fichier “.to-keep” dans le dossier /votrerépertoireracine/receiveds/

ls receiveds/ -al
ls receiveds/ -al

il reste encore un bug dans le fichier : /votrerépertoireracine/controllers/internalConsole.php, ligne 207 et on va faire une modification :

  /**
                 * Cette fonction reçoit un SMS, et l'enregistre, en essayant de trouver une commande au passage.
                 */
                public function parseReceivedSMS()
                {
                        //On créer l'objet de base de données
                        global $db;

                        for ($i = 0; $i < 30; $i++)
                        {
                                foreach (scandir(PWD_RECEIVEDS) as $dir)
                                {
                                        //Si le fichier est un fichier système, on passe à l'itération suivante
                                        // if ($dir == '.' || $dir == '..') // originale 
                                        if ($dir == '.' || $dir == '..' || $dir == '.to-keep') // modifié avec la bonne syntaxe de votre nom de fichier tokeep ou to-keep
                                        {
                                                continue;
                                        }

                                        echo "Analyse du SMS " . $dir . "\n";

Voilà, l’installation est terminée, et vous pouvez désormais accéder à RaspiSMS à l’adresse URL « http://<VOTRE_URL>/RaspiSMS/ ».

Conclusion

Vous avez maintenant un superbe système vous permettant d’envoyer des SMS depuis votre Raspberry Pi, d’en recevoir, et même de commander à distance votre Raspberry Pi sans avoir besoin d’internet.
Vous pouvez l’utiliser pour votre tout nouveau projet, ou simplement pour envoyer un SMS à vos amis quand vous êtes en Dordogne (qui rappelons-le est un des rares départements français ayant déjà généralisé la couverture internet, mais toujours pas la couverture réseau).

Nous espérons que RaspiSMS vous sera utile. N’hésitez pas à nous faire des remarques, des propositions, ou à parler de RaspiSMS (et pourquoi pas de Raspbian France;)) autour de vous.

 

Source