[gelöst] Ansage bei Besetzt

henk469

Neuer User
Mitglied seit
18 Apr 2007
Beiträge
52
Punkte für Reaktionen
0
Punkte
0
Grüß Gott zusammen,

ich habe hier eine Asterisk 1.2 mit mehreren Snom 360 im Einsatz, und folgendes Problem:

Bei aktivem Gespräch soll angeklopft werden, und zuvor eine Ansage kommen, das der Mitarbeiter sich momentan in einem Gespräch befindet, jedoch gerne gewartet werden kann. Das funktioniert auch soweit.

Ich habe das gelöst, indem ich einen groupcount für jeden Teilnehmer mache, vor dem Gespräch überprüfe ob die Gruppe besetzt ist, und wenn ja eine Ansage abspiele, und anschließend erst den Empfänger anwähle. Am Endgerät ist dann selbstverständlich das Anklopfen aktiviert.

Folgendes Problem besteht aber:

Verbindet nun ein User ein Gespräch weiter, so bleibt der channel ja erhalten, und der groupcount seines Gerätes wird nicht zurückgesetzt, sondern erst, wenn das Gespräch komplett beendet ist. Dauert das nun lange, so ist die ganze Zeit "besetzt"

Gibt es eine Möglichkeit, das ganze nicht über einen Groupcount laufen zu lassen? oder den Groupcount beim verbinden zu löschen oder so?

Vielen Dank für eure Hilfe!

Gruß
 
Zuletzt bearbeitet:
Hallo henk,

mit 1.2 schaut das schlecht aus. Ab 1.4 wäre es möglich, DEVICE_STATE einzubauen.
Ich hab mal ein Workaround mit einem Konstrukt aus AGI mit AMI gebastelt, aber das war auch für 1.4. Ich weiß nicht, ob 1.2 die Voraussetzungen dafür bringt. Außerdem war das eine ziemlich Performance-intensive Bastellösung.

Läuft das Verbinden bei dem Snoms über den Asterisk, also als Gespräch über den Context für interne Anrufe, oder wird das über irgendwelche Redirect-Header direkt über das Gerät gesteuert?
Weil wenn über den internen Context, könntest Du darin vielleicht die Groups umschreiben.

Rentier
 
Hallo Rentier,

zuerst einmal vielen Dank für deine Antwort. DEVICE_STATE gibt es nach meinen Recherchen erst seit 1.6, kann das sein?
Ich möchte ziemlich ungern eine neue Version aufspielen, damit ich nicht nachher an anderer Stelle wieder Probleme bekomme!

Die Weiterleitung wird leider über die SNOM interne Funktion genutzt, sodass ich an der Stelle auch nicht im Dialplan eingreifen kann!

Die hints schaffen es doch auch irgendwie den richtigen Status des Gerätes zu ermitteln. Kann ich das nicht irgendwie nutzen? Ich habe keine Idee wie, ist mir nur aufgefallen! Die Information ist ja auf jedenfall vorhanden, ich muss nur irgendwie dran kommen!

Gruß
 
Hallo henk,

ab 1.6 ist die Funktion standardmäßig drin, für 1.4 gibt's ein Backport.

Wenn Du Geduld hast, und niemand sonst eine Lösung weiß, kannst Du gerne das hier mal ausprobieren:

PHP:
#!/usr/bin/php -q
<?php

$server = "127.0.0.1";
$amiuser = "agi";
$amipass = "123";
$hintcontext = "default";

$debug = false;
$logfile = "/var/log/asterisk/extstatdial_agi.log";

##############################

ob_implicit_flush(true);
set_time_limit(10);
error_reporting(0);

$in = fopen("php://stdin","r");

if ($debug==true) $stdlog = fopen($logfile, "w");

function read() {
  global $in, $debug, $stdlog;
  $input = str_replace("\n", "", fgets($in, 4096));
  if ($debug) fputs($stdlog, "read: $input\n");
  return $input;
}

function errlog($line) {
  global $debug, $err, $stdlog;
  if ($debug) fputs($stdlog, "errlog: $line\n");
  #echo "VERBOSE \"$line\"\n";
}

function write($line) {
  global $debug, $stdlog;
  if ($debug) fputs($stdlog, "write: $line\n");
  echo $line."\n";
}

while ($env=read()) {
  $s = split(": ",$env);
  $agi[str_replace("agi_","",$s[0])] = trim($s[1]);
  if (($env == "") || ($env == "\n")) {
    break;
  }
}

##############################

if ($socket = fsockopen($server, 5038)) {
    stream_set_timeout($socket, 0, 300000);
  }

function ami($command) {
    global $socket;
    fwrite ($socket, $command);
    $response = stream_get_contents($socket);
    if ($response == false) return "Fehlen beim lesen der Serverantwort.";
      else return $response;
  }

$amiresult = ami("Action: Login\r\nUserName: $amiuser\r\nSecret: $amipass\r\n\r\n");
errlog ("AMI Login: " . $amiresult);

$extstatus="other";
$amiresult = ami("Action: ExtensionState\r\nContext: $hintcontext\r\nExten: " . $agi['extension'] . "\r\n\r\n");
errlog ("AMI ExtensionState: " . $amiresult);
$amiarray = split("\r\n",$amiresult);
foreach ($amiarray AS $amival) {
    errlog ("Array - " . $amival);
    if(substr($amival,0,7)=="Status:") $extstatus=trim(substr($amival,7));
  }

$amiresult = ami("Action: Logoff\r\n\r\n");
errlog ("AMI Logoff: " . $amiresult);

fclose($socket);

write ('SET VARIABLE extstatus "' .$extstatus . '"');
read ();

##############################

fclose($in);
fclose($stdlog);

exit;
?>

Dafür müssen hints gesetzt sein, AMI aktiv und die Daten oben entsprechend angepasst. Das Ding muss mit Ausführ-Rechten und ausschließlich Unix-Zeilenumbrüchen als extstatdial.agi in /var/lib/asterisk/agi-bin/

Ausgeführt wird das in etwa so:

Code:
exten => _XXX,1,AGI(extstatdial.agi)
exten => _XXX,n,GotoIf($["${extstatus}"="0"]?frei:besetzt)
exten => _XXX,n(frei),Dial(SIP/1001)
exten => _XXX,n(besetzt),Playback(bitte-warten)

Wie gesagt, wurde für 1.4 gemacht. Es kann sein, dass deshalb die Rückmeldungen von AMI nicht passen und das etwas Bastelei werden kann, bis es hoffentlich funktioniert.

Rentier
 
Ganz durchgestiegen bin ich noch nicht, hab mich ehrlich gesagt noch nie mit AGI/AMI befasst, komme aber so langsam dahinter. Werde mich auf jedenfall zurückmelden, ob es den gewünschten Erfolg gebracht hat!

Eventuell komm ich auch nochmal mit Rückfragen, aber vielen vielen Dank erstmal, das sieht zumindest schonmal vielversprechend aus.

Eine Frage hätte ich jedoch direkt. Wie ist das denn, wenn das Script gleichzeitig mehrfach aufgerufen wird? Also quasi zwei Anrufe gleichzeitig reinkommen etc.? Bringt das Probleme mit sich? Kann das script gleichzeitig mehrfach mit unterschiedlichen Parametern gestartet werden?

Gruß
 
Hallo henk,

ich bin mir fast sicher, dass es auf den ersten Versuch nicht funktioniert, aber wir werden sehen. Stell am besten gleich mal debug auf true, damit man im Logfile sieht, was alles passiert ist.

Das Ding läuft als AGI und bekommt die notwendigen Parameter schon über den Stream von Asterisk. Ausgewertet werden ausschließlich Channel-Variablen, also kann es eigentlich zu keinen Überscheidungen kommen. Du musst nur in der AMI Konfiguration aufpassen, dass mehrfaches Anmelden mit dem gleichen Benutzer erlaubt ist. Das Skript läuft nur eine halbe Sekunde, also wäre das sowieso Zufall, wenn wirklich zwei Anrufe genau zeitgleich kommen, aber selbst dann sollte wie gesagt nichts passieren. Beim produktiven Einsatz auf einem größeren System solltest Du das Ding aber anfangs genau im Auge behalten, es war nur eine Bastelei aus der Not.

Svenja
 
Also ich muss sagen, die ganze Angelegenheit hat erstaunlich gut geklappt auf anhieb. Ich musste nur das AMI dementsprechend anpassen, dem Skript noch eine Variable übergeben, damit der entsprechende hint auch identifiziert wird (ist alles ein bisschen anders bei uns) und schon hat es geklappt.

Vielen Dank erstmal!

Nun wird so eine Bastellösung bei uns aber nicht gewünscht, und deswegen muss ich jetzt mit dem Gedanken spielen, unsere Asterisk upzudaten.

Ist 1.6 denn schon stable? Und wenn ja welche Version soll ich nutzen? Wie geht das mit dem Update von statten, und was ist zu beachten?

Oder wäre 1.4 die bessere Wahl, und ich könnte die Device-States nachrüsten? und wie geht das?

Gruß
 
Alles was als offizielles Release läuft, ist auch dementsprechend stable. Wir benutzen 1.6.1, und das rennt ganz gut. Mit 1.6.2 gab's ein kleines Problem mit mISDN.

Von 1.2 auf 1.6 kann es sein, bzw. wird es ziemlich sicher so sein, dass Du einige Confs anpassen musst. Dazu gibt's aber einige Beiträge, und das findet sich alles in den Changelogs. Ist jetzt auch kein Hexenwerk.

1.4 ist da noch gnädiger und kann in den meisten Fällen mit den alten Confs umgehen.

http://www.voip-info.org/wiki/view/Asterisk+func+device_State ganz unten geht's zu den Backports.

Svenja
 
Mit 1.6.2 gab's ein kleines Problem mit mISDN.

hast du immer noch den 'MOH' in Betrieb? Ist ja eine Super Idee:) wenn sonst nix hilft...

Ich nutze chan_lcr (siehe Sig.). Bei mir ist der Effekt, dass ich manchmal Dial mit 'r' Flags nutzen muss. Manchmal darf ich es aber auch weglassen. Ich erkenne keinen
Grund woher die Unterschiede kommen. Man gewoehnt sich ja an allem:) MOH musste ich zum Glueck noch nicht missbrauchen.

- sparkie
 
Alles klar, ich denke, da werde ich wohl eher auf die 1.4 zurückgreifen, habe gerade gelesen, das es beispielsweise den Agentcallbacklogin nicht mehr gibt in 1.6.

Wenn ich nun auf 1.4 update, da kann ich dann einfach die neueste Version von nehmen, oder? Und wie installiere ich den Backport?

Vielen Dank für eure Hilfe!

Gruß,

Hendrik
 
So, nur nochmal als kleine Rückmeldung:

Das script wurde jetzt ins Produktivsystem eingebunden, und läuft erstmal einwandfrei. Wird selbstverständlich im Auge behalten, sieht aber erstmal gut aus.
Ich wollte wegen so einer Kleinigkeit nicht die gesamte Anlage wechseln, um dann die Funktion wieder über einen Patch einzuspielen.
1.6 war mir dann doch zu riskant, alleine weil wir mit Agents arbeiten, und sich da einiges getan hat!

Vielen Dank aber nochmal von meiner Seite, vor allem für die Hilfe von dir Svenja!

Gruß
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.