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
1 2 3 4 5 6 |
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 |
1 2 3 4 |
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
1 2 3 4 |
sudo apt-get update sudo apt-get upgrade |
Installer gammu
1 2 3 |
sudo apt-get install gammu |
Détecter la configuration de gammu
1 2 3 |
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 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
[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:
1 2 3 4 5 6 7 8 9 |
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é
1 2 3 4 5 6 7 |
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 :
1 2 3 |
gammu sendsms TEXT 06xxxxxxxx -text "Test tutoandco" |
1 2 3 |
echo "Test tutoandco" | gammu --sendsms TEXT 06XXXXXX |
En réponse voici ce que la console affiche
1 2 3 4 |
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
1 2 3 |
sudo usermod -a -G dialout www-data |
Il faut ensuite autoriser www-data à executer gammu :
1 2 3 |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
<?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.
1 2 3 |
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
1 2 3 |
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
1 2 3 |
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.
1 2 3 |
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.
1 2 3 |
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 :
1 2 3 |
gammu-smsd-inject TEXT 06XXXXXXXX -text "Test tutoandco" |
1 2 3 |
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
Bonjour,
Merci pour votre tutoriel, mais j’ai un petit soucis, je parviens à envoyer des sms mais ses sms sont incomplets, je ne sais quoi faire pour résoudre le problème. Svp avez-vous une idée pour solutionner ceci ?
Bonjour,
Il faut rajouter un paramètre -len suivi de la longueur du texte à la ligne de commande, ce qui donne : gammu-smsd-inject TEXT 06XXXXXXXX -text « Test tutoandco » -len 14
Bonjour,
j’ai une question assez proche de Thibault. Non seulement les ports /dev/ttyUSBx affectés au E169 varient au reboot mais ils changent aussi de façon imprévue. Ainsi, le soir, tout fonctionne (émission et réception de sms) mais dans la nuit la réaffectation des USBx fait que ça ne fonctionne plus le matin (sans redémarrage). Pourtant E169 est sur un hub alimenté et je ne comprends pas pourquoi les ports sont ainsi réaffectés car il ne devrait pas y avoir de coupure au niveau du dongle (défaut du dongle? mais comment savoir?). J’ai essayé la définition d’une règle pour un port logique mais ça ne semble pas s’adapter correctement…
Par ailleurs, je ne comprends pas pourquoi il y a trois fichiers de config : /etc/gammurc, /etc/gammu-smsd et /etc/gammu-smsdrc. Il y a de la redondance, non? De plus, l’attribut PIN défini dans /etc/gammu-smsdrc ne semble pas avoir d’effet puisqu’il faut faire un gamma-entersecuritycode pour que le démon smsd fonctionne. J’ai trouvé la doc sur comment définir les fichier de configuration mai assez peu sur comment ils sont utilisés. Pouvez-vous me faire partager vos fichiers de config?
Merci!!
Bonjour,
Concernant le changement des ports, j’ai trouvé une astuce qui dans mon cas me permet de reboot sans être embêté par le changement. Je finis le tuto et je le publi d’ici la fin de la semaine.
Concernant les fichiers, il y avait une erreur que j’ai corrigé. Tu ne devrais avoir que deux fichiers /etc/gammurc (pour gammu) et /etc/gammu-smsdrc (pour le daemon).
J’ai mis mes fichiers de conf sur mon github : https://github.com/colas31/gammu
Concernant le code pin, je n’ai eu à utiliser entersecuritycode que pour gammu et non pour le daemon. Il faudrait tenter avec mes fichiers de conf.
Si quelque chose n’est pas clair ne pas hésiter 🙂
Bonjour colas et merci pour ce tuto.
A la lecture de votre tuto en autre, je me suis lancé dans le projet suivant : communiquer par SMS avec Domoticz via un modem USB 3G
Mes achats : RapberryPI3, RFxcom 433 et Huawei E169 (+prises télécommandables et thermometre Oregon).
Bref, j’ai suivi le tuto et j’arrive à envoyer des SMS via des commandes de type « gammu-smsd-inject TEXT 06XXXXXXXX -text « Test » »
Cela prouve que j’ai bien installé, Raspbian, Gammu et Gammu-smsd
Mon problème est le besoin de rendre l’ensemble robuste et compatible avec une coupure de courant.
C’est là que j’ai mon problème : Error at init connection: Error opening device, it doesn’t exist. (DEVICENOTEXIST[4]) dans la log
C’est cependant aléatoire et semble t’il directement lié au périphérique retourné par gammu –identify qui change (parfois ttyUSB0 et parfois ttyUSB1)
J’en arrive donc à la conclusiond’un mauvais paramétrage des 2 fichiers de config /etc/gammurc et /etc/gammu-smsdrc ou/et des règles d’affectation des périphériques = fichier /etc/udev/rules.d/99-usb-serial.rules
(https://www.domoticz.com/wiki/PersistentUSBDevices)
Sauf erreur, au branchement du modem E169, 3 périphériques sont montés (un usb stockage de masse, un modem et ?) dans un ordre aléatoire.
Il semble donc nécessaire d’ajouter le montage d’un lien symbolique et de se servir de ce lien dans les fichiers de conf de Gammu et Gammu-smsd.
Je ne sais pas comment déterminer la syntaxe du etc/udev/rules.d car il faut, en plus des idVendor et idProduct, trouver une différence dans ce E169 pour identifier « à tous les coups » le modem des 2 autres périphériques.
Auriez-vous la possibilité de me communiquer le contenu de vos fichiers de conf, je me demande si il faut les 3 sections [gammu1, 2 et 3] dans gammurc et dans gammu-smsdrc ou pas ?
Voici le contenu des miens :
sudo nano /etc/gammurc
; Configuration file generated by gammu-detect.
; Please check The Gammu Manual for more information.
[gammu]
device = /dev/ttyUSB0
name = Phone on USB serial port ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ HUAWEI_Mobile
connection = at
[gammu1]
device = /dev/ttyUSB2
name = Phone on USB serial port ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ HUAWEI_Mobile
connection = at
[gammu2]
device = /dev/ttyUSB3
name = Phone on USB serial port ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ HUAWEI_Mobile
connection = at
et
sudo nano /etc/gammu-smsdrc
; Configuration file generated by gammu-detect.
; Please check The Gammu Manual for more information.
[gammu]
device = /dev/ttyUSB0
name = Phone on USB serial port ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ HUAWEI_Mobile
connection = at
[gammu1]
device = /dev/ttyUSB2
name = Phone on USB serial port ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ HUAWEI_Mobile
connection = at
[gammu2]
device = /dev/ttyUSB3
name = Phone on USB serial port ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ HUAWEI_Mobile
connection = at
[smsd]
PIN=0000
SMSC=+3369xxxxx95
service = files
logfile = /tmp/gammu-smsdsyslog
# Increase for debugging information
debuglevel = 1
# Paths where messages are stored
inboxpath = /var/spool/gammu/inbox/
outboxpath = /var/spool/gammu/outbox/
sentsmspath = /var/spool/gammu/sent/
enfin, une idée de ce que pourrait/devrait être
sudo nano /etc/udev/rules.d/99-usb-serial.rules
SUBSYSTEM== »tty », ATTRS{idVendor}== »12d1″, ATTRS{idProduct}== »140c », SYMLINK+= »ttyUSB-HuaweiE169_%E{ID_USB_INTERFACE_NUM} »
Désolé c’est peut-être un peu long mais je galère et tourne en rond.
D’avance merci
Bonjour,
Merci pour ce commentaire. Je vous ai envoyé directement un mail pour que ce soit plus clair et lisible.
Je mettrai un résumé et une solution ici plus tard
Bonjour,
Je rencontre le même pb de détection avec le même message d’erreur.
Je n’ai pas vu la solution à venir. 🙁
Merci d’avance.
Bruno
Bonsoir Bruno,
Vous pouvez aller lire cet article, https://tutoandco.colas-delmas.fr/software/fixer-ports-huawei-gammu/; il devrait vous aider à corriger l’erreur.
N’hésitez pas à revenir vers moi.
Colas
Merci pour ce tuto et ce partage. Vraiment très cool.
Merci pour votre retour 🙂
Bonjour,
J’ai déjà mit en place l’envois des sms avec gammu-sms mais lorsque je renvois un sms déçu, il ne l’affiche pas dans le /var/spool/gammu/inbox/ et m’affiche dans le /var/log/gammu_syslog un message d’erreur lors du déclenchement du script du type « process failed with exit status 127 ».
Que faire ?
Merci
Tu parles bien de l’option RunOnReceive ? je viens de la tester, et après quelques changement j’ai réussi à la faire marcher.
Il faut faire attention aux droits du fichier à exécuter, et à son emplacement.
RunOnReceive = /tmp/demo.sh
Voila les les droits que j’ai mis pour tester.
-rwxrwxrwx 1 gammu gammu 42 Mar 22 08:16 /tmp/demo.sh
Dans cette configuration j’ai ces infos dans mon syslog :
Mar 22 08:28:43 DietPi gammu-smsd[18826]: Received IN20170322_082749_00_+336xxxxxxx_00.txt
Mar 22 08:28:43 DietPi gammu-smsd[18862]: Starting run on receive: /tmp/demo.sh IN20170322_082749_00_+336xxxxxxx_00.txt
Mar 22 08:28:43 DietPi gammu-smsd[18826]: Process finished successfully
Voici mon code du fichier :
#!/bin/sh
echo "SMS OK" >> /tmp/debug.log
Bonjour, j’ai le même modem ( les mêmes caractéristiques) que celui que vous avez utiliser dans la présentation et les ttyUSB* apparaissent bien. Cependant, lorsque je lance « gammu identify » il renvoie : Le temps d’atente est passé. Le téléphone est probablement non connecté. Mais tout à l’heure je reverifi il ne présente que les ports ttyS*. Aider-moi s’il vous plait.
Bonjour,
Sur quel distribution fais tu les tests ? (Raspbian aussi) ? Hésite pas à reboot le PC, et rebrancher la clé après, voir si cela change quelque chose.
As tu regardé dans les logs (/var/log/gammu.log) si il y avait des détails de l’erreur ?
As tu testé sur un autre port USB ?
As tu testé la carte SIM dans un téléphone, afin de déterminer que tu as bien du réseau ?
Essaie également d’aller jusqu’à la fin de la configuration et de tenter d’envoyer un SMS via la commande gammu sendsms pour voir quel message d’erreur tu obtiens.
Bon courage 😉
Super projet !
Je suis confronté à un soucis, lorsque j’envoie deux SMS simultanément seul le premier est reçu, voir même aucun.
Avez-vous une idée pour solutionner ceci ?
En effet j’ai pu tester et reproduire le problème. L’installation du daemon corrige le problème.
J’ai mis à jour l’article en conséquent
Bonjour
Merci pour le tuto
A chaque redémarrage les textos ne semblent plus s’envoyer, avez vous une piste ?
Cordialement
Hello,
A priori si la carte SIM est protégée par un code PIN, il faut le renseigner à chaque redémarrage du serveur / PC via cette commande : gammu entersecuritycode PIN xxxx