SMS via modem gsm sous linux

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 …

Mais comment vais-je faire?

  1. Quel driver utiliser ?
  2. Il faut programmer en C ?
  3. Il faut externaliser: j'ai vu une boîte qui dit qu'ils sont leader du marché ?
  1. si modem série… rien sinon il faut un driver
  2. Non! sauf si tu le veux/vaux bien ….
  3. LOL

Clé usb ICON225

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 …;-)

AT! AT! AT!

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
FIXME
AT+CPIN=1234Saisir le code PINOK | +CME ERROR: incorrect password Erreur de code PIN
AT+CSCA?Afficher le numéro du service center
Passerelle de SMS
OK | FIXME
AT+CMGF=1Passe en mode texte pour les SMSOK | FIXME
AT+CMGS="+336123456789"Envoi rapide de SMS au N°06123456789 en France
>HelloLigne 1 du SMS
>What's up doc?Ligne 2 du SMS+CMGS: n OK
>C U<ctrl+Z>Ligne 3 et fin du messageOK

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)

Exemple de script

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();

Liens utiles

linux/envoi_de_sms_via_linux.txt · Dernière modification: 2009/08/07 12:57 par franck
Haut de page
CC Attribution-Noncommercial-Share Alike 3.0 Unported chimeric.de = chi`s home Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0