NotrufSim (2) Praxis

Fortsetzung von (1) Idee

Widmen wir uns nun der praktischen Umsetzung. Ich setze voraus, dass ein paar Linux-Kenntnisse vorhanden sind, weshalb nicht alle Schritte ausführlich erklärt sind.

benötigte Hardware
  • RaspberryPi (getestet mit Modell B)
  • Gehäuse
  • Netzteil
  • MicroSD-Karte
  • WLAN-Dongle
  • SIP-Clients (Smartphone, VoIP-Telefon, alternativ Software-Client)
benötigte Software für den Raspberry
  • Raspbian
  • Asterisk
  • Apache2
  • PHP5
Grundeinrichtung
  1. Raspbian auf Speicherkarte übertragen und Installieren
    In dieser Anleitung wird als Hostename notrufsim angenommen
  2. Installation auf den neusten Stand bringen
    sudo apt-get update
    sudo apt-get upgrade
  3. Installation von Asterisk, Apache2 und PHP5
    sudo apt-get install asterisk apache2 php5
  4. Anlegen eines Ordners im Webserver für die Aufzeichnungen
    sudo mkdir /var/www/doku
    sudo chown 33:33 /var/www/doku
Konfigurieren von Asterisk

sudo nano /etc/asterisk/asterisk.conf 

In dieser Datei braucht primär nichts geändert zu werden. In dieser Anleitung wird von dieser Grundversion ausgegangen …

[directories](!)
astetcdir => /etc/asterisk
astmoddir => /usr/lib/asterisk/modules
astvarlibdir => /var/lib/asterisk
astdbdir => /var/lib/asterisk
astkeydir => /var/lib/asterisk
astdatadir => /usr/share/asterisk
astagidir => /usr/share/asterisk/agi-bin
astspooldir => /var/spool/asterisk
astrundir => /var/run/asterisk
astlogdir => /var/log/asterisk

[options]
documentation_language = en_US 

[compat]
pbx_realtime=1.6
res_agi=1.6
app_set=1.6
Die Endgeräte-Einstellung

sudo nano /etc/asterisk/sip.conf

Hier definieren wir unsere Telefone und ordnen sie verschiedenen Kontexten zu. Darauf basierend wird hinterher in der extensions.conf der Wählplan programmiert.

[general]
 allowguest=no
 port = 5060
 bindaddr = 0.0.0.0
 qualify = no
 ;disable = all
 allow = all
 videosupport = yes
 dtmfmode = rfc2833
 srvlookup = yes
 localnet=10.0.0.0/255.255.255.0
 directmedia = no
 nat = yes
 language=de
[1000]
 callerid=Leitstelle AMT <19222>
 permit=10.0.0.0/255.255.255.0
 type=friend
 context=lst-amt
 host=dynamic
 secret=1000
[1001]
 callerid=Leitstelle NOTRUF <112>
 permit=10.0.0.0/255.255.255.0
 type=friend
 context=lst-not
 host=dynamic
 secret=1001
[2000]
 callerid=Anrufer1 <2000>
 permit=10.0.0.0/255.255.255.0
 type=friend
 context=anrufer
 host=dynamic
 secret=2000
[2001]
 callerid=Anrufer2 <2001>
 permit=10.0.0.0/255.255.255.0
 type=friend
 context=anrufer
 host=dynamic
 secret=2001
Der Wählplan

sudo nano /etc/asterisk/extensions.conf

Hier ist die meiste Arbeit erforderlich. Ich habe ein paar Makros für die Anrufverarbeitung erstellt. Hier werden u.a. die Aufnahmen gestartet, nach Gesprächsende in den Webserver kopiert und das Calllog gefüttert.

Weiterhin sind die entsprechenden Rufnummern definiert:

  • Mit der 4-stelligen Nummer aus der sip.conf können alle Teilnehmer direkt angewählt werden. [direkt]
  • Mit 112 wird ein Anruf auf den Client 1001 initiert. Zuvor wird eine kleine Ansage abgespielt  und die Aufnahme gestartet und die CallerID modifiziert. [notruf]
  • Mit 19222 wird ein Anruf auf den Client 1000 initiert. Hier wird nur die CallerID modifiziert. Eine Aufzeichnung findet nicht statt. [amt]
  • Mit einer beliebigen mit 0 beginnden Rufnummer wird ein Anruf auf den Client 2000 initiert. [amt]
  • Mit **112 bzw **19222 kann man sich auf ein bestehendes Gespräch aufschalten und lauschen. [amt]
  • Versucht man vom Client 1001 (Notrufleitung) aus abgehende Gespräche zu führen, wird dies abgewiesen [block]

Im unteren Teil der Datei werden die Kontexte aus der sip.conf mit den hier beschriebenen Wählregeln verbunden.

[globals]
[general]

[macro-call]
exten => s,1,Verbose(Anrufdaten merken)
 ;same => n,Set(MONITOR_FILENAME=${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)}_${MACRO_EXTEN}-${CALLERID(num)})
 same => n,Set(MONITOR_EXTEN=${MACRO_EXTEN})
 same => n,Set(cid=${CALLERID(num)})
 same => n,Set(cname=${CALLERID(name)})

[macro-doku]
exten => s,1,Verbose(starte Aufzeichnung)
 same => n,Set(MONITOR_FILENAME=${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)}_${MACRO_EXTEN}-${CALLERID(num)})
 same => n,Playback(queue-youarenext)
 same => n,MixMonitor(${MONITOR_FILENAME}.wav)

[macro-endcall]
exten => s,1,Verbose(erstelle Info)
 same => n,TrySystem(echo "${STRFTIME(${EPOCH},,%Y%m%d)},${STRFTIME(${EPOCH},,%H%M%S)},${MONITOR_EXTEN},${cid},${cname},${DIALSTATUS},${ANSWEREDTIME},${REC_FILENAME}" >> /var/www/doku/calllog.csv)
 same => n,TrySystem(chmod 0664 /var/www/doku/*)

[macro-enddoku]
exten => s,1,Verbose(kopiere Aufzeichnung)
 same => n,System(lame -b 128 -m m -h /var/spool/asterisk/monitor/${MONITOR_FILENAME}.wav /var/www/doku/rec_${MONITOR_FILENAME}.mp3)
 same => n,Set(REC_FILENAME=rec_${MONITOR_FILENAME}.mp3)
 same => n,TrySystem(chmod 0664 /var/www/doku/*)

[block] ; Anrufe über die Notrufleitungen sperren
exten => _X.,1,PlayBack(conf-locked)
exten => _X.,n,HangUp

[direkt] ; Direkte Anwahl interner Teilnehmer
exten => _XXXX,1,Macro(call)
exten => _XXXX,n,Dial(SIP/${EXTEN})

[notruf] ; Routing für Notruf 112
exten => 112,1,Macro(call)
exten => 112,n,Macro(doku)
exten => 112,n,Set(CALLERID(all)=112: ${cid} ${cname} <${cid}>)
exten => 112,n,Dial(SIP/1001,,g)

[amt] ; Routing für Amtsanrufe
; 19222 => Leitstelle
exten => 19222,1,Macro(call)
exten => 19222,n,Set(CALLERID(all)=AMT: ${cid} ${cname} <${cid}>)
exten => 19222,n,Dial(SIP/1000,,g)

; beliebige => 2000
exten => _0X.,1,Macro(call)
exten => _0X.,n,Dial(SIP/2000)

; Mithören von 112 und 19222
exten => **112,1,ChanSpy(SIP/1001)
exten => **19222,1,ChanSpy(SIP/1000)

[hangup] ; Anrufdaten ins Log
exten => h,1,ExecIf($["${MONITOR_FILENAME}" != "" & "${ANSWEREDTIME}" > "15"]?Macro(enddoku))
exten => h,n,Macro(endcall)

[anrufer] ; Context für Anrufer
include => direkt
include => amt
include => notruf
include => hangup

[lst-not] ; Context für Leitstelle Notrufleitung
include => block

[lst-amt] ; Context für Leitstelle Amtsleitung
include => direkt
include => amt
include => notruf
include => hangup

sudo /etc/init.d/asterisk restart

weiter mit (3) WLAN-AP MIT DHCP