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

genbian

Neuer User
Mitglied seit
31 Mai 2009
Beiträge
35
Punkte für Reaktionen
0
Punkte
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' [email protected]
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
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.