Extention status nutzen?!

ciscllc

Neuer User
Mitglied seit
19 Aug 2008
Beiträge
32
Punkte für Reaktionen
0
Punkte
6
Hallo!

Ich hab ein kleines Problem.
Bei unserer Asterisk Anlage ist die Durchwahl "0" gleichgesetzt mit "ohne Durchwahl"

Diese beiden möchte ich nun an das Telefon mit der DW 11 bzw. wenn dieses besetzt ist an die DW 17 weiterleiten.

Ersteres geht, aber der Status der Extention kann nicht abgefragt werden.
Ich mach da sicher etwas falsch, aber ich weiß nicht was.

Der Status der Extention ändert sich von "InUse" auf "Idle" und retour... Aber wie kann ich das beim Anrufen abfragen?

LG im Vorraus!

Joe
 
Zuletzt bearbeitet:
Hallo Christian,

das einfachste ist immer, nach dem Dial-Befehl die Variable DIALSTATUS abzufragen. Wenn die busy ist, dann springst Du zu einem anderen Dial, der die 17 anruft. Vielleicht reicht Dir das so.

Rentier
 
Danke!

Aber er gibt mir den richtigen Status nicht zurück, bzw. macht er nicht was ich will.

im Moment schaut es so aus:

Code:
exten => s,n,Dial,SIP/11|${KLINGELZEIT}
exten => s,n,ExecIf($["${DIALSTATUS}" = "IN_USE"]?Dial(SIP/17,30))

Der Status wechslet dann aber nur von InUse auf InUse&Ringing. Soweit ich das beurteilen kann, fragt asterisk den Status dann gar nicht ab, weil er ja jeden einzelnen Punkt nach der Reihe abarbeitet.

Danke
 
Der Status heißt BUSY. Schau Dir mal http://www.voip-info.org/wiki/view/Asterisk+variable+DIALSTATUS an.

Das ist auch gut so, dass er das der Reihe nach abarbeitet. Asterisk versucht erst mal 11 anzurufen, merkt das besetzt ist und geht eine Priorität weiter. Das Ergebnis des Dial, in dem Fall BUSY, wird in DIALSTATUS gespeichert, und steht so den nachfolgenden Prioritäten zur Verfügung.

Rentier
 
Naja, so hab ichs vorher ja auch probiert.
Aber Asterisk läutet zuerst mal. Dann, nach den angegebenen Sekunden, schaltet er weiter. Und erst dann sagt er mir: der status war InUse oder Busy oder whatever. (http://archives.free.net.ph/message/20090514.223753.a7ee2744.de.html)

Ich werd einfach beide telefone läuten lassen, fertig....

Danke und frohe Weihnachten!
 
Hast Du an dem Telefon Anklopfen an?

Mir fällt sonst schon noch was ein, ist halt etwas umständlich, aber müsste klappen. Bau Dir ein AGI, dass über AMI den Status des Telefons abfrägt, und dann dementsprechend weitermacht.

Rentier
 
Anklopfen?

Wüsste ich jetzt nicht. Hab auf dem Anschluss das Grandstream GXP2010.

Die CLI schreibt folgendes:

Code:
   -- Executing [s@from-isdn:14] Dial("CAPI/ISDN1#01/-fbf", "SIP/11|60") in new stack
    -- Called 11
 Extension Changed 11[blf1] new state InUse&Ringing for Notify User XY
 Extension Changed 11[blf1] new state InUse&Ringing for Notify User XX
 Extension Changed 11[blf1] new state InUse&Ringing for Notify User XZ
    -- SIP/11-0ac64c98 is ringing

Auf Programmierung hab ich keine Lust, da ich mich da ehrlichgesagt, nie wirklich eingelesen habe.:lamer:
 
Das wäre bei Deinem Telefon die Option "Disable Call Waiting". Die wird wahrscheinlich auf "no" stehen. Wenn Du die auf "yes" stellt, dann könnte es vielleicht funktionieren. Allerdings könnte es passieren, dass das Telefon dann keine Anrufliste mehr erzeugt, wenn ein zweiter Anruf kommt, während man telefoniert.

Rentier
 
:groesste:

Danke! Funktioniert! Super!

Frohe Weihnachten und guten Rutsch!
 
Zuletzt bearbeitet:
Status vor dem Wählen abfragen als PHP AGI

Das freut mich schon mal, dass es bei Dir jetzt klappt.

Ich hätte aber noch eine Bitte. Mir war langweilig, deshalb hab ich grad mal dieses PHP AGI hier zusammengestrickt. Bei mir läuft praktisch alles über Realtime, deshalb klappt das bei mir mit den Hints nicht wirklich. Könntest Du das bitte testen, ob das Teil das macht, was Du vorhattest?

Das AGI muss als extstatdial.agi nach /var/lib/asterisk/agi-bin, muss Ausführ-Rechte haben und im Unix-Format (=> Zeilenumbrüche) gespeichert sein. Außerdem muss der Asterisk Server PHP installiert haben. Sollte das Dein Server das nicht haben, dann is's egal, vielleicht wäre dann jemand von den Mitlesenden so gut.

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

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

// toggle debugging output (more verbose but slower)
$debug = true;
$logfile = "/var/log/asterisk/PHP_AGI.log";


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

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

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

// Do function definitions before we start the main loop

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";
}

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

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

// main program


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.=" (".substr($amival,7).")";
    if( (trim($amival)=="Status: 0") || (trim($amival)=="Status:0") ) $extstatus="idle";
  }

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

fclose($socket);

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


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

// clean up file handlers etc.
fclose($in);
fclose($stdlog);

exit;
?>

Die extensions.conf dazu sollte dann in etwa so aussehen:
Code:
[default]
exten => 11,1,AGI(extstatdial.agi)
exten => 11,2,GotoIf($["${extstatus}"="idle"]?3:default,17,1)
exten => 11,3,Dial(SIP/11)
exten => 17,1,Dial(SIP/17)

Die Parameter server, agiuser, agipass und hintcontext müssen angepasst werden.

Außerdem muss natürlich AMI laufen, Port 5038, und die entsprechenden Hints gesetzt sein.

Das AGI prüft zuerst über AMI, ob die gewählte Nummer den Status 0 (idle) hat. Falls ja, wird die Channel-Variable extstatus auf "idle" gesetzt, ansonsten auf "other".

Dir auch frohes Fest und ein gutes neues Jahr.

Rentier
 
Zuletzt bearbeitet von einem Moderator:
Morgen!

Danke.
Habs getestet:

Log File:
Code:
read: agi_request: extstatdial.agi
read: agi_channel: CAPI/ISDN1#02/11-ffe
read: agi_language: de
read: agi_type: CAPI
read: agi_uniqueid: 1261551334.7325
read: agi_callerid: 0650XXXXXXX
read: agi_calleridname: unknown
read: agi_callingpres: 3
read: agi_callingani2: 0
read: agi_callington: 33
read: agi_callingtns: 0
read: agi_dnid: 11
read: agi_rdnis: unknown
read: agi_context: from-isdn
read: agi_extension: 11
read: agi_priority: 1
read: agi_enhanced: 0.0
read: agi_accountcode: 
read: 
write: SET VARIABLE extstatus "other"
read: 200 result=1

CLI:
Code:
== ISDN1#02: Incoming call '0650XXXXXXX' -> '11'
    -- ISDN1#02: Updated channel name: CAPI/ISDN1#02/11-ffe
    -- Executing [11@from-isdn:1] AGI("CAPI/ISDN1#02/11-ffe", "extstatdial.agi") in new stack
    -- Launched AGI Script /var/lib/asterisk/agi-bin/extstatdial.agi
  == Parsing '/etc/asterisk/manager.conf': Found
  == Manager 'admin' logged on from 127.0.0.1
  == Manager 'admin' logged off from 127.0.0.1
    -- AGI Script extstatdial.agi completed, returning 0
    -- Executing [11@from-isdn:2] GotoIf("CAPI/ISDN1#02/11-ffe", "0?3:default|17|1") in new stack
    -- Goto (default,17,1)
    -- Executing [17@default:1] Dial("CAPI/ISDN1#02/11-ffe", "SIP/17") in new stack
    -- Called 17

obwohl da der 11er nicht inuse oder busy ist/war.

PS.: Natürlich hab ich alle Parameter auf meinen Asterisk eingestellt ;)
 
Zuletzt bearbeitet:
Hm, OK, danke fürs ausprobieren. Ich konfigurier mir mal einen Client ohne Realtime und schau mir das nochmal an.
Bei mir kommt im Moment immer 0 (idle), auch wenn ich telefoniere, das AMI kommt mit Realtime irgendwie nicht ganz klar.

Ansonsten funktioniert der ExtensionState über AMI bei Dir, oder?

Vielleicht kommt bei Dir nicht "Status: 0", sondern ein leicht anderes Ergebnis.
Könntest Du hier die Zeile errlog... nach dem if einbauen und das Log nochmal posten?

Code:
foreach ($amiarray AS $amival) {
    if($amival=="Status: 0") $extstatus="idle";
    errlog($amival);         # <= diese Zeile einbauen
  }

Vorausgesetzt Du hast noch Lust, sonst lassen wir's einfach.

Rentier
 
Ich teste gerne im Namen des Fortschrittes ;)

Aber das hat keine Änderung im Logfile gebracht.
Sorry.
 
Das bedeutet dann, dass Du vom AMI scheinbar keine Rückmeldung für die "Action: ExtensionState" bekommst. Ich mach mal ein paar Debug-Ausgaben in das AGI rein und teste das bei mir nochmal durch.

Weißt Du was mich ein wenig wundert. Ich hab im ganzen Internet wirklich nirgends irgendeinen Ansatz gefunden, wie man dieses Problem sonst noch anpacken könnte. Dabei ist das doch eigentlich ein Problem, das durchaus mehrere Nutzer betreffen könnte.

Na dann frohe Weihnachten.

Rentier
 
Das hab ich mir auch gedacht. Denn es ist doch sicher ein Problem, das (fast) jeder Benutzer haben könnte. Such(t)e auch schon seite über einem Jahr nach einer Lösung...

Aber so ist es halt. Bin heute noch den ganzen Tag in der Firma und kann daher bis 17 Uhr testen ;)

LG
Joe
 
Zuletzt bearbeitet:
Nachdem ich feststellen musste, dass AMI mit Realtime scheinbar nicht klar kommt, hab ich mir zum Test zwei "normale" SIP User eingerichtet. Damit funktioniert das AGI bei mir jetzt wunderbar. Wenn 11 frei ist, wird 11 gerufen, sonst 17. Ich hab das AGI oben entsprechend umgebaut, damit man im Log-File etwas ausführlicher sieht, was da bei Dir passiert.

Rentier
 
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.