Envoyez des SMS avec votre Raspberry Pi

Salut,

Aujourd’hui, je vous propose de voir comment envoyer et recevoir des SMS à partir d’un Raspberry Pi.

Une fois fait, il sera aisé de créer des scripts de notification automatique, ou de créer une petite interface web pour envoyer/recevoir des SMS, etc.

Principe


Pour envoyer et recevoir des SMS, le RPi doit pouvoir se connecter au réseau téléphonique d’un opérateur (une connexion au réseau GSM est suffisante). Pour ce faire, on va utiliser un périphérique USB externe que certains appellent un « dongle 3G » ou encore « clef/modem 3G », et dans lequel on insert une carte SIM.

Vous pouvez par exemple acheter une carte SIM associée à un abonnement minimaliste en temps de communication, mais offrant le nombre de SMS mensuels suffisant à vos besoins.

Le matériel


Côté matériel, il nous faut:

  • Une clef 3G (ou dongle 3G, ou modem 3G)
  • Un hub USB alimenté
  • Une carte SIM

La clef 3G

Il faut choisir avec soin la clef 3G que l’on va acheter car toutes ne sont pas compatibles ou disposent d’un pilote stable pour le Raspberry Pi. Après quelques recherches et fouilles intensives sur divers forums, et après avoir éliminé les clef 3G qu’on ne trouve plus à la vente, j’ai opté pour cette clef 3G qui fonctionne parfaitement avec le RPi, la TP-LINK MA180.

On trouve cette clef pour un peu moins de 40€ sur Amazon.

Le hub USB

Le problème avec les clef 3G est qu’elles consomment plus de courant que ce que le RPi n’est capable de fournir nativement sur ses ports USB embarqués. Il faut donc utiliser un hub USB externe possédant sa propre alimentation. La encore, il faut choisir avec le plus grand soin ce genre de hub. J’ai eu pour ma part des déconvenues avec un premier hub USB sans marque, à bas prix, pourtant supposé fournir le courant nécessaire. Le problème était que tout fonctionnait bien jusqu’à ce que la clef 3G se connecte au réseau de l’opérateur, une opération qui semble consommer plus de courant. Résultat: la tension d’alimentation s’écroulait et le RPi rebootait. Après m’être cassé la tête pour identifier que le problème venait en fait de l’alimentation (et pas d’un problème de driver), j’ai finalement opté pour un hub USB de bonne qualité, le Icy-Box IB-AC611 :

Ce hub de construction solide (métal brossé) délivre jusqu’à 3.5A, ce qui couvrira les besoins d’alimentation de potentiels futurs  périphériques. Il propose un port d’uplink ne faisant pas de « backpower » contrairement à des hub USB bas de gamme, et disposant d’un port (le jaune) dédié à l’alimentation seule (pas de données) d’un périphérique. Avec ce hub, tout fonctionne parfaitement, vous ne risquez pas de mauvaise surprise 🙂 .

Installation de la clef 3G


Une fois que tout est branché et alimenté, il y a quelques étapes à suivre afin de faire reconnaitre la clef 3G correctement.

En effet, ce genre de clef, disposant d’un stockage de masse intégré, est vue par défaut par le système comme une clef USB de stockage, ce qui ne permet pas d’accéder à ses fonctionnalités de modem GSM/3G. La manière dont un périphérique USB est vu par le système s’appelle le mode USB. De nombreux périphériques proposent plusieurs modes (pensez à votre smartphone qui peut être soit vu comme un périphérique multimédia, soit comme un stockage externe). Après avoir branché la clef 3G TP-LINK MA180, voyons comment elle est vue par le système, grâce à la commande lsusb :

pi@domopi ~ $ lsusb
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 004: ID 05e3:0610 Genesys Logic, Inc. 4-port hub
Bus 001 Device 005: ID 0bda:8179 Realtek Semiconductor Corp.
Bus 001 Device 006: ID 2357:0200

Le code 2357:0200 indique que la clef 3G TP-LINK (code constructeur: 2357) est vue comme un stockage de masse (product code: 0200).

Sous linux, il existe heureusement un utilitaire permettant de switcher d’un mode USB à l’autre, automatiquement au démarrage du RPi, ou dès que le périphérique est branché. Cet utilitaire s’appelle  tout simplement usb-modeswitch.

Installation de usb-modeswitch :

pi@domopi ~ $ sudo apt-get update && sudo apt-get install usb-modeswitch

 Il faut ensuite rebooter le RPi (sudo reboot).

Petite parenthèse, si on s’amuse à regarder dans les fichiers de référence des périphériques connus de usb-modeswitch, on trouve bien les lignes suivantes :

########################################################
# TP-Link MA180
# Contributor: complexgeek

DefaultVendor= 0x2357
DefaultProduct=0x0200

TargetVendor=  0x2357
TargetProduct= 0x0201

En effet, après l’installation de usb-modeswitch et un reboot, la clef 3G est maintenant vue avec le nouveau product code (0201 au lieu de 0200), ce qui signifie qu’on peut maintenant l’utiliser comme une clef 3G :

pi@domopi ~ $ lsusb
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 004: ID 05e3:0610 Genesys Logic, Inc. 4-port hub
Bus 001 Device 005: ID 0bda:8179 Realtek Semiconductor Corp.
Bus 001 Device 006: ID 2357:0201

A ce stade, notre clef 3G est correctement reconnue par le système, et de nouveaux périphériques sont détectés et disponibles sur le système :

pi@domopi ~ $ ls /dev/ttyUSB*
/dev/ttyUSB0  /dev/ttyUSB1  /dev/ttyUSB2

Installation de Gammu


Gammu est un package comprenant:

  • Un utilitaire en ligne de commande prenant en charge la communication et les interactions avec toute une gamme de clef 3G et de téléphones portables
  • Un daemon unix pour la réception des SMS
  • Une bibliothèque de liaison avec Python pour écrire ses propres scripts dans ce langage

L’installation de Gammu est très simple, comme d’habitude :

pi@domopi ~ $ sudo apt-get update && sudo apt-get install gammu

Il nous reste maintenant à configurer Gammu pour lui indiquer quel périphérique utiliser et spécifier quelques paramètres de connexion. On va utiliser un utilitaire livré avec Gammu qui permet de créer le fichier de configuration .gammurc dans notre répertoire home :

pi@domopi ~ $ gammu-config -c /home/pi/.gammurc

Cette commande lance un utilitaire semi-graphique type « ncurse » , dans lequel on va spécifier tous nos paramètres:

Les seuls paramètres que l’on va spécifier sont :

  • port : /dev/ttyUSB2
  • connection : at19200

On laisse le reste par défaut on on fait « Save » puis « Ok ».

Pour finir, on va vérifier que Gammu arrive bien à communiquer avec notre clef 3G :

pi@domopi ~ $ gammu identify
Device               : /dev/ttyUSB2
Manufacturer         : TP-LINK INCORPORATED
Model                : unknown (MA180)
Firmware             : M6290A-KPRZL-2.4.0240T  1  [Jan 17 2011 10:00:00]
IMEI                 : 123456789901234
SIM IMSI             : 123456789012345

Envoyer/Consulter des SMS


Pour commencer, si la carte SIM requiert un PIN code, on doit le fournir pour débloquer la carte (exemple si le PIN code est 1234) :

pi@domopi ~ $ gammu entersecuritycode PIN 1234

 Ensuite, l’envoi de SMS se fait avec la commande :

pi@domopi ~ $ echo "Salut, ceci est mon premier sms" | gammu sendsms TEXT 0601020304
If you want break, press Ctrl+C...
Sending SMS 1/1....waiting for network answer..OK, message reference=168

 La consultation des SMS reçus se fait avec la commande :

pi@domopi ~ $ gammu getallsms
Location 0, folder "Inbox", SIM memory, Inbox folder
SMS message
SMSC number          : "+33689004020"
Sent                 : Wed 15 Apr 2015 17:08:32  +0200
Coding               : Default GSM alphabet (no compression)
Remote number        : "+3361234567"
Status               : Read

SMS bien reçu !

1 SMS parts in 1 SMS sequences

Dans l’idéal, on ne consulterait pas les SMS reçus en allant régulièrement interroger la clef 3G. On utiliserait plutôt le daemon gammu-smsd qui s’occupe de cette tâche et qui stocke les SMS reçus dans une base de données. Personnellement, je n’utilise pas ce daemon et c’est pourquoi je ne m’étalerai pas sur le sujet.

L’utilitaire gammu comprend plusieurs autres commandes et options intéressantes, et je vous encourage à en lire le manuel.

Quelques scripts pour enrober tout ça


Je vous propose quelques scripts qui vont rendre paramétrable l’appel aux différentes actions, mais également s’occuper de faire des vérifications ainsi que gérer les cas d’erreurs.

sendSMS.sh

Ce script apporte les fonctionnalités suivantes :

  • Envoi d’un SMS par défaut à un numéro de téléphone par défaut
  • Envoi d’un SMS spécifique à un numéro de téléphone spécifique
  • Support des SMS multi-lignes
  • Gestion des cas d’erreur (clef 3G non vue, PIN code à ré-entrer etc.)
  • Journalisation de l’activité

Utilisation :

pi@domopi ~ $ ./sendSMS.sh [<numéro de téléphone> <fichier contenant le SMS à envoyer>]

Le script est le suivant (en anglais, as usual 🙂 ) :

#!/bin/bash
#
# This scripts sends a text SMS to the specified number.
# If no arguments are passed to the script, it will simply send
# a probe SMS to a predefined phone number

#==============================================================
# Define some variables
DEVICE="/dev/ttyUSB2"
USBID="2357:0201"
GAMMUCONF="/home/pi/.gammurc"

DEFAULTPHONE="0601020304"
DEFAULTMESSAGEFILE="/home/pi/Domotique/SMSServices/defaultsms.txt"
LOGFILE="/home/pi/Domotique/SMSServices/sendsms.log"
LOGENABLED=false

PINCODE="1234"

#==============================================================
# Check the number of arguments and store them
if [[ $# -eq 2 ]]; then
  PHONE=$1
  MESSAGEFILE=$2
  LOGENABLED=true
elif [[ $# -eq 1 ]]; then
  PHONE=${DEFAULTPHONE}
  MESSAGEFILE=$1
  LOGENABLED=true
elif [[ $# -eq 0 ]]; then
  PHONE=${DEFAULTPHONE}
  MESSAGEFILE=${DEFAULTMESSAGEFILE}
else
  echo "Invalid number of arguments. Must be 2 or 0."
  exit 0
fi 

#==============================================================
# Check the 3G dongle is available
if [[ ! -c ${DEVICE} ]]; then
  echo "Device ${DEVICE} is not available. Might be a driver issue."
  if [[ $(lsusb | grep ${USBID}) == "" ]]; then
    echo "The 3G dongle is not recognized on the USB bus"
  fi
  exit 0
fi

#==============================================================
# Function to send the SMS
sendSMS() {
  cat ${MESSAGEFILE} | sudo /usr/bin/gammu -c ${GAMMUCONF} sendsms TEXT ${PHONE} -validity 6HOURS
  RETVALUE=$?

  # Log everything
  if [[ ${RETVALUE} -eq 0 && ${LOGENABLED} = true ]]; then
    DATE=$(date +"%x-%X")
    ONELINEMESSAGE=$(cat ${MESSAGEFILE} | tr "\\r\\n" " ")
    echo "${DATE};${PHONE};${ONELINEMESSAGE}" >> ${LOGFILE}
  fi
  return ${RETVALUE}
}

sendSMS

# Check the status code of the gammu command. If it's 121, then it means the 3G dongle
# is first waiting for the pin code to be entered
if [[ $? -eq 121 ]]; then
  sudo /usr/bin/gammu entersecuritycode PIN ${PINCODE}

  # At this stage, the 3G dongle should be ready and joined on the network
  # Try to send the SMS again
  if [[ $? -eq 0 ]]; then
    sendSMS
  else
    echo "Could not enable 3G dongle providing the PIN code ${PINCODE}"
  fi
fi

getAllSMS.sh

Ce script apporte les fonctionnalités suivantes :

  • Affichage de la boite de réception des SMS
  • Gestion des cas d’erreur (clef 3G non vue, PIN code à ré-entrer etc.)
  • Journalisation de l’activité

Utilisation :

pi@domopi ~ $ ./getAllSMS.sh

Le script est le suivant :

#!/bin/bash
#
# This scripts reads the SMS Inbox folder from the 3G dongle
# and echoes it on stdout 

#==============================================================
# Define some variables
DEVICE="/dev/ttyUSB2"
USBID="2357:0201"
GAMMUCONF="/home/pi/.gammurc"

PINCODE="1234"

#==============================================================
# Check the 3G dongle is available
if [[ ! -c ${DEVICE} ]]; then
  echo "Device ${DEVICE} is not available. Might be a driver issue."
  if [[ $(lsusb | grep ${USBID}) == "" ]]; then
    echo "The 3G dongle is not recognized on the USB bus"
  fi
  exit 0
fi

#==============================================================
# Function to read the SMS Inbox folderS
getAllSMS() {
  sudo /usr/bin/gammu -c ${GAMMUCONF} getallsms
  return $?
}

getAllSMS

# Check the status code of the gammu command. If it's 121, then it means the 3G dongle
# is first waiting for the pin code to be entered
if [[ $? -eq 121 ]]; then
  /usr/bin/gammu entersecuritycode PIN ${PINCODE}

  # At this stage, the 3G dongle should be ready and joined on the network
  # Try to read the SMS Inbox again
  if [[ $? -eq 0 ]]; then
    getAllSMS
  else
    echo "Could not enable 3G dongle providing the PIN code ${PINCODE}"
  fi
fi

deleteAllSMS.sh

Ce script apporte les fonctionnalités suivantes :

  • Effacement de la boite de réception des SMS
  • Gestion des cas d’erreur (clef 3G non vue, PIN code à ré-entrer etc.)

Utilisation :

pi@domopi ~ $ ./deleteAllSMS.sh

Le script est le suivant :

#!/bin/bash
#
# This scripts deletes all SMS from the SMS Inbox folder from the 3G dongle

#==============================================================
# Define some variables
DEVICE="/dev/ttyUSB2"
USBID="2357:0201"
GAMMUCONF="/home/pi/.gammurc"

PINCODE="1234"

#==============================================================
# Check the 3G dongle is available
if [[ ! -c ${DEVICE} ]]; then
  echo "Device ${DEVICE} is not available. Might be a driver issue."
  if [[ $(lsusb | grep ${USBID}) == "" ]]; then
    echo "The 3G dongle is not recognized on the USB bus"
  fi
  exit 0
fi

#==============================================================
# Function to delete all SMS's from the SMS Inbox
deleteAllSMS() {
  sudo /usr/bin/gammu -c ${GAMMUCONF} deleteallsms 1
  return $?
}

deleteAllSMS

# Check the status code of the gammu command. If it's 121, then it means the 3G dongle
# is first waiting for the pin code to be entered
if [[ $? -eq 121 ]]; then
  /usr/bin/gammu entersecuritycode PIN ${PINCODE}

  # At this stage, the 3G dongle should be ready and joined on the network
  # Try to delete all SMS's again
  if [[ $? -eq 0 ]]; then
    deleteAllSMS
  else
    echo "Could not enable 3G dongle providing the PIN code ${PINCODE}"
  fi
fi

Surveiller le bon fonctionnement de la clef 3G


La stabilité de ce dispositif est correcte (plusieurs semaines sans problème), mais pas parfaite. Jusqu’à présent, il m’est arrivé deux types de problème :

  1. La clef 3G se déconnecte du réseau de l’opérateur (à moins que ça ne soit le réseau de l’opérateur qui dysfonctionne, je ne sais pas)
    ou
  2. Le driver de liaison série « option » commence à dysfonctionner et à envoyer des messages d’erreur au noyau linux de type « option_instat_callback error« , ce qui conduit dans les heures qui suivent à ce que le périphérique ne soit plus vu du système (Note: il semblerait que ce bug ait été corrigé dans une version plus récente du driver, pas encore disponible pour le Raspberry Pi, sauf à se compiler soit même le driver, avec toutes les dépendances que ça tire… pas eu le courage, on va faire autrement, voir ci-après)

L’idée est donc de surveiller régulièrement notre clef 3G et le périphérique correspondant, et agir en fonction des cas:

  1. Faire un hard reset de la clef 3G pour forcer une reconnexion au réseau de l’opérateur
    ou
  2. Simplement alerter par e-mail quand le driver « option » commence à pécloter (j’améliorerai ça plus tard, quand j’aurai trouver la séquence de commandes qui règle le problème en évitant de rebooter le RPi, mais comme ça n’arrive pas souvent…)

Pour cette surveillance, rien de plus simple depuis que nous avons installé le génial programme Monit sur nos RPi !

On va d’abord se doter d’un petit script qui vérifie que la clef 3G est bien connecté au réseau de l’opérateur. Appelons ce script checkSMSDongle.sh et copions-y le code suivant :

#!/bin/bash
#
# This scripts checks:
# 1. that the SMS/3G USB dongle is seen from the system
# 2. that the SMS/3G USB dongle is properly connected on the phone provider network

#==============================================================
# Define some variables
DEVICE="/dev/ttyUSB2"
USBID="2357:0201"
GAMMUCONF="/home/pi/.gammurc"

#==============================================================
# Check the SMS/3G dongle is available
if [[ ! -c ${DEVICE} ]]; then
  echo "[ERROR] Device ${DEVICE} is not available. Might be a driver issue."
  if [[ $(lsusb | grep ${USBID}) == "" ]]; then
    echo "[ERROR] The SMS/3G dongle is not recognized on the USB bus"
  fi
  exit 1
fi

#==============================================================
# Check the SMS/3G dongle is connected to the phone provider network
sudo /usr/bin/gammu -c ${GAMMUCONF} networkinfo | grep "home network" > /dev/null
if [[ "$?" -eq "1" ]]; then
	echo "[ERROR] The SMS/3G dongle is not connected to the phone provider network"
	exit 1
fi

Puis, créons le script qui s’occupera de faire le hard reset de la clef 3G, appelons-le fixSMSDongle.sh et copions-y le code suivant :

#!/bin/bash
#
# This scripts performs a hard reset of the SMS/3G dongle. It then re-enters the security code.

#==============================================================
# Define some variables
DEVICE="/dev/ttyUSB2"
USBID="2357:0201"
GAMMUCONF="/home/pi/.gammurc"

PINCODE="1234"

#==============================================================
# Check the SMS/3G dongle is available
if [[ ! -c ${DEVICE} ]]; then
  echo "[ERROR] Device ${DEVICE} is not available. Might be a driver issue."
  if [[ $(lsusb | grep ${USBID}) == "" ]]; then
    echo "[ERROR] The SMS/3G dongle is not recognized on the USB bus"
  fi
  exit 1
fi

#==============================================================
# Perform the reset of the dongle

# Performing a hard reset of 3G dongle
echo "[INFO] Trying to reset the SMS/3G dongle"
sudo /usr/bin/gammu -c ${GAMMUCONF} reset hard

echo "[INFO] Hard reset done. Waiting for the device to be available"

# After a hard reset, the device needs time before it's reachable again
sleep 30

# After a hard reset, it is required to re-enter the security code
echo "[INFO] Entering PIN code"
sudo /usr/bin/gammu -c ${GAMMUCONF} entersecuritycode PIN ${PINCODE}

# Check the SMS/3G dongle is now attached to the network
sudo /usr/bin/gammu -c ${GAMMUCONF} networkinfo

Il nous reste à créer deux petits fichiers de surveillance Monit. Le premier créé comme /etc/monit.d/3g_sms_dongle.conf et contenant la configuration suivante:

check program CheckSMSDongle path "/home/pi/Domotique/SMSServices/checkSMSDongle.sh" every 5 cycles
	if status != 0 for 3 cycles then alert
	if status != 0 for 3 cycles then exec "/home/pi/Domotique/SMSServices/fixSMSDongle.sh"
	if status != 0 for 10 cycles then unmonitor

Le deuxième créé comme /etc/monit.d/kernel_log.conf et contenant la configuration suivante :

check file kernel with path /var/log/kern.log
	if match "option_instat_callback" then alert

Pour finir, demander à monit de recharger ses fichier de configuration (voir l’article correspondant).

Envoyer/Recevoir des SMS depuis le réseau


Comme je l’avais montré pour la lecture de température ou pour la commande des prises électriques, l’envoi et la réception de SMS constitue un nouveau service domotique, installé sur mon RPi dédié domotique que j’ai appelé « domopi » (petit rappel de mon environnement dans le premier article de référence).

Souhaitant pouvoir accéder à distance à ce service domotique, via le réseau, depuis mon RPi frontal, il suffit de mettre à jour le script qui reçoit les commandes depuis le réseau pour qu’il traite les demandes d’envoi de SMS, de consultation des SMS reçus, ou d’effacement des SMS (voir l’article sur la communication entre les deux RPi).

Je vous propose donc ici le script intégral, complété par la partie SMS, avec l’apparition de 3 nouvelles commandes, qui s’appuient respectivement sur les 3 scripts bash que j’ai introduit avant :

  • sendsms : cette commande attend les paramètres suivants, juste après avoir envoyé le nom de la commande :
    • le numéro de téléphone destinataire
    • la taille (en octets) du message à suivre
    • le corp du message
  • readsmsinbox : aucun paramètre
  • deleteallsms : aucun paramètre

Le script complet :

#!/bin/bash
# Author: Arno0x0x
# Description:
#	This script executes some domotic orders based on the command passed as argument.
#	The network wrapper is Xinetd on port 6868/tcp (domoservices)
# Dependencies:
#	This script depends on two binaries to send RF433 commands to remote controled outlets
#	1. chacon_send : Used to control "Chacon - D-IO" outlets.
#					 Usage: chacon_send <wiringPI pin> <controler code> <outlet code> <on|off>
#					 Ex:	chacon_send 0 12325261 1 on
#	2. phenix_send : Used to control "PHENIX type" outlets. WiringPi pin used is forced to 0 at compile time.
#					 Usage: phenix_send <wiringPI pin> <controler code> <outlet code> <1|0>
#					 Ex:	phenix_send 0 10110 1 1
#	3. sendSMS.sh : Used to send SMS through the 3G dongle.
#					 Usage : sendSMS.sh <phoneNumber> <text file containing the message>

#-----------------------------------------------------------------------
# Initialize main variables
# ligth1 = salle a manger | light2 = salon
# heater1 = salon | heater2 = entree
#-----------------------------------------------------------------------
export LANG=en_GB.UTF-8
_rootDir="/home/pi/Domotique"
_domoServicesLogFile="${_rootDir}/domoservices.log"
_light1_ON="sudo ${_rootDir}/phenix_send 0 10110 1 1"
_light1_OFF="sudo ${_rootDir}/phenix_send 0 10110 1 0"
_light2_ON="sudo ${_rootDir}/phenix_send 0 10110 2 1"
_light2_OFF="sudo ${_rootDir}/phenix_send 0 10110 2 0"
_heater1_ON="sudo ${_rootDir}/chacon_send 0 12325261 1 on"
_heater1_OFF="sudo ${_rootDir}/chacon_send 0 12325261 1 off"
_heater2_ON="sudo ${_rootDir}/chacon_send 0 12325261 2 on"
_heater2_OFF="sudo ${_rootDir}/chacon_send 0 12325261 2 off"
_readTemperature="${_rootDir}/readTemperature.sh"
_SMSServicesrootDir="${_rootDir}/SMSServices"
_sendSMS="${_SMSServicesrootDir}/sendSMS.sh"
_getAllSMS="${_SMSServicesrootDir}/getAllSMS.sh"
_deleteAllSMS="${_SMSServicesrootDir}/deleteAllSMS.sh"

#-----------------------------------------------------------------------
# Read the command passed on stdin
read _command

case ${_command} in
   light1ON)
		${_light1_ON}
		[[ $? -eq 0 ]] || echo "[ERROR]" >> ${_domoServicesLogFile}
		;;
   light1OFF)
		${_light1_OFF}
		[[ $? -eq 0 ]] || echo "[ERROR]" >> ${_domoServicesLogFile}
		;;
   light2ON)
		${_light2_ON}
		[[ $? -eq 0 ]] || echo "[ERROR]" >> ${_domoServicesLogFile}
		;;
   light2OFF)
		${_light2_OFF}
		[[ $? -eq 0 ]] || echo "[ERROR]" >> ${_domoServicesLogFile}
		;;
   heater1ON)
		${_heater1_ON}
		[[ $? -eq 0 ]] || echo "[ERROR]" >> ${_domoServicesLogFile}
		;;
   heater1OFF)
		${_heater1_OFF}
		[[ $? -eq 0 ]] || echo "[ERROR]" >> ${_domoServicesLogFile}
		;;
   heater2ON)
		${_heater2_ON}
		[[ $? -eq 0 ]] || echo "[ERROR]" >> ${_domoServicesLogFile}
		;;
   heater2OFF)
		${_heater2_OFF}
		[[ $? -eq 0 ]] || echo "[ERROR]"  >> ${_domoServicesLogFile}
		;;
   readTemperature)
		echo $($_readTemperature)
		[[ $? -eq 0 ]] || echo "[ERROR]"  >> ${_domoServicesLogFile}
		;;
   sendsms)
		read phoneNumber
		read contentSize
		head -c ${contentSize} > ${_SMSServicesrootDir}/smsmessage.txt
		${_sendSMS} ${phoneNumber} ${_SMSServicesrootDir}/smsmessage.txt
		;;
   readsmsinbox)
		${_getAllSMS}
		[[ $? -eq 0 ]] || echo "[ERROR]"  >> ${_domoServicesLogFile}
		;;
   deletesmsinbox)
		${_deleteAllSMS}
                [[ $? -eq 0 ]] || echo "[ERROR]"  >> ${_domoServicesLogFile}
                ;;
   *) echo "[ERROR] UNKNOWN COMMAND"
	  ;;
esac

L’ensemble des script bash, et des fichiers de configuration monit sont prêt à télécharger dans une petite archive zip que je vous ai préparé ici. Il vous faudra bien sûr adapter les chemins d’accès de ces scripts en fonction de votre propre installation, leur donner les droits d’exécution et modifier les paramètres par défaut (numéros de téléphone).

Pour finir, voici un exemple de petite application PHP/HTML5, installé sur mon RPi frontal, et qui tire parti de tout ce qu’on a vu dans cet article :

A bientôt !

Vous aimez cet article ? Faites le savoir avec quelques bitcoins !

13 réflexions sur “Envoyez des SMS avec votre Raspberry Pi

  1. pascal 8 Mai 2018 / 17 h 18 min

    Bonjour,

    je voudrais savor si votre article est encore d’actualité. j ai besoin d’ envoyer et surtout recevoir des SMS depuis mon Raspery pi 3.je voudrais acheter un dongle. est ce que celui que vous avez testé est encore compatible avec les versions de rasbian et gammu actuel ? et est ce qui faut desimlocké quoi que se soit ?
    MErci
    Pascal

    J’aime

  2. Bil 2 janvier 2017 / 14 h 45 min

    Bonjour
    Serait il possible d’avoir le code source de la petite application en PHP pour envoyer des sms via une interface web.Chapeau bas pour votre travail et merci pour le partage.
    D’avance merci et bonne année 2017

    J’aime

  3. clement 24 septembre 2016 / 17 h 24 min

    Merci pour ce tuto qui m’a permis d’installer ma clef 3G en quelques manipulation seulement et ainsi d’envoyer et recevoir mes premiers sms.
    J’ai une petite question sur la remarque que tu fais sur les messages envoyé au noyau. Bon je precise que je ne comprends rien à ce que j’ecris. Quand je fais dmesg j’ai un message arrivant du usb0 qui dit usb_serial_generic_read_bulk_callback – urb stopped -32. Je n’ai rien trouvé sur le net sur ce sujet aussi si tu sais quel est le probleme, peux tu m’aider? Je laisse mon adresse email pour que tu puisses me repondre sans polluer ton blog

    J’aime

  4. Roger 18 juin 2016 / 19 h 04 min

    Bonjour,

    est possible de personnaliser le nom de l’expéditeur ?
    Merci d’avance

    J’aime

  5. Théo 6 juin 2016 / 8 h 25 min

    Bonjour, et merci pour votre tuto!

    J’utilise une clé Huawei 169 que je n’arrive pas à utiliser avec gammu. J’ai déjà utilisé gammu qui est très simple à configurer, mais je n’arrive pas à le faire fonctionner avec cette clé..
    J’ai un product code de 1001 (je ne sais pas ce que ça représente) :


    $ lsusb
    Bus 001 Device 004: ID 12d1:1001 Huawei Technologies Co., Ltd. E169/E620/E800 HSDPA Modem

    Et dans dmesg, l’USB est me semble t-il reconnu comme un stockage de masse :

    $ dmesg | grep usb
    [ 14.272869] usb-storage 1-1.4:1.0: USB Mass Storage device detected
    [ 14.273383] usb 1-1.4: GSM modem (1-port) converter now attached to ttyUSB0
    [ 14.273439] usb-storage 1-1.4:1.1: USB Mass Storage device detected
    [ 14.278335] usb 1-1.4: GSM modem (1-port) converter now attached to ttyUSB1
    [ 14.278418] usb-storage 1-1.4:1.2: USB Mass Storage device detected
    [ 14.281901] usb 1-1.4: GSM modem (1-port) converter now attached to ttyUSB2

    J’ai essayé de mettre gammu sur les trois dev, mais il me dit à chaque fois que le périphérique n’existe pas.
    Une idée?

    Merci d’avance 😀

    J’aime

  6. rfade02 23 mars 2016 / 16 h 26 min

    Bonjour,

    Merci, grace à ton tuto j’ai réussi à faire fonctionner ma clef huawei e1552, le script sendSMS.sh fonctionne aussi, mais je ne comprends pas :
    ./sendSMS.sh [ ]

    à la place de numero de téléphone j’ai mis le n° destinataire
    et fichier contenant le sms à envoyer le chemin du fichier txt à employer
    mais cela ne fonctionne pas
    par contre si je mets seulement ./sendSMS.sh cela fonctionne, mais j’aimerais envoyer des message différent suivant le cas, du coup comment faire ?

    J’aime

    • arno0x0x 23 mars 2016 / 16 h 33 min

      Salut,

      Peut-être ai-je mal compris ton problème, mais pour utiliser le script sendSMS.sh proposé dans cet article, il faut lui passer les paramètres en ligne de commande, à la suite, sans mettre les crochets ‘[‘ et ‘]’.

      Par exemple:

      ./sendSMS.sh 0601020304 message.txt
      

      Et de mettre le message dans le fichier message.txt

      Est-ce que c’est ça ton problème ?

      J’aime

Laisser un commentaire