Raspberry Pi : envoyer des SMS sans 3G et gratuitement

Pour un projet, j’ai besoin d’envoyer des SMS lorsque certaines conditions sont réunies. Les tutoriels sur l’envoi de SMS par Raspberry Pi prévoient l’utilisation d’une clé 3G et une carte SD d’un opérateur mobile pour que le Pi dispose d’un numéro de téléphone mobile et puisse envoyer des SMS.

J’ai finalement trouvé 3 solutions :

  • lorsque le destinataire du SMS dispose d’un abonnement FREE, on utilise l’API de notification SMS FREE. C’est la solution la plus simple.
  • Sinon, on peut utiliser IFTTT pour envoyer des SMS lorsque certains événements se produisent. Je l’ai fait pendant longtemps. Le gros inconvénient est que IFTTT n’est pas fiable. Il arrive qu’on ne reçoive le SMS que le lendemain. Cà n’est pas acceptable lorsqu’on veut pouvoir alerter.
  • Enfin, on peut utiliser un agenda google, y créer un événement dès que les conditions prévues sont réunies. Si on a correctement paramétré l’agenda, il enverra un SMS à un destinataire.

Je présente ici les 3 solutions, avec un script PHP placé sur un Raspberry Pi.

Avant de commencer : installer PHP sur le Raspberry Pi

Pour savoir si PHP est installé :

php -v

Si il n’est pas installé :

apt-get update
apt-get upgrade
sudo apt-get install php5 libapache2-mod-php5 -y

Et si curl n’est pas installé :

apt-get install php5-curl

La solution pour un mobile Free

Cette solution très simple ne fonctionne que pour envoyer un SMS à un téléphone FREE.

Obtenir les identifiants de l’API Free

On suit les instructions de « Nouvelle option « Notifications par SMS » chez Free Mobile » pour activer l’option (gratuite) et obtenir une clé d’identification au service. On note aussi notre identifiant d’utilisateur Free Mobile. On obtient les informations suivantes (fausses évidemment mais ressemblantes) :

Utilisateur 12345678
Clé d’Identification KZuaj37069LOSn

Tester l’envoi de SMS via un navigateur

Mettre l’url suivante dans un navigateur internet :

https://smsapi.free-mobile.fr/sendmsg?user=12345678&pass=KZuaj37069LOSn&msg=Bonjour%20Monde%20!

Je reçois un SMS avec « Bonjour Monde ! » comme contenu.

Créer un script PHP pour envoyer le SMS à partir d’un Pi

Créer un fichier test-free-sms.php, avec droits 744 contenant le code suivant :

#!/usr/bin/php

<?php

/* MODIFIER VOS INFORMATIONS ici */
$free_mobile_id = 'YOUR_ID' ;
$free_mobile_key = 'YOUR_KEY' ;

$message = "Bonjour à vous !" ;

$sms_free = al_pi_send_free_mobile_sms( $free_mobile_id, $free_mobile_key, $message  ) ; 

print_r( $sms_free ) ;


function al_pi_send_free_mobile_sms( $id, $key, $txt) {

	/* on doit constituer une url du type
	* https://smsapi.free-mobile.fr/sendmsg?user=12345678&pass=KZuaj37069LOSn&msg=Bonjour%20Monde%20!
	*/
	$url = 'https://smsapi.free-mobile.fr/sendmsg?user=' ;
	$url .= $id ;
	$url .= '&pass=' ;
	$url .= $key ;
	$url .= '&msg=' ;
	$url .= rawurlencode( $txt ) ;

	// envoyer l'url avec une commande CURL
	$ch = curl_init( $url )  ;   
	$timeout = 5;
	
	curl_setopt( $ch, CURLOPT_URL,$url );
	curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );			// return web page = true	
	curl_setopt($ch, CURLOPT_VERBOSE, 1);
	curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, $timeout );  	// time-out on connect
	curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, 120 );		// time-out on response

	$data = curl_exec( $ch );
	
	// vérifier que tout s'est bien passé 
	// http://php.net/manual/fr/function.curl-getinfo.php
	if(!curl_errno($ch)) {
		$info = curl_getinfo($ch);
		print_r( $info ) ;
	}	
	
	curl_close( $ch );
	return $info;

}

Avant d’exécuter le code, placer vos identifiants en haut du code. Puis, dans le Pi, en ligne de commande, exécuter :

./test-free-sms.php

Je reçois un SMS dans lequel le « à » a disparu si j’ai oublié d’encoder le fichier en utf8.

Et le contenu de $sms_free est :

On pourra donc créer un message selon le résultat en ajoutant :

if ( $sms_free['http_code'] === 200 ) {
	echo "success \r\n" ; 
} else {
	echo "echec \r\n" ; 
}

Et voilà pour cette solution simple.

La solution avec IFTTT

Pour que les recettes IFTTT fonctionnent, il faut les créer : bouton « create recipe » puis :

  1. cliquer sur « THIS »
  2. Choose trigger channel : ‘maker’ (noter la clé de maker)
  3. Cliquer sur receive a web request
  4. event name = ‘Pi_Manquant’ puis “create trigger”.
  5. cliquer sur “THAT”
  6. Channel ‘Android SMS’ puis cliquer sur “send an SMS” et indiquer le numéro de mobile (avec le code 33 pour la france avant, sans le 0, 33611111111) puis définir les paramètres, en particulier comment utiliser value1, value2 et value3.

Ensuite il « suffit » d’envoyer la requête sous la forme suivante pour que l’événement soit déclenché et la recette IFTTT se réalise !

http://maker.ifttt.com/trigger/Pi_Manquant/with/key/YOUR_KEY?value1=fuel&value2=%22Sunday%2004%2010%202015%2006:20:01%20CEST%22&value3=2400

Noter aussi qu’IFTTT permet de faire plein de choses, comme nous prévenir qu’il va pleuvoir demain ou, plus utile, envoyer un mail lorsque notre mobile reçoit un SMS.

On crée un fichier test-ifttt.php contenant :

#!/usr/bin/php

<?php

/* MODIFIER VOS INFORMATIONS ici */
$maker_channel_key = 'VOTRE_CLE' ;

$event = 'pi_missing' ;
$value1 = "Pi hostname" ;
$value2 = "VALEUR 2" ;
$value3 = "valeur 3" ;

$ifttt = al_pi_send_ifttt( $maker_channel_key, $event, $value1, $value2, $value3  ) ; 

if ( $ifttt['http_code'] === 200 ) {
	echo "success \r\n" ; 
} else {
	echo "echec \r\n" ; 
}


function al_pi_send_ifttt( $key, $event, $val1, $val2, $val3 ) {

	/* on doit constituer une url du type
	* http://maker.ifttt.com/trigger/Pi_Manquant/with/key/YOUR_KEY?value1=fuel&value2=%22Sunday%2004%2010%202015%2006:20:01%20CEST%22&value3=2400
	*/

	// encoder les valeurs
	$data = '?value1=' ;
	$data .= urlencode( $val1 );
	$data .= "&value2='";
	$data .= urlencode( $val2 );
	$data .= "'&value3=";
	$data .= urlencode( $val3 );
		
	// encoder l'url complète
	$url = 'http://maker.ifttt.com/trigger/' ;
	$url .= rawurlencode( $event ) ;
	$url .='/with/key/';
	$url .= rawurlencode( $key ) ;
	$url .= $data ;

	// envoyer l'url avec une commande CURL
	$ch = curl_init( $url )  ;   
	$timeout = 5;
	
	curl_setopt( $ch, CURLOPT_URL,$url );
	curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );			// return web page = true	
	curl_setopt($ch, CURLOPT_VERBOSE, 1);
	curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, $timeout );  	// time-out on connect
	curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, 120 );		// time-out on response

	$data = curl_exec( $ch );
	
	// vérifier que tout s'est bien passé 
	// http://php.net/manual/fr/function.curl-getinfo.php
	if(!curl_errno($ch)) {
		$info = curl_getinfo($ch);
		// print_r( $info ) ;
	}	
	
	curl_close( $ch );
	return $info;

}

Ensuite dans la ligne de commande du Pi :

./test-ifttt.php

Et on déclenche l’événement

Sur ifttt.com, on peut voir le log de chaque « recette ». Par exemple j’ai vu que l’événement Maker Event « pi_missing » s’est bien déclenché. Mais le SMS arrivera quand IFTTT voudra bien… (c’est gratuit, on ne doit pas se plaindre).

Je trouve par contre que IFTTT fonctionne très bien avec la chaîne GMAIL et envoie des mails immédiatement. Mais si on doit envoyer un message à quelqu’un qui n’a pas de forfait de données sur son téléphone, IFTTT peut quand même être utile, même s’il n’est pas fiable.

La solution avec un agenda Google

Créer un calendrier « spécial Pi » sur google agenda

Dans mon agenda Google, dans la barre latérale de gauche, cliquer sur la flèche à droite de « Mes agendas » et choisir « créer un agenda ». Donner un nom à l’agenda (par exemple « Pi Nautilus ») puis « Créer ». L’agenda est maintenant visible sur le côté gauche, dans la liste des agendas.

Modifier les notifications

Cliquer sur la flèche à droite de l’agenda « Pi Nautilus » et choisir « paramètres » puis aller dans l’onglet « modifier les notifications ».

Agenda Google : régler pour notifier par SMS

Si on veut définir un autre numéro de téléphone comme destinataire du SMS, on clique sur le lien « configuration du mobile ».

A ce stade, si quelqu’un crée ou modifie un événement, le téléphone défini reçoit un SMS.

On peut créer des événements automatiquement par un programme. Cette solution, dans laquelle un Pi crée un événement, lorsque certaines conditions sont réunies, est expliquée dans l’article Interagir avec L&rsquo;agenda Google via l&rsquo;API (OAuth 2.0) .

Et maintenant ?

Vivement que tous les opérateurs de téléphonie mobile fassent comme Free et proposent une API d’envoi de SMS !

Poster un Commentaire

avatar
  S’abonner  
Notifier de