Je souhaite pouvoir envoyer des SMS à partir d'un PC sous Linux pour être averti d'un problème. exemple: Alerte Nagios en dehors des heures de présence, alerte coupure électrique signalée par l'UPS, détection d'intrusion, température trop élevée/basse …
Pour le modem 3G fourni par orange Business Everywhere de type clé USB modèle iCON225, il existe un driver appelé hso pour linux.
Télécharger et installer le module hso pour mon kernel
Comme cette clé a une fonction zeroCD (i.e. ses drivers windows sont stockés dans la clé elle-même, qui sera vue comme un périphérique de stockage et montée automatiquement lorsqu'on la brance dans un PC - si l'os est windows il lance l'autorun et installe les drivers – sinon ça ne sert a rien. cf article...), sous linux il nous faut désactiver le montage automatique sinon la clé n'est pas vue comme un modem.
On peut utiliser usb_switch comme dans l'article ci-dessus mais j'ai choisi reZero que je connais déjà Teléchargeable ici ....
Il va créer des règle udev qui empêchent le montage de la clé comme mémoire de masse lors de son insertion.
Pour tester l'installation, il suffit de connecter le modem usb, lancer minicom et le configurer pour utiliser /dev/ttyHS1 comme port série ceci c'est dans le cas d'un modem ICON225, pour d'autres modèles RTFM
Fermer puis relancer minicom pour qu'il utilise le bon port
Taper la commande "AT" puis Entrée
Il doit répondre OK sinon il faut revérifier …![]()
Les commandes AT classiques des bon vieux modems RTC sont toujours utilisées par les téléphones/modems gsm de dernière génération.
Tutorial sur les commandes AT pour SMS... En utilisant minicom, on peut envoyer les commandes AT manuellement:
| Commande AT | Description | Réponses |
|---|---|---|
| AT+CPIN? | Statut du code PIN | +CPIN: SIM PIN attente du code PIN![]() |
| AT+CPIN=1234 | Saisir le code PIN | OK | +CME ERROR: incorrect password Erreur de code PIN |
| AT+CSCA? | Afficher le numéro du service center Passerelle de SMS | OK | ![]() |
| AT+CMGF=1 | Passe en mode texte pour les SMS | OK | ![]() |
| AT+CMGS="+336123456789" | Envoi rapide de SMS au N°06123456789 en France | |
| >Hello | Ligne 1 du SMS | |
| >What's up doc? | Ligne 2 du SMS | +CMGS: n OK |
| >C U<ctrl+Z> | Ligne 3 et fin du message | OK |
AT+CMGF=0 ou 1. En mode 0 (dit PDU mode), les SMS sont envoyés encodés en hexa(160 caractères max) En mode 1 (dit Text mode), les SMS sont envoyés en mode texte/ascii (140 caractères max) par défaut mon modem gsm est en mode 0
Pour envoyer de façon simple les commandes AT au modem, il est assez facile d'utiliser perl qui a des bibliothèques adaptées: voici celle que j'ai installé sur ma machine ce sont des paquets de la distribution Debian Lenny
| libdevice-modem-perl | 1.47-2.1 |
| libdevice-serialport-perl | 1.04-2+b1 |
J'ai également installé Device::GSM le paquet n'est pas dans Debian Lenny. Libdevice-modem-perl est suffisant pour envoyer les commandes AT directement, mais il faut gérer soi-même les codes de retour, il est plus simple d'utiliser le module Device::GSM qui encapsule cela dans des commandes de plus haut niveau.
Pour installer Device:GSM, il suffit de suivre le manuel:
tar xvzf Device-Gsm-1.52.tar.gz cd Device-Gsm-1.52 perl Makefile.PL make make test make install (as superuser)
Il suffit ensuite d'écrire son petit programme en perl pour envoyer les SMS Ce code est fourni a titre d'exemple sans ucune garantie–Vérifiez que vous connaissez votre code PUK avant de faire des manipulations avec une carte SIM
#!/usr/bin/perl -w
## Syntaxe: gsm_sms.pl [<Numéro_destinataire> <Message>|<Numéro-destinataire>]
##
use strict;
use Device::Gsm;
# port série utilisé pour comuniquer avec le modem
my $myPORT='/dev/ttyHS1';
my $myPIN='0000'; ## Up to you!
# Message envoyé par défaut si pas passé en paramètre
my $myMSG="Hello depuis Device:GSM";
# Numéro du destinataire si pas passé en paramètre
my $DEST='+3368306xxxx';
my $PIN_LOCK_FILE="/tmp/GSM.lck";
# temps d'attente de réception du numéro de service center
my $TIMEOUT="30";
if ( $ARGV[1] ) {
$myMSG=$ARGV[1];
$DEST=$ARGV[0];
} elsif ( $ARGV[0] ) {
$myMSG=$ARGV[0];
}
# l'option log=>'syslog' est très verbeuse, la réserver pour deboguage
# my $gsm = new Device::Gsm( port => $myPORT, pin=>$myPIN , log=>'syslog' );
my $gsm = new Device::Gsm( port => $myPORT, pin=>$myPIN);
if( $gsm->connect() ) {
# print "Modem connecté!\n";
} else {
print "Il ne semble pas y avoir de modem sur $myPORT\n";
exit 1;
}
# Register to GSM network (you must supply PIN number in above new() call)
if ( -e $PIN_LOCK_FILE ){
print "Le code PIN précédent était faux!! Vérifier le code PIN dans le script.\n";
print "Vous pourrez ensuite effacer le fichier $PIN_LOCK_FILE\n";
exit 1;
} else {
if ( ! $gsm->register() ) {
print "Code PIN INCORRECT!\n";
open PLF, ">", ${PIN_LOCK_FILE} or die "Impossible de créer le fichier $PIN_LOCK_FILE: $!\n";
printf PLF "Erreur de code PIN! VERIFIER LE SCRIPT AVANT DE SUPPRIMER CE FICHIER\n";
close(PLF);
exit 1;
}
}
## Affiche le numéro du service center que le modem utilisera
## A l'initialisation de la clé, elle n'a pas tout de suite le numéro du service center
print "Attente de réception du Numéro de service center par le réseau: ";
TmOUT: for (my$i=1;$TIMEOUT;$i++) {
my $srv_cnt = $gsm->service_center();
#print "Service center: $srv_cnt";
while ( $srv_cnt eq '0' || $srv_cnt eq '' ) {
sleep 1;
print ".";
next TmOUT;
}
print "\n";
print "Numéro du service center: $srv_cnt\n";
last TmOUT;
}
# Send quickly a short text message
$gsm->send_sms(
recipient => $DEST,
content => $myMSG
);
# Get list of Device::Gsm::Sms message objects
# see `examples/read_messages.pl' for all the details
#my @messages = $gsm->messages();