mit Asterisk ausgehende Nummer Fallweise setzen?

smartweb

Neuer User
Mitglied seit
17 Mrz 2007
Beiträge
7
Punkte für Reaktionen
0
Punkte
0
Hallo,


mein Asterisk läuft und funktioniert einwandfrei, jedoch habe ich ein Problem:


Ich will, dass Asterisk bei rauswählen je nach dem welcher interner Teilnehmer den Anruf initiiert hat, verschiedene abgehende Callerid(num)'s setzen.

d.h. z.B.

Intern 201 soll abgehend 1234 präsentieren
Intern 202 soll abgehend 2345 präsentieren
Intern 203 soll abgehend 3456 präsentieren... etc

Gibt es die Möglichkeit, mit IF oder sonst wie, die Callerid des intern Anrufenden auszulesen und danach die Callerid zu setzen?

Derzeit setze ich für alle ausgehenden Telefonate die Nummer so:

[out]

exten => _0XX.,1,set(CALLERID(num)=700xxxxxxxx)
exten => _0XX.,2,Dial(${TE}/${EXTEN}) ; ISDN out


Hat jemand einen Gedankenanstoss für mich?
 
Für genau diesen Zweck habe ich mir ein kleines AGI-Skript gebaut. Achtung: Quick&Dirty :cool:
Das Skript schaut in der datei users.conf (Asterisk 1.4; für 1.2 das Skript für sip.conf ändern) nach der Variablen extcallerid und setzt den entsprechenden Wert als CALLERID(num).
Code:
extcallerid = 5
z.B. für die CALLERID 5.

/var/lib/asterisk/agi-bin/set-outgoing-callerid.php
PHP:
#!/usr/bin/php
<?
/*************************************************************
Lookup for outgoing ISDN callerid in users.conf
**************************************************************/

function read_agi_vars ()
{
  $stdin = fopen('php://stdin', 'r');
  while (!feof($stdin)) {
    $temp = fgets($stdin);
    $temp = str_replace("\n","",$temp);
    $s = explode(":",$temp);
    $agivar[$s[0]] = trim($s[1]);
    if (($temp == "") || ($temp == "\n")) {
       break;
    }
  }
  fclose($stdin);
  return $agivar;
}

// main program
$stdout = fopen('php://stdout', 'w');
$USERS = "/etc/asterisk/users.conf";
$extCID = "65";
$agivar = read_agi_vars();

// read command line arguments
if (count($argv) > 1) {
  $agivar[agi_callerid] = $argv[1];
}

if ($agivar[agi_callerid] != "") {
  # parse users.conf
  $users_array = parse_ini_file($USERS, TRUE);
  if ( isset($users_array[$agivar[agi_callerid]]["extcallerid"]) ) {
    $extCID = $users_array[$agivar[agi_callerid]]["extcallerid"];
  }
  fputs($stdout, "SET VARIABLE CALLERID(num) $extCID\n");
CALLERID(num) $extCID\n");
}
fclose($stdout);
?>
dann in der extensions.conf im out-context
PHP:
exten = _0X.,1,AGI(set-outgoing-callerid.php,${CALLERID(num)})
exten = _0X.,2,Dial(...
Natürlich alles ohne Gewähr .

Gruss,
Sachmet.
 
Danke für den Denkanstoss - Dein Script macht bei mir jedoch gar nichts - mal abgesehn von den Syntax-Fehlern :)

Aber die Idee das über AGI zu lösen hat mich schon weiter gebracht!

Vielen Dank
 
Das soll auch nur bei mir funktionieren :) - und dir als Denkanstoss dienen, wie du ja auch bemerkt hast.

Syntaxfehler? Naja egal, danach suche ich jeweils nur, wenns nicht so funktioniert, wie es soll ;)

Gruss,
Sachmet.
 
Also der Fehler den es bei mir geworfen hat ist hier:

fputs($stdout, "SET VARIABLE CALLERID(num) $extCID\n");
CALLERID(num) $extCIDn");

- kann aber auch nur ein Copy&Paste Fehler sein..

mein Script macht ganz simpel nur Folgendes:

Code:
#!/usr/bin/perl

$num = <STDIN>;
chop($num);

open(CIDFILE,"<outgoing.txt");
while (<CIDFILE>) {
($cid, $out) = split(/:/,$_);

if ($cid == $num) { print "SET VARIABLE CALLERID(num) $out\n"; $printed = 1;}

}
if ($printed != 1)
{
print "SET VARIABLE CALLERID(num) 700xxxxxxxx\n"; # default setzen
}
In dem Textfile sind dann die entsprechenden internen und ausgehendn Callerids einfach nur durch : getrennt.

Nochmals Danke :)
 
Du könntest es auch so machen, das Du jedem Endgerät einen eigenen Kontext zum Rauswählen gibst und die restlichen Regeln inkludierst. Ein Beispiel dazu findest Du in Betateilchens Kurs.
 
Nimm doch einfach die Asterisk-internen-Features dafür, bevor Du mit AGI loslegst. Man kann in der Extension einem Eintrag auch ein Matching des "Wählenden" einschalten, indem man an die Extension-Regel ein "/<Nummer>" angibt. In Deinem Fall (und so in etwa habe ich das gebaut) würde das so aussehn:

[out]
; Default-Callerid, wenn der Absender nicht gesondert angegeben wurde
exten => _0XX.,1,set(CALLERID(num)=700xxxxxxxx)
; Matching von den individuellen Teilnehmern
exten => _0XX./201,1,set(CALLERID(num)=1234)
exten => _0XX./202,1,set(CALLERID(num)=2345)
exten => _0XX./203,1,set(CALLERID(num)=3456)
; Wählen
exten => _0XX.,2,Dial(${TE}/${EXTEN}) ; ISDN out

Da die Absender-Matchings alle "eindeutig" sind, ist auch bei allen die Extension-Prio dieselbe (es kann immer nur eins von denen gematched werden).

(Das Rufnummernmatching klappt auch mit eingehenden Rufen. So habe ich einen DISA-Zugang in den Asterisk wenn ich mit dem Mobiltelefon auf einer bestimmten Extension anrufe.)
 
Hi,

Danke, ich glaube das ist genau was ich wollte - blos habe ich das anscheined in der Doku überlesen!

Vielen Dank.
 
Servus,

ich stehe gerade vor dem gleichen Problem. So ganz klappt das leider noch nicht. Was mache ich falsch?

exten => _X.,1,Set(CALLERID(number)=SIPID)
exten => _X.,2,Set(CALLERID(name)=1234)
exten => _X./100,2,Set(CALLERID(name)=100)
exten => _X./200,2,Set(CALLERID(name)=200)
exten => _X.,3,Dial(SIP/${EXTEN}@111111,60,trg)
exten => _X.,4,Hangup

Vielen Dank schonmal
Migagi
 
Du hast wirklich nicht bei der Callerid "name" und "number" vertauscht?
 
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.