{"id":25,"date":"2015-10-19T08:55:06","date_gmt":"2015-10-19T06:55:06","guid":{"rendered":"http:\/\/blog.0link.net\/?p=25"},"modified":"2015-10-23T10:51:24","modified_gmt":"2015-10-23T08:51:24","slug":"notrufsim-2-umsetzung","status":"publish","type":"post","link":"https:\/\/blog.0link.net\/index.php\/2015\/10\/19\/notrufsim-2-umsetzung\/","title":{"rendered":"NotrufSim (2) Praxis"},"content":{"rendered":"<p><em>Fortsetzung von <a href=\"http:\/\/blog.0link.net\/index.php\/2015\/10\/18\/notrufsimulator\/\">(1) Idee<\/a><\/em><\/p>\n<p>Widmen wir uns nun der praktischen Umsetzung.\u00a0<span style=\"color: #ff0000;\">I<strong>ch setze voraus, dass ein paar\u00a0Linux-Kenntnisse vorhanden sind, weshalb nicht alle Schritte ausf\u00fchrlich erkl\u00e4rt sind.<\/strong><\/span><!--more--><\/p>\n<h5>ben\u00f6tigte Hardware<\/h5>\n<ul>\n<li>RaspberryPi (getestet mit Modell B)<\/li>\n<li>Geh\u00e4use<\/li>\n<li>Netzteil<\/li>\n<li>MicroSD-Karte<\/li>\n<li>WLAN-Dongle<\/li>\n<li>SIP-Clients (Smartphone, VoIP-Telefon, alternativ Software-Client)<\/li>\n<\/ul>\n<h5>ben\u00f6tigte Software f\u00fcr den Raspberry<\/h5>\n<ul>\n<li>Raspbian<\/li>\n<li>Asterisk<\/li>\n<li>Apache2<\/li>\n<li>PHP5<\/li>\n<\/ul>\n<h5>Grundeinrichtung<\/h5>\n<ol>\n<li>Raspbian auf Speicherkarte \u00fcbertragen und Installieren<br \/>\nIn dieser Anleitung wird als Hostename <code>notrufsim<\/code>\u00a0angenommen<\/li>\n<li>Installation auf den neusten Stand bringen<br \/>\n<strong><code>sudo apt-get update<\/code><\/strong><br \/>\n<strong><code>sudo apt-get upgrade<\/code><\/strong><\/li>\n<li>Installation von Asterisk, Apache2 und PHP5<br \/>\n<strong><span style=\"color: #339966;\"><code>sudo apt-get install asterisk apache2 php5<\/code><\/span><\/strong><\/li>\n<li>Anlegen eines Ordners im Webserver f\u00fcr die Aufzeichnungen<br \/>\n<strong><code>sudo mkdir \/var\/www\/doku<br \/>\nsudo chown 33:33 \/var\/www\/doku<\/code><\/strong><\/li>\n<\/ol>\n<h5>Konfigurieren von Asterisk<\/h5>\n<p><code><strong>sudo nano \/etc\/asterisk\/asterisk.conf<\/strong>\u00a0<\/code><\/p>\n<p>In dieser Datei\u00a0braucht prim\u00e4r nichts ge\u00e4ndert zu werden. In dieser Anleitung wird von dieser Grundversion ausgegangen &#8230;<\/p>\n<pre>[directories](!)\r\nastetcdir =&gt; \/etc\/asterisk\r\nastmoddir =&gt; \/usr\/lib\/asterisk\/modules\r\nastvarlibdir =&gt; \/var\/lib\/asterisk\r\nastdbdir =&gt; \/var\/lib\/asterisk\r\nastkeydir =&gt; \/var\/lib\/asterisk\r\nastdatadir =&gt; \/usr\/share\/asterisk\r\nastagidir =&gt; \/usr\/share\/asterisk\/agi-bin\r\nastspooldir =&gt; \/var\/spool\/asterisk\r\nastrundir =&gt; \/var\/run\/asterisk\r\nastlogdir =&gt; \/var\/log\/asterisk\r\n\r\n[options]\r\ndocumentation_language = en_US \r\n\r\n[compat]\r\npbx_realtime=1.6\r\nres_agi=1.6\r\napp_set=1.6<\/pre>\n<h5>Die Endger\u00e4te-Einstellung<\/h5>\n<p><code>sudo nano \/etc\/asterisk\/sip.conf<\/code><\/p>\n<p>Hier definieren wir unsere Telefone und ordnen sie verschiedenen Kontexten zu. Darauf basierend wird hinterher in der <strong>extensions.conf<\/strong> der W\u00e4hlplan programmiert.<\/p>\n<pre>[general]\r\n allowguest=no\r\n port = 5060\r\n bindaddr = 0.0.0.0\r\n qualify = no\r\n ;disable = all\r\n allow = all\r\n videosupport = yes\r\n dtmfmode = rfc2833\r\n srvlookup = yes\r\n localnet=10.0.0.0\/255.255.255.0\r\n directmedia = no\r\n nat = yes\r\n language=de\r\n[1000]\r\n callerid=Leitstelle AMT &lt;19222&gt;\r\n permit=10.0.0.0\/255.255.255.0\r\n type=friend\r\n context=lst-amt\r\n host=dynamic\r\n secret=1000\r\n[1001]\r\n callerid=Leitstelle NOTRUF &lt;112&gt;\r\n permit=10.0.0.0\/255.255.255.0\r\n type=friend\r\n context=lst-not\r\n host=dynamic\r\n secret=1001\r\n[2000]\r\n callerid=Anrufer1 &lt;2000&gt;\r\n permit=10.0.0.0\/255.255.255.0\r\n type=friend\r\n context=anrufer\r\n host=dynamic\r\n secret=2000\r\n[2001]\r\n callerid=Anrufer2 &lt;2001&gt;\r\n permit=10.0.0.0\/255.255.255.0\r\n type=friend\r\n context=anrufer\r\n host=dynamic\r\n secret=2001<\/pre>\n<h5>Der W\u00e4hlplan<\/h5>\n<p><code>sudo nano \/etc\/asterisk\/extensions.conf<\/code><\/p>\n<p>Hier ist die meiste Arbeit erforderlich. Ich habe ein paar Makros f\u00fcr die Anrufverarbeitung erstellt. Hier werden u.a. die Aufnahmen gestartet, nach Gespr\u00e4chsende in den Webserver kopiert und das Calllog gef\u00fcttert.<\/p>\n<p>Weiterhin sind die entsprechenden Rufnummern definiert:<\/p>\n<ul>\n<li>Mit der 4-stelligen Nummer aus der <strong>sip.conf<\/strong> k\u00f6nnen alle Teilnehmer direkt angew\u00e4hlt werden.\u00a0<strong>[direkt]<\/strong><\/li>\n<li>Mit 112 wird ein Anruf auf den Client 1001 initiert. Zuvor wird eine kleine Ansage abgespielt \u00a0und die Aufnahme gestartet und die CallerID modifiziert.\u00a0<strong>[notruf]<\/strong><\/li>\n<li>Mit 19222 wird ein Anruf auf den Client 1000 initiert. Hier wird nur die CallerID modifiziert. Eine Aufzeichnung findet nicht statt.\u00a0<strong>[amt]<\/strong><\/li>\n<li>Mit einer beliebigen mit 0 beginnden Rufnummer wird ein Anruf auf den Client 2000 initiert.\u00a0<strong>[amt]<\/strong><\/li>\n<li>Mit **112 bzw **19222 kann man sich auf ein bestehendes Gespr\u00e4ch aufschalten und lauschen.\u00a0<strong>[amt]<\/strong><\/li>\n<li>Versucht man vom Client 1001 (Notrufleitung) aus abgehende Gespr\u00e4che zu f\u00fchren, wird dies abgewiesen <strong>[block]<\/strong><\/li>\n<\/ul>\n<p>Im unteren Teil der Datei werden die Kontexte aus der <strong>sip.conf<\/strong> mit den hier beschriebenen W\u00e4hlregeln verbunden.<\/p>\n<pre>[globals]\r\n[general]\r\n\r\n[macro-call]\r\nexten =&gt; s,1,Verbose(Anrufdaten merken)\r\n ;same =&gt; n,Set(MONITOR_FILENAME=${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)}_${MACRO_EXTEN}-${CALLERID(num)})\r\n same =&gt; n,Set(MONITOR_EXTEN=${MACRO_EXTEN})\r\n same =&gt; n,Set(cid=${CALLERID(num)})\r\n same =&gt; n,Set(cname=${CALLERID(name)})\r\n\r\n[macro-doku]\r\nexten =&gt; s,1,Verbose(starte Aufzeichnung)\r\n same =&gt; n,Set(MONITOR_FILENAME=${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)}_${MACRO_EXTEN}-${CALLERID(num)})\r\n same =&gt; n,Playback(queue-youarenext)\r\n same =&gt; n,MixMonitor(${MONITOR_FILENAME}.wav)\r\n\r\n[macro-endcall]\r\nexten =&gt; s,1,Verbose(erstelle Info)\r\n same =&gt; n,TrySystem(echo \"${STRFTIME(${EPOCH},,%Y%m%d)},${STRFTIME(${EPOCH},,%H%M%S)},${MONITOR_EXTEN},${cid},${cname},${DIALSTATUS},${ANSWEREDTIME},${REC_FILENAME}\" &gt;&gt; \/var\/www\/doku\/calllog.csv)\r\n same =&gt; n,TrySystem(chmod 0664 \/var\/www\/doku\/*)\r\n\r\n[macro-enddoku]\r\nexten =&gt; s,1,Verbose(kopiere Aufzeichnung)\r\n same =&gt; n,System(lame -b 128 -m m -h \/var\/spool\/asterisk\/monitor\/${MONITOR_FILENAME}.wav \/var\/www\/doku\/rec_${MONITOR_FILENAME}.mp3)\r\n same =&gt; n,Set(REC_FILENAME=rec_${MONITOR_FILENAME}.mp3)\r\n same =&gt; n,TrySystem(chmod 0664 \/var\/www\/doku\/*)\r\n\r\n[block] ; Anrufe \u00fcber die Notrufleitungen sperren\r\nexten =&gt; _X.,1,PlayBack(conf-locked)\r\nexten =&gt; _X.,n,HangUp\r\n\r\n[direkt] ; Direkte Anwahl interner Teilnehmer\r\nexten =&gt; _XXXX,1,Macro(call)\r\nexten =&gt; _XXXX,n,Dial(SIP\/${EXTEN})\r\n\r\n[notruf] ; Routing f\u00fcr Notruf 112\r\nexten =&gt; 112,1,Macro(call)\r\nexten =&gt; 112,n,Macro(doku)\r\nexten =&gt; 112,n,Set(CALLERID(all)=112: ${cid} ${cname} &lt;${cid}&gt;)\r\nexten =&gt; 112,n,Dial(SIP\/1001,,g)\r\n\r\n[amt] ; Routing f\u00fcr Amtsanrufe\r\n; 19222 =&gt; Leitstelle\r\nexten =&gt; 19222,1,Macro(call)\r\nexten =&gt; 19222,n,Set(CALLERID(all)=AMT: ${cid} ${cname} &lt;${cid}&gt;)\r\nexten =&gt; 19222,n,Dial(SIP\/1000,,g)\r\n\r\n; beliebige =&gt; 2000\r\nexten =&gt; _0X.,1,Macro(call)\r\nexten =&gt; _0X.,n,Dial(SIP\/2000)\r\n\r\n; Mith\u00f6ren von 112 und 19222\r\nexten =&gt; **112,1,ChanSpy(SIP\/1001)\r\nexten =&gt; **19222,1,ChanSpy(SIP\/1000)\r\n\r\n[hangup] ; Anrufdaten ins Log\r\nexten =&gt; h,1,ExecIf($[\"${MONITOR_FILENAME}\" != \"\" &amp; \"${ANSWEREDTIME}\" &gt; \"15\"]?Macro(enddoku))\r\nexten =&gt; h,n,Macro(endcall)\r\n\r\n[anrufer] ; Context f\u00fcr Anrufer\r\ninclude =&gt; direkt\r\ninclude =&gt; amt\r\ninclude =&gt; notruf\r\ninclude =&gt; hangup\r\n\r\n[lst-not] ; Context f\u00fcr Leitstelle Notrufleitung\r\ninclude =&gt; block\r\n\r\n[lst-amt] ; Context f\u00fcr Leitstelle Amtsleitung\r\ninclude =&gt; direkt\r\ninclude =&gt; amt\r\ninclude =&gt; notruf\r\ninclude =&gt; hangup<\/pre>\n<p><strong><code>sudo \/etc\/init.d\/asterisk restart<\/code><\/strong><\/p>\n<p><em>weiter mit\u00a0<a href=\"http:\/\/blog.0link.net\/index.php\/2015\/10\/21\/notrufsim-3-wlan-ap-mit-dhcp\/\">(3) WLAN-AP MIT DHCP<\/a><\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Fortsetzung von (1) Idee Widmen wir uns nun der praktischen Umsetzung.\u00a0Ich setze voraus, dass ein paar\u00a0Linux-Kenntnisse vorhanden sind, weshalb nicht alle Schritte ausf\u00fchrlich erkl\u00e4rt sind.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[3],"tags":[],"_links":{"self":[{"href":"https:\/\/blog.0link.net\/index.php\/wp-json\/wp\/v2\/posts\/25"}],"collection":[{"href":"https:\/\/blog.0link.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.0link.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.0link.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.0link.net\/index.php\/wp-json\/wp\/v2\/comments?post=25"}],"version-history":[{"count":19,"href":"https:\/\/blog.0link.net\/index.php\/wp-json\/wp\/v2\/posts\/25\/revisions"}],"predecessor-version":[{"id":94,"href":"https:\/\/blog.0link.net\/index.php\/wp-json\/wp\/v2\/posts\/25\/revisions\/94"}],"wp:attachment":[{"href":"https:\/\/blog.0link.net\/index.php\/wp-json\/wp\/v2\/media?parent=25"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.0link.net\/index.php\/wp-json\/wp\/v2\/categories?post=25"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.0link.net\/index.php\/wp-json\/wp\/v2\/tags?post=25"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}