!!! SMS-Versand

Manchmal möchte man aus einem Programm oder einem Skript heraus eine SMS versenden. Insbesondere zum [Monitoring] ist das sehr wichtig. Prinzipiell gibt es verschiedene Methoden: 

# Man kann ein angeschlossenes Handy (MitDemHandyInsInternet) als Modem benutzen und über spezielle Befehle  ([SMSFormat]) SMS absetzen.
# Man kann (wenn ich mich recht erinnere) über eine direkte API und einen UMTS-Stick SMS versenden (muss man aber nochmal genauer recherchieren)
# Man kann einen Webservice nutzen, der die SMS verschickt.

!! per Webservice

Ich habe mich beim Webdienst [Any-SMS|http://www.any-sms.info/] angemeldet. Dort muss man einen kleinen Betrag vorauszahlen (mindestens 10 Euro) und kann dann ab ca. 3 ct (je nach Service-Qualität) SMS über eine Webschnittstelle versenden. Neben der Webschnittstelle, die schön z.B. für den Massenversand von Informationen oder Werbung ist, gibt es auch eine WEB-API. Diese ist gut dokumentiert und eigentlich recht einfach aufgebaut. Man kann einfache SMSe per __wget__ versenden. Das folgende [Groovy]-Skript zeigt, wie man es in einer Skript-Sprache machen kann (eine Umsetzung in [Java] sollte auch kein Problem sein.

Nachteil dieser Methode, insbesondere zum [Monitoring] ist, das man einen funktionierenden Internet-Anschluss benötigt. D.h., falls der Internet-Anschluss oder der Router oder ein Switch auf dem Weg dahin ausfällt, erfährt man das leider nicht...


{{{
  #!/usr/bin/groovy
  //
  // SMS-Versand per any-sms in Groovy
  //
  
 class SmsVersand{
  static main(args){  
    // Konfiguration
    def id       = '123456'
    def pass     = 'meinapipasswort'
    // Absender darf nur 11 Zeichen haben, kann eine Telefonnummer oder Text sein
    def absender = 'Icinga'
  
    def gateway  = 20
    def url      = 'http://gateway.any-sms.biz/send_sms.php'
  
    // Parameter einlesen
    //def nummer   = '01638641980'
    //def text     = 'Test-Text des SMS-Versendeprogramms äöüÄÖÜ-ß-€- ätsch!'
    def nummer   = args[0]
    def text     = args[1]
  
    // URL-Encoding des Textes
    // Umlaute müssen mit dem ISO-8859-11 Wert kodiert sein
    // (wer mir erklärt, wie das mit Umlauten richtiger geht, nur her damit!)
    text=URLEncoder.encode(text)
    text=text.replaceAll(/%C3%A4/,'%E4')
    text=text.replaceAll(/%C3%B6/,'%F6')
    text=text.replaceAll(/%C3%BC/,'%FC')
    text=text.replaceAll(/%C3%84/,'%C4')
    text=text.replaceAll(/%C3%96/,'%D6')
    text=text.replaceAll(/%C3%9C/,'%DC')
    text=text.replaceAll(/%C3%9F/,'%DF')
    text=text.replaceAll(/%E2%82%AC/,'%80')
  
    // URL zusammensetzen
    def gesamturl="$url?id=$id&pass=$pass&gateway=$gateway&nummer=$nummer&absender="+
    URLEncoder.encode(absender)+"&text=$text&test=0&xml=1"
    //println gesamturl
  
    // Verbindung herstellen
    def conn = new URL(gesamturl).openConnection()
    def result = conn.inputStream.getText()
    //println result
  
    def jetzt=new Date()
    def format=new java.text.SimpleDateFormat('yyyyMMdd_HHmmss')
    def logdir=new File("/var/log/sms/")
    logdir.mkdir()
    def outfile=new File(logdir.getPath()+"/"+format.format(jetzt))
    outfile.write(gesamturl)
    outfile.append("\n")
    outfile.append(result)
  
    result = new XmlSlurper().parseText(result)
    if(result.error != 0){
      System.exit 100
    }
  
    println "Restguthaben: $result.guthaben"
    System.exit 0
  
    }
  }
}}}


!! per USB-Stick oder angeschlossenem Handy

Da ein USB-Stick ja eigentlich auch eine Art Handy ist, kann man mit diesem (oder auch mit einem normalen Handy, das z.B. per USB-Kabel angeschlossen ist), natürlich auch SMS versenden. Hierzu gibt es das recht ausgereifte Paket [Wammu/Gammu|http://wammu.eu/]. Es gibt drei Möglichkeiten, hiermit umzugehen:

* '''Wammu''' ist ein Fensterorientiertes Programm, das man gut für die ersten Schritte nehmen kann. Es erlaubt, vielfältige Daten mit dem Telefon auszutauschen. Insbesondere erlaubt es auch, per Eingabe einer Nummer und eines Texts in einem Fenster den Versand von SMS. Es legt beim ersten Start per Wizard eine Konfiguration an, die zum Telefon passt. Diese wird dann später auch von gammu verwendet.
* '''gammu''' ist ein Kommandozeilentool, das alle Fähigkeiten der Bibliothek auf der Kommandozeile eröffnet.
* '''gammu-smsd''' ist ein Server, der automatisiert SMS empfängt und sendet. Es arbeitet mit einer Datenbank, auf die man dann auch von außen zugreifen kann, um SMSe zu versenden oder zu empfangen.

! Gammu

Da nichts so schön ist wie ein Beispiel hier ein SMS-Versand mit gammu:

  gammu sendsms text 01631234567 -text "SMS vom Icinga-Server"


! Gammu-SMSD

Wenn der Daemon installiert ist, kann man sich aussuchen, ob man den vorhandenen File-Provider zur Ablage der Daten benutzt oder die Daten lieber in eine Datenbank schreibt. Ich habe hierzu eine PostgreSQL-Datenbank benutzt. Leider muss man die Struktur der Datenbank "von Hand" erzeugen. Dabei war zu beachten, das Debian Squeeze das Gammu-PAket in Version 1.28.0 benutzt. Dieses benutzt die Datenbank-Struktur in der Version 11. Aktuell in der Doku auf der Webseite ist die Version 13. Also nicht einfach das SQL-Skript von der Webseite nehmen, sondern hübsch ein passendes Source-Paket suchen und daraus die richtige Version ziehen.

Nun kann man per SQL mit folgendem Befehl eine SMS versenden:

  INSERT INTO "outbox" ("textdecoded","destinationnumber","creatorid") VALUES ('Test-Text per SMSD','016312345678','')

Wer es jetzt immer noch auf der Kommandozeile mag, nimmt dazu einen Befehl, der die SMS nicht selber versendet, aber sie in die konfigurierte Datenbank schreibt:

  gammu-smsd-inject TEXT 016312345678 -text "All your base are belong to us"

  

[{Tag Monitoring Groovy Java}]