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:

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

per Webservice#

Ich habe mich beim Webdienst Any-SMS 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. 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"

Tags:  Monitoring, Groovy, Java

Add new attachment

Only authorized users are allowed to upload new attachments.
« This page (revision-3) was last changed on 18-Sep-2011 21:57 by ThomasBayen