Zum Hauptinhalt springen

IVR-Knoten Server

Verknüpfen eines Anwendungsservers mit einem IVR-Knoten mithilfe von SOAP

SOAP (Simple Object Access Protocol) ist eine XML-Nachrichtenbasierte Protokollspezifikation, die verwendet wird, um Anwendungen, die in einer dezentralen, verteilten Umgebung ausgeführt werden, den Informationsaustausch zu ermöglichen. Es basiert auf Extensible Markup Language (XML) als Nachrichtenformat und basiert in der Regel auf anderen Anwendungsschichtprotokollen, wie RPT und HTTP, für die Nachrichtenaushandlung und -übertragung.

SOAP-Beispielnachricht

Es folgt ein Beispieldatenaustausch mithilfe des HTTP/SOAP-Protokolls. (Der angezeigte Einzug dient nur zur Veranschaulichung.)

Anfrage

POST /ivr.xml HTTP/1.1 Host: pbx.com SOAPAction: IvrInput Content-Type: application/xml Content-Length: 123 <env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sns="http://www.vodia.com/soap/pbx"> <env:Body> <sns:IVRInput> <CallID>3525234@vodia.com</CallID> <Output>123</Output> <From>Fred Feuerstein <sip:ff@test.com></From> <To>Tom Test <sip:tt@test.com></To> </sns:IVRInput> </env:Body> </env:Envelope>

Im vodia-Namespace gibt der Datensatz CDR an, dass eine CDR übertragen werden soll. Die CDR kann die folgenden Attribute aufweisen:

  • CallID: Dieses Attribut enthält die Aufruf-ID des Aufrufs und ermöglicht es, die IVR-Eingabe in einen Sitzungskontext zu übertragen. Es wird auch als Bezeichner in der Antwort auf die Anforderung verwendet.
  • Ausgang: Die Ziffern, die der Benutzer in den IVR-Knoten eingegeben hat.
  • Die Felder An und Von geben die Kopfzeilen An und Von des Aufrufs an.

Antwort

Die Antwort in der Datei gibt an, was mit der Eingabe geschehen soll. Eine Beispielrückgabe könnte wie folgt aussehen:

HTTP/1.1 200 Ok Content-Type: application/xml Content-Length: 123 <env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sns="http://www.vodia.com/soap/pbx"> <env:Body> <sns:IVROutput> <CallID>3525234@vodia.com</CallID> <Destination>123</Destination > </sns:IVROutput > </env:Body> </env:Envelope>

Die Antwort weist die folgenden Attribute auf:

  • CallID: Dieses Attribut enthält die Aufrufer-ID des Aufrufs. Es wird verwendet, um den betroffenen Anruf zu identifizieren.
  • WavFile: Die Datei, die die Nebenstellenanlage wiedergeben soll (z. B. "audio_en/bi_5.wav audio_en/bi_6.wav"). Die Oder die Dateien müssen im Arbeitsverzeichnis der Nebenstellenanlage vorhanden sein.
  • Klar: Sofern nicht auf "false" gesetzt, wird die gesammelte Eingabe des Benutzers dadurch entfernt.
  • Reiseziel: Diese Zeichenfolge gibt an, zu welchem Konto gewechselt werden soll.

Beispiel PHP-Datei

Dieses Beispiel zeigt, wie man die CDR auf einem Apache-Webserver mit der PHP-Erweiterung verarbeitet. In diesem Beispiel werden die Daten extrahiert und in eine einfache Datei einschrieben.

&lt;?php
$elem="";
$callid="";
$type="";
$domain="";
$language="";
$from="";
$to="";
$fromUser="";
$toUser="";
$chargeAccount="";
$chargeNumber="";
$timeStart="";
$timeConnected="";
$timeEnd="";
$duration="";

function start_element($parser, $name, $attrs)
{
global $elem;
$elem=$name;
}

function end_element($parser, $name)
{}

function xml_data($parser, $data)
{
global $elem,
$callid,
$type,
$domain,
$from,
$to,
$fromUser,
$toUser,
$chargeAccount,
$chargeNumber,
$timeStart,
$timeConnected,
$timeEnd;

if($elem=="CALLID") $callid .= $data;
else if($elem=="TYPE") $type .= $data;
else if($elem=="DOMAIN") $domain .= $data;
else if($elem=="LANGUAGE") $language .= $data;
else if($elem=="FROM") $from .= $data;
else if($elem=="TO") $to .= $data;
else if($elem=="FROMUSER") $fromUser .= $data;
else if($elem=="TOUSER") $toUser .= $data;
else if($elem=="CHARGEACCOUNT") $chargeAccount .= $data;
else if($elem=="CHARGENUMBER") $chargeNumber .= $data;
else if($elem=="TIMESTART") $timeStart .= $data;
else if($elem=="TIMECONNECTED") $timeConnected .= $data;
else if($elem=="TIMEEND") $timeEnd .= $data;
}

$content = file_get_contents("php://input");

$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "start_element", "end_element");
xml_set_character_data_handler($xml_parser, "xml_data");

if(!xml_parse($xml_parser, $content, true))
{
die(sprintf("Get XML error parsing %s: %s at line %d",
htmlspecialchars($content),
xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser)));
}
xml_parser_free($xml_parser);

$fd = fopen("C:/Temp/cdr.txt", "a");
if( $fd )
{
fwrite( $fd, "callid = $callid, \r\n
type = $type, \r\n
language = $language, \r\n
domain = $domain, \r\n
from = $from, \r\n
to = $to, \r\n
fromUser = $fromUser, \r\n
toUser = $toUser, \r\n
chargeAccount = $chargeAccount, \r\n
chargeNumber = $chargeNumber, \r\n
timeStart = $timeStart, \r\n
timeConnected = $timeConnected, \r\n
timeEnd = $timeEnd, \r\n ";

fclose( $fd );
echo "ok";
}
?&gt;