Envoyer des SMS

Sébastien Aperghis-Tramoni, sebastien@aperghis.net

Considérations légales

  • seulement pour un usage privé / audience limitée

  • envoi de SMS au public très réglementé

    • gestion des STOP

Contexte

  • sysadmin

  • astreinte

  • supervision

  • envoi d'alertes par SMS

Contexte

  • sites commerciaux d'envoi

    • Mblox, OVH, SMSMode, Twilio, 123-SMS...

  • API en SMPP ou HTTP

  • Net::SMPP, LWP, SMS::Send

  • efficaces, bon marché (~0,06 € / SMS)

  • mais un peu chers à la longue

Exemple

  • instabilité sur notre réseau inter-sites

  • 8 alertes de non réponse

  • 8 alertes de retour

  • 20 fois

  • => 320 SMS

  • une dizaine de destinaires

  • => ~200 € HT

Contexte

  • vraie raison : -Ofun

  • facile et amusant

  • coût faible

    • clé 3G minimale

    • Raspberry Pi

    • hub USB alimenté

Pilotage d'une clé 3G

  • première étape

    • passer la clé en mode modem avec usb_modeswitch

  • /dev/ttyUSB0

  • contrôlable avec des commandes Hayes (AT)

    • ITU-T V.250, V.251

    • ETSI GSM 07.05 (3GPP TS 27.005)

Commandes Hayes

  • ATI

  • AT+CPIN=0000

  • AT+CLCK="SC",0,"0000"

  • AT+CSQ

  • AT+CSMP=49,169,0,16

  • AT+CMGS="+336xxxxxxxx" <ENTER> texte ctrl-Z

Gestion

  • accès exclusif au port série

  • écrire un daemon de gestion

  • regarder ce qu'il existe déjà

Logiciels

  • Gnokii

  • SMS Server Tools 3

  • Gammu / Wammu

Gnokii

  • » http://gnokii.org/

  • paquet Debian : gnokii

  • gestion des appels, SMS, contacts, calendriers, logos, sonneries...

  • gnokii, xgnokii, gnocky

  • libgnokii, GSM::Gnokii

  • orientés gestion d'un téléphone / puce GSM

Gnokii - smsd

  • daemon d'envoi et réception de SMS

  • base de données SQL (SQLite, PostgreSQL, MySQL)

  • fichiers plats

    • envoi avec un fichier au format :

        number
        text
    • réception par exécution d'une commande :

        /path/to/program number date < text

SMS Server Tools 3

SMS Server Tools 3

  •   To: 336xxxxxxxx
      
      Un message tout à fait innocent
  •   To: 336xxxxxxxx
      Report: true
      
      Un message tout à fait innocent
      (mais on saura quand il aura été lu)
  •   To: 336xxxxxxxx
      Ping: true
  •   To: 336xxxxxxxx
      Flash: true
    
      Valider pour tout effacer

Gammu / Wammu

  • » https://wammu.eu/gammu/

  • paquets Debian : gammu, gammu-smsd

  • gestion des appels, SMS, contacts, calendriers...

  • gammu, Wammu

  • libGammu

  • orientés gestion d'un téléphone / puce GSM

Gammu - gammu-smsd

  • daemon d'envoi et réception de SMS

  • base de données SQL (PostgreSQL, MySQL, libDBI)

  • fichiers plats

  • envoi :

      gammu-smsd-inject TEXT 336xxxxxxxx -unicode \
          -text "C'est encore moi ! ♪~ ᕕ(ᐛ)ᕗ"
  • réception : directive RunOnReceive

Pilotage

  • service web (CGI) sur le Raspberry Pi

Pilotage

  #!/usr/bin/perl
  use strict;
  use warnings;
  use CGI;

  my $cgi = CGI->new;
  my $to  = $cgi->param("to");
  my $msg = $cgi->param("msg");
  my $uni = $msg =~ /[^\x20-\x7f]/;

  my $cmd = "/usr/bin/gammu-smsd-inject $to ";
  $cmd .= "-unicode" if $uni;

  my $tmpfile = "/tmp/text-pad.$$";
  open my $fh, ">", $tmpfile;
  print {$fh} $msg;
  close $fh;

  my $out = `$cmd < $tmpfile`;
  unlink $tmpfile;
  print $cgi->header(-type => "text/plain"), "rc: $?\n$out\n";

Pilotage

  • utilisable par un simple curl

  • exemple pour Zabbix :

      #!/bin/sh
      /usr/bin/curl -d "to=$1" -d "msg=$2" http://sms.yourdomain.local/cgi/smsgw.cgi

Supervision

  • « j'ai combien de barres ? »

  • surveiller la connexion au réseau GSM

  • AT+CSQ

  • gammu-smsd-monitor

  •   IMEI: xxxxxxxxxxxxxxx
      IMSI: xxxxxxxxxxxxxxx
      Sent: 448
      Received: 0
      Failed: 0
      BatterPercent: 100
      NetworkSignal: 71

Supervision

  • nombre de SMS envoyés, reçus, échoués

  • pourcentage de réception du réseau

  • excellentes données à grapher

  • pour garder une API classique en secours

Questions ?

Merci