.titleBar { margin-bottom: 5px!important; }

[HowTo] SMS empfangen(ISDN/CAPI) per E-Mail ausliefern, Voicemail-Benachrichtigung per SMS

Dieses Thema im Forum "Asterisk Allgemein" wurde erstellt von genbian, 4 Feb. 2012.

  1. genbian

    genbian Neuer User

    Registriert seit:
    31 Mai 2009
    Beiträge:
    35
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Hallo,
    ich wollte mal zusammenfassend im Internet hinterlegen, wie man im Jahre 2012 Kurznachrichten wie man sie vom Handy her kennt (SMS) mit dem Asterisk über das Festnetz verarbeitet.

    Ich habe folgendes realisiert:
    • Asterisk nimmt für eine MSN-ISDN-Telefonnummer SMS von außen entgegen. (Genauer: diejenigen die von der SMS-Zentrale der Telekom 0193010 kommen.) Diese werden per E-Mail ausgeliefert.
    • Asterisk versendet eine SMS wenn für eine bestimmte Mailbox eine neue Nachricht aufgesprochen wurde.

    Verwendetes System:
    Debian 6.0.3 squeeze Linux 2.6.32-5-amd64
    FritzCard PCI 2.0 -> capi 2.0 [1][2]
    Asterisk 1.6.2.9-2+squeeze4 (selbst kompiliert wegen smsq und sms_app)

    Ich gehe davon aus, dass Asterisk schon per chan_capi o.ä. telefonieren kann.
    Um SMS mit dem Asterisk verarbeiten zu können muss er für Debian neu kompiliert werden, da das benötigte Kommandozeilenprogramm "smsq" und die Asterisk application "sms" bei Debian squeeze einfach fehlen.
    Nach folgender Anleitung:
    Auf http://packages.debian.org/squeeze/asterisk nachschauen wie die URLs zu den Quelltextpaketen/dateien ist um diese runterzuladen. Momentan:
    Code:
    http://security.debian.org/debian-security/pool/updates/main/a/asterisk/asterisk_1.6.2.9-2+squeeze4.dsc
    http://security.debian.org/debian-security/pool/updates/main/a/asterisk/asterisk_1.6.2.9.orig.tar.gz
    http://security.debian.org/debian-security/pool/updates/main/a/asterisk/asterisk_1.6.2.9-2+squeeze4.debian.tar.gz
    Nun die nötigen Entwickler-Pakete dafür installieren:
    Code:
    sudo apt-get build-dep asterisk
    Und ganz sicher gehen, dass das notwendige dev-Paket welches smsq braucht:
    Code:
    sudo apt-get install libpopt-dev
    Nun kann man den runtergeladenen Quellcode entpacken und von den Debian-Paket-Tools kompilieren und zu einem Debian-Paket schnüren lassen.[3]
    Code:
    dpkg-source -x asterisk_1.6.2.9-2+squeeze4.dsc
    cd asterisk_1.6.2.9
    dpkg-buildpackage -uc -us -rfakeroot
    
    Ist alles ohne Fehler durchgelaufen kann das selbstgebaute Paket installiert werden:
    Code:
    sudo dpkg -i ../asterisk_1.6.2.9-2+squeeze4_amd64.deb
    Das sollte den Asterisk auch neugestartet haben.
    Der Syntax von smsq ist z.B. in [5],[4] genannt. In der Kommandozeile kann man es wie folgt ausprobieren (als root eingeloggt, da smsq unter dem Benutzer von asterisk ausgeführt werden muss, ansonsten sind die davon erzeugten Dateien in /var/spool/asterisk/... mit falschen Rechten behaftet):
    Code:
    su asterisk -s /bin/bash -c "/usr/sbin/smsq --motx-channel=CAPI/ISDN1/+4969XXXXXXX:0193010 --da=+49171YYYYYYYYY --ud='testext4 a b äö ß sowohl ¤ und so@ dsfi746 eot'"
    Hierbei sollte man natürlich die verwendete MSN und den CAPI-channel bei --motx-channel anpassen. Die 0193010 ist das "SMS-Zentrum" der Telekom, welches die SMS dann an die Zielrufnummer übermittelt. Natürlich kostet dies Geld[6]-[9], Preise in [9].
    --da will die Ziel(handy)nummer haben. --ud hält den Text selber.
    Weitere SMS-Zentren werden als Dienstleistung, zu anderen Kosten, von anderen Firmen betrieben z.B.:
    09003266900 von "Materna Communication" www.sms-im-festnetz.de

    Sollte die Test-SMS angekommen sein, kann man nun im Dialplan (extensions.conf) etwas sinnvolles einrichten. Im Kontext für eingehende ISDN-Anrufe z.B. die Weiterleitung eingehender SMS aus dem SMS-Zenrum 01930100 an die Telefonnummer +4969XXXXXXX, welche natürlich anzupassen ist (Das SMS-Zentrum hat wenn es eine SMS abliefert eine Null mehr!):
    Code:
    ; SMS Empfang über die Telekom SMS-Zentrale /genbian 2.2.2012
    ; basierend auf: http://www.ip-phone-forum.de/showthread.php?t=72181
    ;korrigierte/personalisierte Version:
    exten => +4969XXXXXXX/01930100,1,Verbose(Receiving SMS from ${CALLERIDNUM})
    exten => +4969XXXXXXX/01930100,2,Answer
    exten => +4969XXXXXXX/01930100,3,Wait(1)
    exten => +4969XXXXXXX/01930100,4,SMS(sms${EXTEN},a)
    ; hier Variablen zur angewählten extension holen (unten z.b. ${MYEMAIL} ; quatsch! per Hand hart kodiert /genbian 02.02.2012
    ;exten => +4969XXXXXXX/01930100,5,Macro(user${EXTEN})
    
    ; smsq liefert diese vars: $ud (user data), $scts (time date), $oa (sender), $mr (ms reference) 
    exten => +4969XXXXXXX/01930100,n,System(smsq --process="/etc/asterisk/smssendpermail.sh \"${EXTEN}\"" --queue=sms${EXTEN})
    exten => +4969XXXXXXX/01930100,n,Hangup
    
    Hier ist schlechter Stil am Werk nach /etc/ gehören keine Skripte und Programme.
    Nun die E-Mailadresse anpassen in
    /etc/asterisk/smssendpermail.sh
    Code:
    #!/bin/sh
    #needs one argument: the Number that picked up the call (${EXTEN} in Asterisk)
    PICKEDUPNUMBER="${1}"
    printf "Neue SMS eingegangen.\n\n\t Von: ${oa}\n\t  An: ${PICKEDUPNUMBER}\n\tZeit: ${scts}\n${ud}\n\n"| mail -s 'SMS empfangen' mail@invalid.invalid
    smssendpermail.sh setzt natürlich ein korrekt eingestellten Mail-Agenten auf dem Asterisk-Rechner vorraus. Z.B. exim4 mit sendmail. Dies möge man sich selber raussuchen.


    Versand SMS bei Eingang einer Nachricht auf dem Anrufbeantworter.
    In [10]
    /etc/asterisk/voicemail.conf
    Code:
    externnotify=/etc/asterisk/smssendpersmsvoicemailnotify.sh
    
    somit wieder schlechter Stil:[11]
    smssendpersmsvoicemailnotify.sh
    Code:
    #!/bin/bash
    #externnotify geht in voicemail.conf nur global, also muss hier intelligenz rein, wo die SMS hin soll, je nachdem in welcher mailbox ($EXTEN) die Nachricht einging!
    
    CONTEXT=$1
    # $1 this is not the context the user is in voicemail.conf. This is the context the call was in, when voicemail was recorded. So most likely this will be "vm".
    EXTEN=$2
    # $2 is the voicemail box number. Not the extension which was called.
    NUMVMS=$3
    SMSCENTER=0193010
    DIALCHANNEL="CAPI/ISDN1/+4969XXXXXX"
    TARGETCELLPHONENUMBER1=+49171XXXXXX
    MAILBOXNUMBER1=78
    VMCONTEXTNUMBER1=default
    
    #mostly from DougP http://www.voip-info.org/wiki/index.php?page_id=75&comments_page=1
    #modified to send text message via smsq and not some smtp<->sms gateway service. /genbian 2012-02-03
    
    #SmsPhone takes 2 arguments the Phonenumber where the SMS should go to, and the text message itself.
    function SmsPhone ()
    {
      echo begin SmsPhone $1 $2 ${SMSCENTER} - mit smscenter
      PHONE=$1
      SMSBODY=$2
      /usr/sbin/smsq --motx-channel=${DIALCHANNEL}:${SMSCENTER} --da=${PHONE} --ud="${SMSBODY}"
    }
    
    #CheckNew takes 4 arguments: the Extension(well the voicemailnumber), a phone number where the sms should go to, the number of voicemails and the voicemail context.
    function CheckNew ()
    {
      echo begin of CheckNew $1 $2 $3 $4
      dn=`date +%s`
      fo=0
      t=
      #variables are initialised
    
      #check for the voicemails and gather info about each
      for a in `ls /var/spool/asterisk/voicemail/$4/$1/INBOX/*.txt | sort -r`; do
        echo in for loop $a
        cid=`grep callerid= $a | cut -f2- -d=`
        dt=`grep origdate= $a | cut -f2- -d= | cut -d' ' -f2,3,4`
        tm=`grep origtime= $a | cut -f2- -d=`
        cd=`grep duration= $a | cut -f2- -d=`
        td=`expr $dn - $tm`
        echo $tm -  $dn = $td
      # check if the message is younger than 60 s, if yes, we need to notify the user by SmsPhone!
        if (( $td < 60 )) ; then
          t="$t$cid $dt - $cd seconds"
          fo=1
         else
          t="$t,$cid $dt"
        fi
      done
      # if there is a message younger than 60 s send sms:
      if [ "$fo" == "1" ]; then
        SmsPhone "$2" "Voicemail ($3) $t"
      fi
    }
    
    
    # The Script itself is very short:
    # Check if the $EXTEN is the one who has defined a sms cellphone number and check for new messages.
    if [ "$EXTEN" == "$MAILBOXNUMBER1" ] ; then
     CheckNew $EXTEN $TARGETCELLPHONENUMBER1 $NUMVMS $VMCONTEXTNUMBER1
    fi
    
    Etwas verschachtelt, so kann man es gut erweitern. Insbesondere der eigentliche Check ganz unten, ob die Mailboxnummer die ist, für die oben eine Telefonnummer definiert ist kann wiederholt und verbessert werden um mehrere Mailboxen zu verschiedenen Telefonnummern zu mappen. Hierbei ist zu beachten, dass man in diesem Skript keine Information von außen über den [CONTEXT] in dem die Mailboxnummer in voicemail.conf definiert ist mitgeliefert bekommt. Somit sollten die Mailboxnummern über alle voicemail-Kontexte unverwechselbar sein. Ansonsten holt das Skript die voicemail Infos aus falschen Ordnern in /var/spool/asterisk/voicemail/
    und versendet somit Infos eines Users an einen vollkommen anderen.


    Sehr schöne weitere Ideen, wie SMS von SIP-Telefonen annehmen und entsprechend verteilen sind in [12] zu finden. Auch das umgekehrte, SMS aus dem Festnetz annehmen und an SIP-Telefone verteilen ist dort beschrieben.

    Grüße
    genbian


    [1] http://belug.de/hilfe-howtos-fcpci.html
    [2] http://www.voip-info.org/wiki/view/Asterisk+How+to+connect+with+CAPI
    [3] http://linuxwiki.de/dpkg/SelbstKompilieren
    [4] http://www.voip-info.org/wiki/view/Asterisk+cmd+Sms
    [5] http://docs.huihoo.com/asterisk/1.6.2.1/node252.html
    [6] http://www.telekom.de/sms
    [7] http://hilfe.telekom.de/hsp/cms/con...e/theme-62519417/SMS-im-Festnetz/faq-62536185
    [8] http://hilfe.telekom.de/hsp/cms/content/HSP/de/12556/Startseite/SMS
    [9] http://www.telekom.de/hsp/sms-mms/agb-und-preise
    [10] http://www.voip-info.org/wiki/view/Asterisk+config+voicemail.conf
    [11] http://www.voip-info.org/wiki/index.php?page_id=75&comments_page=1
    [12] http://faked.org/wiki/Asterisk/SMS