Also ich hab in meinen gesendeten e-Mails gekramt und August 2008 tatsächlich dasjenige gefunden, in dem ich meine diesbezüglichen Erkenntnisse an die Kollegen geschickt habe. Das betrifft also Asterisk 1.4. Schauen wir mal, ob wir diese 3 Jahre alte Info gemeinsam verstehen können...
Es ging darum, wass wir in unserem alten ISDN IVR System mittels Jabber Statusmeldungen verschickt haben, um den Kollegen zu sagen
- wer ruft gerade an?
- wer hat sich das Gespräch geholt?
- das Gespräch wurde gerade beendet
Das mussten wir auf Asterisk abbilden und ich weiss noch, dass es viiiiel Bastelei badurfte, das zu realisieren (in unserem ISDN IVR System war das alles trivial).
----- Schnipp -----
Hallo!
Ich habe es geschafft, alle Statusänderungen eines Calls in einem Asterisk IVR System in Echtzeit zu erfassen; also
- WANN ein Gespräch reinkommt
- WANN WER dieses Gespräch entgegengenommen hat
- WANN WER wieder aufgelegt hat
Die Meldung eingehender Calls ist trivial: "just call JabberPhone", wenn das IVR System anstartet.
Die abgehoben/aufgelegt Meldungen sind kitzlig, zumal der Dialplan
verstirbt, wenn der Anrufer zuerst auflegt! Legt im Gegensatz der Angerufene zuerst auf, könnte man dies ja noch durch weitere Arbeitsschritte erfassen, wenn man das Dial Kommando entsprechend präpariert...
Ich habe mir also das Konzept unserer 105500x Umleitungen zugrundegelegt und verwende als gemeinsame Wissensdatenbank statt Postgres die Asterisk DB, weil man die aus AEL und AGI direkt und schnell bedienen kann.
Geht ein Call an mehrere Apparate (z.B. Ringruf oder Snom+Handy), dann erzeugt man vorher für jeden ausgehenden Call einen Datensatz in der DB mit einer Callnummer. Dazu verwendet man z.B. einen laufend inkremetierten Wert in der DB a la Postgres "serial" oder eine globale Variable oder eine UUID sonstiger Quelle. Pro Call
muss man
ivrAVALON/call/<nr>/cli
ivrAVALON/call/<nr>/cld
definieren. Zusätzlich
kann man
ivrAVALON/call/<nr>/delay
ivrAVALON/call/<nr>/timeout
auch noch ausfüllen, wenn man eine Startverzögerung haben möchte und/oder eine limitierte Rufdauer. Dann startet man die Calls gleichzeitig per
Dial(LOCAL/##1&LOCAL/##2&LOCAL/##3);
wenn beispielsweise Datensätze für Callnummern 1, 2 und 3 erzeugt wurden:
ivrAVALON/call/1/cli = 01522341018
ivrAVALON/call/1/cld = 11
ivrAVALON/call/2/cli = 01522341018
ivrAVALON/call/2/cld = 19
ivrAVALON/call/2/delay = 10
ivrAVALON/call/3/cli = 01522341018
ivrAVALON/call/3/cld = 01999309511
ivrAVALON/call/3/timeout = 25
Damit wird dreimal gleichzeitig die Routingextension
_##. => {
Wait(${DB(ivrAVALON/call/${EXTEN:2}/delay)});
Set(cld=${DB(ivrAVALON/call/${EXTEN:2}/cld)});
Set(timeout=${DB(ivrAVALON/call/${EXTEN:2}/timeout)});
Set(DB(ivrAVALON/channel/${CHANNEL})=${EXTEN:2});
if ( "${cld:0:1}" = "0" ) {
Dial(SIP/selfnet/${cld},${timeout},M(jabberphone^${EXTEN:2})tw);
} else {
Dial(SIP/${cld},${timeout},M(jabberphone^${EXTEN:2})tw);
};
Hangup();
}
aufgerufen. Diese baut den Call zu einer lokalen SIP Extension oder zum Festnetz auf (je nachdem, ob die CLD mit Null beginnt oder nicht) und merkt sich die jeweilige Callnummer (1, 2 oder 3 im Beispiel) über die ChannelID (z.B. "SIP/selfnet-08154711") in
ivrAVALON/channel/<channelid>
sozusagen als Reverse-Mapping für später. Wird eine Verbindung hergestellt, startet der
macro jabberphone( ext ) {
Set(DB(ivrAVALON/call/${ext}/pickedup)=1);
NoOp(inform jabberphone that ${DB(ivrAVALON/call/${ext}/cld)} picked up the call from ${DB(ivrAVALON/call/${ext}/cli)});
};
kurz an. Der vermerkt einerseits,
dass der Call abgehoben wurde und schickt andererseits die heiss ersehnte Meldung an den JabberPhone, wer (CLD z.B. 19) welches Gespräch (CLI z.B: 01522341018) gerade eben abgehoben hat. Im Moment des Abhebens einer dieser Verbindungen werden alle anderen parallelen Calls vom ursprünglichen Dial(LOCAL/##1&...) aufgelegt.
Beim Auflegen (mit oder ohne zuvor hergestellter Verbindung) läuft die Asterisk aber gottseidank noch durch die
h => {
Set(ext=${DB(ivrAVALON/channel/${CHANNEL})});
if("${DB(ivrAVALON/call/${ext}/pickedup)}"="1") {
NoOp(inform jabberphone that ${DB(ivrAVALON/call/${ext}/cld)} hung up the call from ${DB(ivrAVALON/call/${ext}/cli)});
};
DBdeltree(ivrAVALON/call/${ext});
DBdel(ivrAVALON/channel/${CHANNEL});
};
Extension, die einerseits die Asterisk DB aufräumt und zweitens, wenn es eine Verbindung gab, dem JabberPhone meldet wer (CLD) welches Gespräch (CLI) soeben aufgelegt hat. Nachdem aber in der "h" Extension verlässlich eigenlich nur mehr die ursprüngliche ChannelID zur Verfügung steht (siehe auch "Use with great care" auf
http://www.voip-info.org/wiki/view/Asterisk+h+extension), habe ich diese als Wiedererkennungszeichen eingesetzt - das "Reverse Mapping" von zuvor.
Ergebnis: Abheben und Auflegen werden in Echtzeit vermeldet und nach Abschluss des Calls sind alle Datenbankeinträge wieder weggeräumt - egal, ob abgehoben wurde oder welche Seite das Gespräch beendet hat.
Möchte man in den JabberPhone Meldungen weitere Daten anzeigen (Namen von Quelle und Ziel, Handle für die JabberPhone Verbindung, ...), kann man diese ja nach Belieben in weitere
ivrAVALON/call/<nr>/xxx
Datensätze einfüllen, da bei Gesprächsabschluss der gesamte Teilbaum ivrAVALON/call/<nr> weggeräumt wird.
Ich bin stolz auf mich! :-D
ToDo:
- Implementierung der Kommunikation zu JabberPhone
- Implementierung eines "thread-safe" Zählers für die Erzeugung einer eindeutigen Callnummer, auch wenn mehrere eingehende Gespräche gleichzeitig verteilt werden
Hier vermute ich jedoch keine besonderen Probleme mehr...
servus,
Thomas