Dans cet article, je vais vous expliquer comment installer Gammu sur un Rasperry Pi par exemple. Gammu permet d’envoyer des SMS depuis un Raspberry, un PC sur lequel est tourne une plateforme Linux ou même Windows. Gammu vous permettra de transformer votre Rasperry en passerrelle SMS ou gateway SMS. Il faut bien entendu acheter une clé 3G compatible. J’ai acheté la clé suivante : Huawei E169 disponible sur Amazon ou sur Aliexpress
Il est possible aussi d’installer le deamon de gammu, afin de recevoir des SMS, et de lancer un script à chaque reception d’un message.
Le tuto qui suit permet donc de déployer l’outil sur une distribution Raspbian
INSTALLER GAMMU
Vérifier si la clé est bien détectée par le système et compatible
dmesg | grep tty | grep usb
[ 5806.660785] usb 1-1.5: GSM modem (1-port) converter now attached to ttyUSB0
[ 5806.662796] usb 1-1.5: GSM modem (1-port) converter now attached to ttyUSB1
[ 5806.664577] usb 1-1.5: GSM modem (1-port) converter now attached to ttyUSB2
lsusb | grep -i Huawei
Bus 001 Device 009: ID 12d1:1001 Huawei Technologies Co., Ltd. E169/E620/E800 HSDPA Modem
Mettre à jour le système
sudo apt-get update
sudo apt-get upgrade
Installer gammu
sudo apt-get install gammu
Détecter la configuration de gammu
Récupérer la configuration affichée à l’écran pour la mettre dans le fichier /etc/gammurc
Voici le contenu final de mon fichier :
[gammu]
device = /dev/ttyUSB0
connection = at19200
name = Phone on USB serial port ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ HUAWEI_Mobile
synchronizetime = yes
gammucoding = utf8
[gammu1]
device = /dev/ttyUSB1
connection = at19200
name = Phone on USB serial port ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ HUAWEI_Mobile
synchronizetime = yes
gammucoding = utf8
[gammu2]
device = /dev/ttyUSB2
connection = at19200
name = Phone on USB serial port ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ HUAWEI_Mobile
synchronizetime = yes
gammucoding = utf8
Vous pouvez vérifier les caractéristiques de la clé 3g avec la commande suivante:
gammu --identify
Périphérique : /dev/ttyUSB0
Fabricant : Huawei
Modèle : E169 (E169)
Firmware : 11.314.13.51.156
IMEI : 352835031664512
Si un code PIN est activé
gammu getsecuritystatus
Waiting for PIN.
gammu entersecuritycode PIN 1234
gammu getsecuritystatus
Nothing to enter.
L’envoi de SMS se fait via l’une des deux commandes suivantes :
gammu sendsms TEXT 06xxxxxxxx -text "Test tutoandco"
echo "Test tutoandco" | gammu --sendsms TEXT 06XXXXXX
En réponse voici ce que la console affiche
If you want break, press Ctrl+C...
Sending SMS 1/1....waiting for network answer..OK, message reference=1
ENVOYER UN MESSAGE DEPUIS UN SCRIPT PHP
J’utilise un script PHP pour envoyer des SMS depuis le web. Il se peut que vous rencontrez des soucis de droit lors de l’appel via un exec. Il faut que l’utilisateur apache puisse avoir accès à /dev/ttyUSB0 Il faut rajouter l’utilisateur www-data au groupe dialout
sudo usermod -a -G dialout www-data
Il faut ensuite autoriser www-data à executer gammu :
sudo chmod 4755 /usr/bin/gammu
J’ai du ensuite modifier le fichier /etc/apache2/conf-enabled/charset.conf d’Apache pour résoudre mes problème d’encodage afin de décommenter la ligne suivante AddDefaultCharset UTF–8
Voici mon script php, j’ai fait un truc très simple, il suffira de l’appeler de cette façon :
http://monsite/script.php?message=mon%20message%20de%20test&number=0000000000&token=azerty
J’ai rajouté un token de sécurité pour ne pas recevoir des messages indésirables.
<?php
$locale = 'fr_FR.utf-8';
setlocale(LC_ALL, $locale);
putenv('LC_ALL='.$locale);
header("X-Robots-Tag: noindex, nofollow", true);
$token = (string)$_GET['token'];
$data = array();
if (!$token || $token != 'azerty') {
$data = array(
'error' => "Not authorised",
'error_code' => 403,
'error_description' => "Not authorised",
'resource' => null
);
echo json_encode($data);
header('HTTP/1.0 403 Forbidden');
exit;
}
$message = urldecode((string)$_GET['message']);
$number = (string)$_GET['number'];
$number_array = explode('-', $number);
if (!$message || !$number_array) {
$data = array(
'error' => "Missing data",
'error_code' => 403,
'error_description' => "Missing data",
'resource' => null
);
echo json_encode($data);
header('HTTP/1.0 403 Forbidden');
exit;
}
foreach ($number_array as $number) {
exec('echo "'.$message.'" | gammu --sendsms TEXT '.$number.' &');
}
Si malgré tout, vous avez encore des soucis d’encodage de vos SMS, il faut alors changer le « Locale » du Raspberry, tout est expliqué
ici
INSTALLER LE DAEMON GAMMU
Suite à une investigation et aux commentaires, je me suis aperçu que la mise en place du daemon permettait de résoudre deux problème :
- Il n’est plus nécessaire de renseigner le code PIN à chaque reboot du serveur
- Il est possible d’envoyer des SMS à la chaîne sans perte.
Il est également intéressant à installer si vous souhaiter par exemple jouer un script à la réception de nouveaux messages.
sudo apt-get install gammu-smsd
Il faut ensuite compléter le fichier /etc/gammu-smsdrc avec la conf du fichier /etc/gammurc puis relancer le service
sudo service gammu-smsd restart
OPTIONS DU DAEMON GAMMU
Quelques spécificités concernant ce fichier. Il y a un nouveau « bloc » [smsd], qui contient la configuration du daemon de Gammu. Vous avez la possibilité de renseigner votre code PIN
Vous pouvez aussi choisir la manière dont sont stockés les messages. Par défaut ils sont sauvegardés dans des fichiers dans le dossier /var/spool/gammu
Le dossier /var/spool/gammu appartient à root, tandis que l’ensemble des sous dossiers a pour propriétaire gammu, pour envoyer vos messages via votre site web il faut changer les droits du dossier.
sudo chmod 777 -R /var/spool/gammu
J’ai également ajouter cette variable. C’est le temps à attendre avant de nouveau vérifier s’il y a des nouveaux messages à envoyer. par défaut cette variable vaut 30.
ENVOI DE SMS
Il se fait via l’une des deux commandes suivantes :
gammu-smsd-inject TEXT 06XXXXXXXX -text "Test tutoandco"
ou
echo "Test tutoandco" | gammu-smsd-inject TEXT 06XXXXXX
Vous trouverez l’ensemble des options pour envoyer des messages sur le site de Gammu
FICHIERS DE CONFIGURATION
gammu-smsdrc et gammurc
Sources