X

Installer Gammu et Gammu-smsd pour envoyer des SMS depuis un Raspberry

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

gammu-detect

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

PIN = xxxxxx

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.

CommTimeout=5

Vous trouverez l’ensemble des variables configurables sur cette page SMSD configuration File

Envoi de SMS

Il se fait via l’une des deux commandes suivantes :

 gammu-smsd-inject TEXT 06XXXXXXXX -text "Test tutoandco"
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

Vous trouverez les fichiers de configuration que j’utilise sur mon Github


Cet article a été modifié le 7 juin 2020 09:57

Voir les commentaires (0)

  • Bonjour, tutoriel très utile mais je ne parviens pas à envoyer de sms. Lorsque j'essaie d'en envoyer un, il me dit "Impossible d'obtenir le numéro smsc depuis le téléphone." Que faire ??

    • Dans la conf du fichier gammu-smsd, pour le démon de gammu, tu peux rajouter une ligne:
      SMSC = xxxxxxxxxx
      Tu devrais pouvoir l'obtenir en lançant la commande suivante : gammu getsmsc

  • De rien !
    C'est cool quand tu suis un tuto et ça marche.
    Si tu as un article de prêt, oui je veux bien en savoir plus sur RunOnReceive !
    De mon coté, je vais aussi coder un script pour la reception.

    Merci
    Olivier

  • Bonsoir !
    Après avoir regardé et testé beaucoup de tuto, celui-ci marche bien !
    Par contre une fois, gammu-smsd installé je ne peux plus utiliser les commands de Gammu ...

    pi@raspberrypi:~ $ sudo gammu --identify
    Erreur à l'ouverture du périphérique : périphérique inconnu, occupé ou problème de permissions.

    Ce n'est pas si grave si je n'ai pas accès, les sms s'envoient quand même et je ne souhaite pas en recevoir, mais je voulais comprendre pourquoi !
    Merci ;)
    Bonne année

    • Hello,

      Merci pour ton retour positif :)

      Lorsque le daemon est lancé il se connecte/ouvre le périphérique en permanence, ce qui explique que la commande gammu –identify échoue. Il faut couper le daemon pour que la commande fonctionne.

      Par défaut ton périphérique va recevoir les sms. Tu peux effectuer une action à chaque sms recu en utilisant l'option RunOnReceive.
      Si besoin je peux rédiger un article à ce sujet.

  • Bonjour
    Merci pour ce tuto.
    Je l'utilise avec succès depuis deux ans... L'envoi de SMS est OK.
    Sauf que.....
    J'utilise ce système comme alarme de surveillance de température. Est que la sonnette de notification est insuffisante pour me réveiller ! Donc
    Existe t-il ou commande pour faire sonner le téléphone comme un appel vocal. Avec un raccrochage auto au bout de x seconde.
    Ainsi je pourrai avoir un système d'alarme à deux niveau. D'abord les SMS puis au bout de x SMS sans reponse une sonnerie plus inportante.
    Je code en pyton
    Call(..... Gammu SMS inject.........)
    D'avance merci

    • Bonjour,

      Merci pour ton retour positif :)

      A priori depuis la doc tu peux émettre un appel avec la commande: gammu maketerminatedcall 06xxx 20
      Ça va faire un appel qui se terminera après 20secondes.

      Par contre il faut probablement couper le daemon au moment ou tu exécutes cette commandes.
      A tester ;)

  • Bonjour, ma clé 3G usb est bien détectée dans lsusb mais pas dans demsg. Aucune ligne GSM modem n'apparaît. Que faire ?

    • Hello,

      Un redémarrage du raspberry change t'il quelque chose ?
      Meme si tu n'as rien dans demsh as tu tenté d'aller plus loin dans le tuto?

  • bonjour, merci pour votre tuto mais je rencontre plusieurs problèmes notamment après l'installation de gammu et wammu par les commmendes apt-get install gammu et apt-get install wammu (déjà en super user)
    wammu ne s'ouvre pas malgre le succès de l'installation, l'icone apparait mais lorsque je clique déçu cela ne s'ouvre pas

    • Bonjour,
      Malheureusement je n'ai jamais utilisé Wammu, je suis dans l'incapacité de vous aider, désolé.

  • Hey, I installed gammu under centos 7 sever, When I test the send sms
    [root@Gammu ~] # echo "hello" | gammu --sendsms TEXT +2162*******
    No response in specified timeout. Probably phone not connected.
    please How I resolve this issue

    • Hi,
      Have you tried to restart your centos after the installation of Gammu?
      Don't hesitate to disconnect your phone, reconnect it and try again the gammu-detect and verify if the output is the same that the content of the file /etc/gammurc

  • Bonjour, votre tuto me parait très simple mais je bute dès le début.
    J'ai raccordé 2 téléphones (Nokia et LG G6).
    Le système ne les voit pas comme des USBxxx mais ttyACM
    [gammu]
    device = /dev/ttyACM0
    name = LGE LG-H870
    connection = at

    [gammu1]
    device = /dev/ttyACM1
    name = Nokia Nokia_3109c
    connection = at
    Je ne compend pas pourquoi lors que je mets des
    commands gammu --smsd-inject TEXT 06XXXXXXXX -text « Test tutoandco » -len 14 ou tout autre message après gammu est pris comme "impossible d'ouvrir le fichier spécifié"/
    Les seuls commands possibles sont gammu-detect et gammu-config.

    • Bonjour,

      As tu déjà tenté de faire le setup qu'avec un seul téléphone? Commencer avec deux téléphones d'un coup peut être un peu compliqué.
      Est ce que tu as changé les droits sur le dossier /var/spool/gammu? J'ai l'impression que Gammu ne parvient pas à écrire dans un dossier.

  • Bonjour et merci pour votre article qui m'a permis de démarrer avec Gammu sur un raspberry. J'ai un petit soucis bizarre. Tout fonctionne bien avec Gammu en standard. Par contre, le daemon n'envoie et ne reçoit pas les SMS. J'ai le message "gammu-smsd[1045]: Error at init connection: Error opening device, it doesn't exist. (DEVICENOTEXIST[4])" dans le log.
    J'ai pourtant bien recopié les 3 blocs [gammu] [gammu1] et [gammu2] dans le fichier de config de daemon.
    Avec quelques recherches sur ce message d'erreur, cela correspondrait au fait que le daemon ne voit pas ma clé usb comme un modem et il y a des solutions pour ça mais j'hésite à casser ce qui marche en les appliquants car si Gammu standard sait utiliser la clé usb c'est qu'elle est bien reconnue comme modem. La seule utilité du dameon pour moi est de ne pas devoir taper le PIN mais au pire, je peux lancer un script au démarrage qui le fera.
    Bref, si ce problème vous dit quelque chose, toute suggestion est la bienvenue. Merci déjà en tout cas.

    • Je réponds un peu tard. Avez vous réussi à corriger votre problème ?
      De mémoire lorsque ce que j'avais eu à faire à ce genre d'erreur.
      Redémarrage integralement le serveur.
      Relance du daemon gammu
      si toujours l'erreur je relancais un scan des device pour vérifier que les bons sont présent dans le fichier de conf, puis mise à jour du fichier si necessaire et relance du daemon

  • Hello et bravo pour ce tuto simple et efficace.
    Moi le problème rencontré est le comportement de "Gammu SMS Daemon" lors de la tentative d'envoi à un numero erroné. "Gammu SMS Daemon" ne déplace pas le fichier dans le dossier "/var/spool/gammu/error/"et le laisse dans le dossier "outboxpath = /var/spool/gammu/outbox/".
    de ce fait les envois sont bloqué jusqu'à ce que l'on déplace le fichier manuellement ou on supprime l’intrus.
    Avez-vous une idée?
    Merci encore.

    • Avez vous réussi à corriger votre soucis.
      J'avoue que je n'ai jamais eu à faire à ce use case.
      Il me semble qu'il n'existe pas d'option pour vider le dossier.
      je mettrai en place un cron qui en cas de présence de fichier vieux de plus de x minutes dans le dossier /var/spool/gammu/outbox/, je les deplacerai dans le dossier error

Articles relatifs