<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>eBlog - Elvizz Blog &#187; Asterisk</title>
	<atom:link href="http://blog.elvizz.net/category/linux/asterisk/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.elvizz.net</link>
	<description>- Hier bloggt der Chef noch selbst -</description>
	<lastBuildDate>Mon, 21 Sep 2009 17:04:40 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>MWI mit mISDN und Asterisk</title>
		<link>http://blog.elvizz.net/2008/07/26/mwi-mit-misdn-und-asterisk/</link>
		<comments>http://blog.elvizz.net/2008/07/26/mwi-mit-misdn-und-asterisk/#comments</comments>
		<pubDate>Sat, 26 Jul 2008 18:00:15 +0000</pubDate>
		<dc:creator>Elvizz</dc:creator>
				<category><![CDATA[Asterisk]]></category>

		<guid isPermaLink="false">http://blog.elvizz.net/?p=266</guid>
		<description><![CDATA[Message Waiting Indication (MWI) scheint von Asterisk aktuell nur f&#252;r SIP- und Zapata-Channels unterst&#252;tzt zu werden, wer mISDN (chan_misdn) nutzt, hat ein Problem: Es geht einfach nicht.  
Da ich aber auch gerne dar&#252;ber informiert w&#252;rde, dass eine neue Nachricht auf meiner Voicemail-Box auf mich wartet, ohne dass ich in meine Mails gucken muss, habe [...]]]></description>
			<content:encoded><![CDATA[<p>Message Waiting Indication (MWI) scheint von Asterisk aktuell nur f&#252;r SIP- und Zapata-Channels unterst&#252;tzt zu werden, wer mISDN (chan_misdn) nutzt, hat ein Problem: Es geht einfach nicht. <img src='http://blog.elvizz.net/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<p>Da ich aber auch gerne dar&#252;ber informiert w&#252;rde, dass eine neue Nachricht auf meiner Voicemail-Box auf mich wartet, ohne dass ich in meine Mails gucken muss, habe ich mir eine andere L&#246;sung einfallen lassen.</p>
<p><span id="more-266"></span> Asterisk kann SMS an entsprechende Telefone verschicken! Basierend auf diesen <a href="http://www.automated.it/asterisk/sms.html" target="_blank" class="liexternal">Skripten</a> habe ich also ein neues AGI-Skript geschrieben, das man nach einem Anruf, der auf der Voicemail-Box gelandet ist, aufruft. Dieses Skript z&#228;hlt die vorhandenen Nachrichten (ich habe keinen internen Z&#228;hler gefunden, den ich abfragen k&#246;nnte&#8230; wenn es einen gibt: Bitte einfach in &#8216;nem Kommentar darauf hinweisen, dann kann ich das Skript anpassen.) und schreibt dann eine entsprechende SMS an unser Telefon.</p>
<p>Daf&#252;r brauchen wir also zuerst einen neuen Context in der <em>/etc/asterisk/extensions.conf</em>:</p>
<pre>[smsdial]
exten =&gt; _X.,1,SMS(${CALLERID(NUM)},s,${EXTEN},${CALLERID(NAME)})
exten =&gt; _X.,2,SMS(${CALLERID(NUM)},s)
exten =&gt; _X.,3,Hangup</pre>
<p>Dieser k&#252;mmert sich darum, die SMS an unser Telefon zu schicken.</p>
<p>Als n&#228;chstes kommt dann auch schon das AGI-Skript, das ich als <em>checkVM.agi</em> unter <em>/var/lib/asterisk/agi-bin</em> gespeichert habe:</p>
<pre>#!/usr/bin/perl -w

use strict;
use File::Copy;

my $location      = "/var/spool/asterisk/outgoing/";
my $templocation  = "/tmp/";
my $basePath      = '/var/spool/asterisk/voicemail';
my $MessageCentre = "01930100";
my $chanPrefix    = "mISDN/g:intern/";

my $error = 0;

my ($vmContext, $vmNum, $targetPhone) = ($ARGV[0], $ARGV[1], $ARGV[2]);

if (not $vmContext or not $vmNum or not $targetPhone){
	($vmContext, $vmNum, $targetPhone) = split(/ /, $ARGV[0]);
	if (not $vmContext or not $vmNum or not $targetPhone){
		print "All 3 parameters are needed!\n";
		exit(1);
	}
}

srand;

my $vmPath = "$basePath/$vmContext/$vmNum/INBOX/";

opendir(DIR, $vmPath);
# count only wav-files:
my @files = grep(/\.wav$/i,readdir(DIR));
closedir(DIR);

my $msgCount = scalar @files;

if ($msgCount &gt; 0){
	my $msg;
	if ($msgCount == 1){
		$msg = "Es ist $msgCount neue Nachricht in Ihrer Mailbox $vmNum!";
	} else {
		$msg = "Es sind $msgCount neue Nachrichten in Ihrer Mailbox $vmNum!";
	}

	my $random = int(rand 10000);
	my $datestamp = date_stamp();
	my $unique = "$datestamp$random$targetPhone";

	open(F, "&gt;$templocation$unique.call") or $error = 1;
	print F "Channel: $chanPrefix$targetPhone\n";
	print F "CallerID: $msg &lt;$MessageCentre&gt;\n";
	print F "MaxRetries: 2\n";
	print F "RetryTime: 60\n";
	print F "WaitTime: 30\n";
	print F "Context: smsdial\n";
	print F "Extension: $vmNum\n";
	print F "Priority: 1\n";
	close(F);

	move("$templocation$unique.call","$location") or $error = 1;
}

exit $error;

sub date_stamp{
	(my $sec,my $min,my $hour,my $mday,my $mon,my $year,my $wday,my $yday,my $isdst) = localtime(time);
	my $t = sprintf "%4d%02d%02d%02d%02d%02d", 1900+$year,$mon+1,$mday,$hour,$min,$sec;
	return $t;
}</pre>
<p>Das Skript erwartet 3 Parameter: Den Voicemail-Kontext, die Nummer der Voicemail-Box und die Zielrufnummer des Telefons, an das die SMS gehen soll. Die Fallunterscheidung bei der Parameterauswertung ist n&#246;tig, damit man das Skript sowohl von der Konsole als auch aus Asterisk heraus aufrufen kann: Wie es aussieht &#252;bergibt Asterisk alle Parameter in Anf&#252;hrungszeichen, so dass nur ein gro&#223;er Parameter im Skript ankommt &#8211; auf der Kommandozeile ist das anders.</p>
<p>Danach werden die .wav-Files im angegebenen Verzeichnis gez&#228;hlt (falls man die Anrufe nicht im wav-Format aufnimmt, muss diese Stelle angepasst werden) und &#8211; falls Nachrichten vorhanden sind &#8211; eine SMS generiert und in das Outgoing-Verzeichnis von Asterisk verschoben. Bei der Erzeugung der SMS f&#228;llt auf, dass ich hier die Nummer des Telekom SMS-Centers nutze. Dies war n&#246;tig, um mein Telefon davon zu &#252;berzeugen, die SMS ohne Klingeln anzunehmen und zu empfangen. Wer also ein anderes SMS-Zentrum in seinem Telefon eingerichtet hat, muss eventuell auch diese Nummer anpassen.</p>
<p>Als letztes fehlt jetzt nur noch der Aufruf des Skriptes nach der Mailbox:</p>
<pre>exten =&gt; _X., n, VoiceMail(123@vmContext)
exten =&gt; _X., n+1, AGI,checkVM.agi|vmContext 123 ${EXTEN}</pre>
<p>Beim Einf&#252;gen in die eigene <em>extensions.conf</em> ist nat&#252;rlich darauf zu achten, die &#8220;Variablen&#8221; richtig zu ersetzen:<br />
<span style="text-decoration: underline;">n</span> ist die Priorit&#228;t, <span style="text-decoration: underline;">123</span> die Nummer der Mailbox, <span style="text-decoration: underline;">vmContext</span> der Context der Voicemail-Box.</p>
<p>Jetzt nur noch Asterisk neustarten oder den Dialplan neu einlesen und schon: Fertig!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.elvizz.net/2008/07/26/mwi-mit-misdn-und-asterisk/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Callcenter Agents abwehren mit Asterisk</title>
		<link>http://blog.elvizz.net/2008/07/19/callcenter-agents-abwehren-mit-asterisk/</link>
		<comments>http://blog.elvizz.net/2008/07/19/callcenter-agents-abwehren-mit-asterisk/#comments</comments>
		<pubDate>Sat, 19 Jul 2008 16:46:19 +0000</pubDate>
		<dc:creator>Elvizz</dc:creator>
				<category><![CDATA[Asterisk]]></category>

		<guid isPermaLink="false">http://blog.elvizz.net/?p=258</guid>
		<description><![CDATA[Wer kennt das nicht. Man sitzt zu Hause und ist in Gedanken vertieft, guckt einen Film oder macht sonst was. Pl&#246;tzlich klingelt das Telefon. Nat&#252;rlich unterbricht man seine Freizeitbesch&#228;ftigung und wandert zum Telefon. Und was darf man dann h&#246;ren: &#8220;Spreche ich mit Herrn X? Hier ist Y von der Firma Z&#8230;&#8221; und so weiter. Ein [...]]]></description>
			<content:encoded><![CDATA[<p>Wer kennt das nicht. Man sitzt zu Hause und ist in Gedanken vertieft, guckt einen Film oder macht sonst was. Pl&#246;tzlich klingelt das Telefon. Nat&#252;rlich unterbricht man seine Freizeitbesch&#228;ftigung und wandert zum Telefon. Und was darf man dann h&#246;ren: &#8220;Spreche ich mit Herrn X? Hier ist Y von der Firma Z&#8230;&#8221; und so weiter. Ein Callcenter Agent (CCA), der einem gerne ein supertolles Angebot machen m&#246;chte, das so toll ist, dass man es auch mal am Sonntag telefonisch bewerben muss.</p>
<p>Wer eine Asterisk-Telefonanlage betreibt, kann sich nun mit recht geringem Aufwand helfen und eine Vorselektion f&#252;r seine Anrufer implementieren, die CCAs ausfiltert und normale Anrufer unbehelligt durchl&#228;sst.<span id="more-258"></span></p>
<p>Dazu machen wir uns eine der l&#228;stigsten Eigenschaften der Callcenter zu Nutze: Sie senden nie ihre Telefonnummer mit! Aber wie will man dann filtern ohne z.B. Omas altes Analog-Telefon auch auszusperren? Ganz einfach: CCAs werden normalerweise von einem Digital-Telefon (ISDN, SIP, Handy, &#8230;) aus anrufen. Ruft ein solches Telefon bei uns an, wird dessen Bearer-Typ an uns &#252;bermittelt: <em>SPEECH</em> f&#252;r digitale Anrufer, <em>AUDIO 3.1k</em> f&#252;r analoge.</p>
<p>Im Prinzip ist das schon die ganze Information, die wir ben&#246;tigen: Oma ruft ohne Rufnummer und mit AUDIO 3.1k an, normale Bekannte und sonstige Anrufer mit Rufnummer und SPEECH und nur CCAs sollten SPEECH ohne Rufnummer haben.</p>
<p>Weil es immer mal vorkommen kann, dass uns jemand anruft, der seine Rufnummer doch nicht mitsendet, aber kein CCA ist, weisen wir solche Anrufer aber nicht sofort ab, sondern spielen ihnen folgende Nachricht vor:</p>
<blockquote><p>Guten Tag. Hier ist der Anschluss von X. Leider unterdr&#252;cken Sie die &#220;bermittlung Ihrer Rufnummer, daher muss ich davon ausgehen dass dieser Anruf aus einem Callcenter stammt und von mir nicht gew&#252;nscht ist. Wenn dies nicht zutrifft, k&#246;nnen Sie die 5 dr&#252;cken und werden sofort durchgestellt. Dieser Anruf wird automatisch aufgezeichnet.</p></blockquote>
<p>Wenn ein CCA dann doch mal die 5 dr&#252;ckt, um uns besonders dreist doch von seinem Produkt &#252;berzeugen zu wollen, k&#246;nnen wir die erzeugte Aufnahme sp&#228;ter verwenden, um ihn abzumahnen oder &#228;hnliches, da er uns ja definitiv gegen unseren Willen gest&#246;rt hat. Das Aufzeichnen des Gespr&#228;chs ist in diesem Fall auch legal, da wir ja im Voraus darauf hingewiesen haben. Ein gew&#252;nschter Anrufer sollte sich davon auch nicht abschrecken lassen, da wir ja auch zuvor erkl&#228;rt haben, was es damit auf sich hat.</p>
<p>Also ans Eingemachte:</p>
<p>Zuerst brauchen wir ein AGI-Skript, das sich um die Unterscheidung der Anrufertypen k&#252;mmert. (Ok, ein AGI-Skript ist hierf&#252;r etwas Overkill. Aber das Skript wird demn&#228;chst noch erweitert, so dass es durchaus Sinn macht, es auf diese Weise zu l&#246;sen.)</p>
<pre>#!/usr/bin/perl

use strict;

my $callerName   = "unbekannter Teilnehmer";
my $callerDetail = "keine Details";
my ($callType, $callNum) = split(/ /, $ARGV[0]);

my $numberDescription = '';

if ($callNum eq ""){
	if ($callType eq "SPEECH"){
		$callerName = 'Rufnummer unterdrueckt';
	} else {
		$callerName = 'analoger Anrufer';
	}
} else {
	# das folgt erst spaeter
}

print "SET CALLERID \"$callerName \&lt;$callNum\&gt;\"\n";

exit 0;</pre>
<p>Dieses Skript legen wir als rev_lookup.agi unter <em>/var/lib/asterisk/agi-bin</em> ab (zumindest unter Debian liegen die Asterisk AGI-Skripte dort).</p>
<p>Nun erweitern wir die Datei <em>/etc/asterisk/extensions.conf</em> noch um ein paar Zeilen:</p>
<pre>[incoming-context]
; exten f&#252;r ankommende Anrufe
exten =&gt; 9516672, 1, AGI,rev_lookup.agi|${CALLTYPE} ${CALLERID(NUM)}
exten =&gt; 9516672, 2, GosubIf($["${CALLERID(name)}"="Rufnummer unterdrueckt"]?ivr-cca,cca,1)
; weitere Behandlung des Anrufes...

; spa&#223; fuer CallCenter Agents
[ivr-cca]
; nehme Anruf an, warte 2 Sekunden (war notwendig, um auf Gespr&#228;chsaufbau zu warten <img src='http://blog.elvizz.net/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  )
; spiele Infotext ab (siehe oben), warte erneut 5 Sekunden und spiele Text erneut ab
; Background sorgt daf&#252;r, dass Tastendr&#252;cke zu den entsprechenden Extensions springen
exten =&gt; cca, 1, Answer()
exten =&gt; cca, 2, Wait(2)
exten =&gt; cca, 3, Background(cca-info)
exten =&gt; cca, 4, Wait(5)
exten =&gt; cca, 5, Goto(3)

; zeichne das Gespr&#228;ch auf und fahre wie mit normalem Gespr&#228;ch fort
exten =&gt; 5, 1, MixMonitor(cca${STRFTIME(,,%G%m%d%H%M%S)}.wav|W(2))
exten =&gt; 5, 2, Return()

; verabschiede CCA und lege auf
exten =&gt; i, 1, PlayBack(vm-goodbye)
exten =&gt; i, 2, Wait(1)
exten =&gt; i, 3, Hangup()</pre>
<p>Zuerst rufen wir also das externe AGI-Skript auf und &#252;bergeben ihm den Calltype (SPEECH, AUDIO 3.1k) und die Rufnummer (${CALLTYPE} funktioniert auch mit mISDN, was ziemlich lange dauerte um es mit Google, etc. herauszufinden, darum erw&#228;hne ich es noch mal explizit). Das Skript setzt CALLERID(name) ensprechend, so dass wir im n&#228;chsten Schritt pr&#252;fen k&#246;nnen, ob wir es mit einem CCA zu tun haben. Falls ja, schicken wir diesen zu unserer Nachricht und lassen ihn entscheiden, ob er das Gespr&#228;ch aufgezeichnet fortsetzen m&#246;chte oder lieber auflegt.</p>
<p>Die aufgezeichneten Gespr&#228;che liegen sp&#228;ter unter <em>/var/spool/asterisk/monitor</em> und hei&#223;en ccaYYYYMMDDHHmmSS.wav (YYYY ist das vierstellige Jahr, MM der zweistellige Monat, DD das zweistellige Datum, HHmmSS die je zweistellige Stunde, Minute und Sekunde).</p>
<p>Nicht vergessen: Die Nachricht f&#252;r den CCA aufnehmen und z.B. als 8kHz WAV-Datei unter <em>/var/lib/asterisk/sounds/de/cca-info.wav</em> ablegen. Evtl. nat&#252;rlich auch noch in anderen Sprachen, aber f&#252;r einen einfachen Privathaushalt d&#252;rfte eine Sprache ausreichen <img src='http://blog.elvizz.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Nach einem Neustart von Asterisk bzw. einem neueinlesen des Dialplans steht uns das neue Feature zur Verf&#252;gung. Viel Spa&#223; in der neu gewonnenen Freizeit <img src='http://blog.elvizz.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Dieser Artikel basiert zum Teil auf diesen Forendiskussionen: [<a href="http://www.ip-phone-forum.de/showthread.php?p=390828" target="_blank" class="liexternal">1</a>] [<a href="http://www.ip-phone-forum.de/showthread.php?t=60980&amp;page=7" target="_blank" class="liexternal">2</a>]</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.elvizz.net/2008/07/19/callcenter-agents-abwehren-mit-asterisk/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
